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

  • Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl+F5 или Ctrl+R (⌘+R на Mac)
  • Google Chrome: Нажмите Ctrl+Shift+R (⌘+Shift+R на Mac)
  • Internet Explorer / Edge: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl+F5
  • Opera: Нажмите Ctrl+F5.
/******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId]) {
/******/ 			return installedModules[moduleId].exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			i: moduleId,
/******/ 			l: false,
/******/ 			exports: {}
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.l = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;
/******/
/******/ 	// define getter function for harmony exports
/******/ 	__webpack_require__.d = function(exports, name, getter) {
/******/ 		if(!__webpack_require__.o(exports, name)) {
/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ 		}
/******/ 	};
/******/
/******/ 	// define __esModule on exports
/******/ 	__webpack_require__.r = function(exports) {
/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 		}
/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
/******/ 	};
/******/
/******/ 	// create a fake namespace object
/******/ 	// mode & 1: value is a module id, require it
/******/ 	// mode & 2: merge all properties of value into the ns
/******/ 	// mode & 4: return value when already ns object
/******/ 	// mode & 8|1: behave like require
/******/ 	__webpack_require__.t = function(value, mode) {
/******/ 		if(mode & 1) value = __webpack_require__(value);
/******/ 		if(mode & 8) return value;
/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ 		var ns = Object.create(null);
/******/ 		__webpack_require__.r(ns);
/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ 		return ns;
/******/ 	};
/******/
/******/ 	// getDefaultExport function for compatibility with non-harmony modules
/******/ 	__webpack_require__.n = function(module) {
/******/ 		var getter = module && module.__esModule ?
/******/ 			function getDefault() { return module['default']; } :
/******/ 			function getModuleExports() { return module; };
/******/ 		__webpack_require__.d(getter, 'a', getter);
/******/ 		return getter;
/******/ 	};
/******/
/******/ 	// Object.prototype.hasOwnProperty.call
/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";
/******/
/******/
/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(__webpack_require__.s = 0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {

module.exports = __webpack_require__(1);


/***/ }),
/* 1 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _lib_mediawiki_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
/* harmony import */ var _lib_wikitext_section_editor__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);
/* harmony import */ var _lib_ui_components_pagination__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6);
/* harmony import */ var _lib_ui_components_listing_item__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7);
/* harmony import */ var _lib_ui_components_search_bar__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(16);
/* harmony import */ var _lib_async_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(19);
/* harmony import */ var _lib_wikivoyage_api__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(20);
/* harmony import */ var _lib_cultural_editor_serializer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(21);
/* harmony import */ var _lib_mediawiki_page_wikitext__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(23);
/* harmony import */ var _lib_download_content__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(25);
/* harmony import */ var _lib_ui_components_export_panel__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(26);
/* harmony import */ var _lib_array_utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(18);
/* harmony import */ var _lib_commons_api__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(27);
/* harmony import */ var _lib_string_utils__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(5);
/* harmony import */ var _lib_commons_images_loader__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(28);
/* harmony import */ var _lib_cultural_gallery_images__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(29);
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }

function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

















/**
 * TODO
 *
 * 1. Integration with missing images gadget.
 * 2. Show loading/saving progress.
 * 3. Complete listing template implementation.
 * 4. Object passport document.
 * 5. Advanced gallery.
 * 6. Better compact view.
 * 7. Captcha handling.
 * 8. XSS.
 * 9. Edit then go to another page.
 * 10. Save all.
 * 11. Leave warning.
 * 12. Complete GPX, JSON, CSV export.
 * 13. Map.
 */

$(document).ready(function () {
  var reportFatalError = function reportFatalError(errorText) {
    var gadgetElement = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
    window.console.error(errorText);

    if (gadgetElement) {
      var errorElement = $('<div style="color: red;">').text(errorText);
      gadgetElement.append(errorElement);
    }
  };

  var initGadget = function initGadget(gadgetElement) {
    var settingsElement = gadgetElement.children('.gadget-heritage-list-settings');

    if (settingsElement.length === 0) {
      reportFatalError("Heritage gadget error: settings are not specified.", gadgetElement);
      return;
    }

    if (settingsElement.length > 1) {
      reportFatalError("Heritage gadget error: multiple settings elements are specified.", gadgetElement);
      return;
    }

    var gadgetSettings = {};

    try {
      gadgetSettings = JSON.parse(settingsElement.text());
    } catch (e) {
      reportFatalError("Heritage gadget error: settings element contains invalid JSON.", gadgetElement);
      return;
    }

    var gadgetContentElement = $('<div class="gadget-heritage-list-content">');
    gadgetElement.append(gadgetContentElement);
    showGadget(gadgetContentElement, gadgetSettings);
    var fallbackElements = gadgetElement.find('.gadget-heritage-list-disabled');
    fallbackElements.hide();
  };

  var HeritageListGadgetState = function HeritageListGadgetState() {
    _classCallCheck(this, HeritageListGadgetState);

    this.allListingItems = [];
    this.currentListingItems = [];
    this.filterListingItems = [];
    this.page = 0;
    this.itemsPerPage = 10;
    this.view = _lib_ui_components_search_bar__WEBPACK_IMPORTED_MODULE_4__["SearchConstants"].VIEW_FULL;
    this.sortBy = _lib_ui_components_search_bar__WEBPACK_IMPORTED_MODULE_4__["SortConstants"].DEFAULT;
    this.filter = new _lib_ui_components_search_bar__WEBPACK_IMPORTED_MODULE_4__["SearchFilter"]('', '', _lib_ui_components_search_bar__WEBPACK_IMPORTED_MODULE_4__["SearchConstants"].PHOTO_ANY, _lib_ui_components_search_bar__WEBPACK_IMPORTED_MODULE_4__["SearchConstants"].COORDINATES_ANY, '', '', '');
  };

  var ListingItem = function ListingItem(data, page, index) {
    _classCallCheck(this, ListingItem);

    this.data = data;
    this.page = page;
    this.index = index;
  };

  var HeritageListGadget =
  /*#__PURE__*/
  function () {
    function HeritageListGadget(rootElement) {
      var _this = this;

      _classCallCheck(this, HeritageListGadget);

      this.rootElement = rootElement;
      this.state = new HeritageListGadgetState();
      this.searchBar = new _lib_ui_components_search_bar__WEBPACK_IMPORTED_MODULE_4__["SearchBar"](function (filter) {
        return _this.updateFilterListingItems(filter);
      }, function (itemsOnPage) {
        return _this.updateItemsOnPage(itemsOnPage);
      }, function (view) {
        return _this.updateView(view);
      }, function (sortBy) {
        return _this.updateSort(sortBy);
      });
      this.dataElement = $('<div>');
    }

    _createClass(HeritageListGadget, [{
      key: "loadData",
      value: function loadData(pages) {
        var _this2 = this;

        var api = new _lib_mediawiki_api__WEBPACK_IMPORTED_MODULE_0__["MediawikiApi"]();

        var loadPageListings = function loadPageListings(page, onSuccess) {
          api.getPageText(page, function (text) {
            var listings = [];
            var sectionEditor = new _lib_wikitext_section_editor__WEBPACK_IMPORTED_MODULE_1__["WikitextSectionEditor"](text, 'monument');
            var listingIndex = 0;

            while (true) {
              var listingData = sectionEditor.getListingData(listingIndex);

              if (!listingData) {
                break;
              }

              var listingItem = new ListingItem(listingData, page, listingIndex);
              listings.push(listingItem);
              listingIndex++;
            }

            onSuccess(listings);
          }, function (reason) {
            window.console.error(reason);
            onSuccess([]);
          });
        };

        _lib_async_utils__WEBPACK_IMPORTED_MODULE_5__["AsyncUtils"].runSequence(pages.map(function (page) {
          return function (onSuccess) {
            return loadPageListings(page, onSuccess);
          };
        }), function (pagesListingItems) {
          var allListingItems = pagesListingItems.reduce(function (pageListingItems, acc) {
            return pageListingItems.concat(acc);
          }, []);
          _this2.state.allListingItems = allListingItems;
          _this2.state.filterListingItems = allListingItems;

          _this2.updateCurrentListingItems();
        });
      }
    }, {
      key: "updateCurrentListingItems",
      value: function updateCurrentListingItems() {
        if (this.state.itemsPerPage !== 0) {
          this.state.currentListingItems = this.state.filterListingItems.slice(this.state.page * this.state.itemsPerPage, (this.state.page + 1) * this.state.itemsPerPage);
        } else {
          this.state.currentListingItems = this.state.filterListingItems;
        }

        this.renderData();
      }
    }, {
      key: "updateView",
      value: function updateView(view) {
        this.state.view = view;
        this.updateCurrentListingItems();
      }
    }, {
      key: "updateItemsOnPage",
      value: function updateItemsOnPage(itemsOnPage) {
        this.state.itemsPerPage = itemsOnPage;
        this.state.page = 0;
        this.updateCurrentListingItems();
      }
    }, {
      key: "updateSort",
      value: function updateSort(sortBy) {
        this.state.sortBy = sortBy;
        this.updateFilteredSortedListingItems();
        this.updateCurrentListingItems();
      }
    }, {
      key: "updateFilterListingItems",
      value: function updateFilterListingItems(filter) {
        this.state.filter = filter;
        this.state.page = 0;
        this.updateFilteredSortedListingItems();
        this.updateCurrentListingItems();
      }
    }, {
      key: "updateFilteredSortedListingItems",
      value: function updateFilteredSortedListingItems() {
        this.state.filterListingItems = this.applySort(this.applyFilter(this.state.allListingItems, this.state.filter), this.state.sortBy);
      }
    }, {
      key: "applySort",
      value: function applySort(items, sortBy) {
        var sortedItems = items.concat();

        if (_lib_array_utils__WEBPACK_IMPORTED_MODULE_11__["ArrayUtils"].inArray(sortBy, [_lib_ui_components_search_bar__WEBPACK_IMPORTED_MODULE_4__["SortConstants"].NAME, _lib_ui_components_search_bar__WEBPACK_IMPORTED_MODULE_4__["SortConstants"].ADDRESS, _lib_ui_components_search_bar__WEBPACK_IMPORTED_MODULE_4__["SortConstants"].TYPE])) {
          sortedItems.sort(function (item1, item2) {
            if (sortBy === _lib_ui_components_search_bar__WEBPACK_IMPORTED_MODULE_4__["SortConstants"].NAME) {
              return item1.data.name.localeCompare(item2.data.name);
            } else if (sortBy === _lib_ui_components_search_bar__WEBPACK_IMPORTED_MODULE_4__["SortConstants"].ADDRESS) {
              return item1.data.address.localeCompare(item2.data.address);
            } else if (sortBy === _lib_ui_components_search_bar__WEBPACK_IMPORTED_MODULE_4__["SortConstants"].TYPE) {
              return item1.data.type.localeCompare(item2.data.type);
            }
          });
        }

        return sortedItems;
      }
    }, {
      key: "applyFilter",
      value: function applyFilter(items, filter) {
        var searchDescription = filter.getSearchDescription().toLowerCase();
        var searchAddress = filter.getSearchAddress().toLowerCase();
        var photo = filter.getPhoto();
        var coordinates = filter.getCoordinates();
        var type = filter.getType();
        var style = filter.getStyle();
        var protection = filter.getProtection();
        return items.filter(function (item) {
          return (searchDescription === '' || item.data.name.toLowerCase().indexOf(searchDescription) !== -1) && (searchAddress === '' || item.data.address.toLowerCase().indexOf(searchAddress) !== -1) && (photo === _lib_ui_components_search_bar__WEBPACK_IMPORTED_MODULE_4__["SearchConstants"].PHOTO_ANY || photo === _lib_ui_components_search_bar__WEBPACK_IMPORTED_MODULE_4__["SearchConstants"].PHOTO_YES && item.data.image || photo === _lib_ui_components_search_bar__WEBPACK_IMPORTED_MODULE_4__["SearchConstants"].PHOTO_NO && !item.data.image) && (coordinates === _lib_ui_components_search_bar__WEBPACK_IMPORTED_MODULE_4__["SearchConstants"].COORDINATES_ANY || coordinates === _lib_ui_components_search_bar__WEBPACK_IMPORTED_MODULE_4__["SearchConstants"].COORDINATES_PRECISE && item.data.lat && item.data.long && item.data.precise === 'yes' || coordinates === _lib_ui_components_search_bar__WEBPACK_IMPORTED_MODULE_4__["SearchConstants"].COORDINATES_NOT_PRECISE && item.data.lat && item.data.long && item.data.precise !== 'yes' || coordinates === _lib_ui_components_search_bar__WEBPACK_IMPORTED_MODULE_4__["SearchConstants"].COORDINATES_EXISTS && item.data.lat && item.data.long || coordinates === _lib_ui_components_search_bar__WEBPACK_IMPORTED_MODULE_4__["SearchConstants"].COORDINATES_NO && (!item.data.lat || !item.data.long)) && (!type || item.data.type === type) && (!style || item.data.style === style) && (!protection || item.data.protection === protection);
        });
      }
    }, {
      key: "render",
      value: function render() {
        this.rootElement.empty();
        this.rootElement.append(this.searchBar.render());
        this.rootElement.append(this.dataElement);
        this.renderData();
      }
    }, {
      key: "exportJson",
      value: function exportJson() {
        var items = this.state.filterListingItems.map(function (item) {
          return item.data;
        });
        Object(_lib_download_content__WEBPACK_IMPORTED_MODULE_9__["downloadContent"])('listings.json', JSON.stringify(items, null, 2));
      }
    }, {
      key: "exportGpx",
      value: function exportGpx() {
        var items = this.state.filterListingItems.map(function (item) {
          return item.data;
        });
        var header = '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>\n' + '<gpx version="1.1" creator="Wikivoyage"\n' + '  xmlns="http://www.topografix.com/GPX/1/1"\n' + '  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n' + '  xsi:schemaLocation="http://www.topografix.com/GPX/1/1 ' + 'http://www.topografix.com/GPX/1/1/gpx.xsd">\n';
        var footer = '\n</gpx>'; // TODO proper escaping

        var data = items.filter(function (item) {
          return item.lat && item.long;
        }).map(function (item) {
          return '  <wpt lat="' + item.lat + '" lon="' + item.long + '">\n' + '    <name>' + item.name + '</name>\n' + '    <desc>' + item.address + '</desc>\n' + '  </wpt>';
        }).join("\n");
        Object(_lib_download_content__WEBPACK_IMPORTED_MODULE_9__["downloadContent"])('listings.gpx', header + data + footer);
      }
    }, {
      key: "onSaveListing",
      value: function onSaveListing(page, listingComponent, listingIndex, data, changesDescription, onSuccess) {
        var newListingText = _lib_cultural_editor_serializer__WEBPACK_IMPORTED_MODULE_7__["CulturalEditorListingSerializer"].serializeListingData(data);
        var editor = this;
        var api = new _lib_mediawiki_api__WEBPACK_IMPORTED_MODULE_0__["MediawikiApi"]();
        api.getPageText(page, function (text) {
          var sectionEditor = new _lib_wikitext_section_editor__WEBPACK_IMPORTED_MODULE_1__["WikitextSectionEditor"](text, 'monument');
          var newPageText = sectionEditor.getSectionTextWithReplacedListing(listingIndex, newListingText);
          var changesDescriptionText = 'Обновлен объект "' + data.name + '"';

          if (changesDescription.getDescription()) {
            changesDescriptionText += ' - ' + changesDescription.getDescription();
          }

          _lib_mediawiki_page_wikitext__WEBPACK_IMPORTED_MODULE_8__["MediaWikiPageWikitext"].saveSectionWikitext(null, newPageText, changesDescriptionText, changesDescription.getIsMinor(), null, null, function () {
            editor.loadImageThumb(listingComponent, function () {
              return onSuccess();
            }, true, data.image);
          }, function () {
            alert('Failed to save listing');
          }, function () {
            alert('Captcha request');
          }, page);
        });
      }
    }, {
      key: "onLoadGallery",
      value: function onLoadGallery(listingItem, onSuccess) {
        _lib_commons_images_loader__WEBPACK_IMPORTED_MODULE_14__["CommonsImagesLoader"].loadImagesFromWLMCategory(listingItem.data.knid, function (wlmImages) {
          _lib_commons_images_loader__WEBPACK_IMPORTED_MODULE_14__["CommonsImagesLoader"].loadImagesFromCommonsCategory(listingItem.data.commonscat, function (commonsImages) {
            listingItem.galleryImages = new _lib_cultural_gallery_images__WEBPACK_IMPORTED_MODULE_15__["CulturalGalleryImages"](wlmImages, commonsImages);
            onSuccess();
          });
        });
      }
    }, {
      key: "loadImageThumb",
      value: function loadImageThumb(listingComponent, onSuccess, force, newImage) {
        var image = newImage ? newImage : listingComponent.listingItem.data.image;

        if (image && (!listingComponent.listingItem.imageThumb || force)) {
          _lib_wikivoyage_api__WEBPACK_IMPORTED_MODULE_6__["WikivoyageApi"].getImageInfo('File:' + image, function (result) {
            listingComponent.listingItem.imageThumb = result.thumb;
            listingComponent.onImageThumbUpdated();
            onSuccess();
          }, function () {
            listingComponent.onImageThumbUpdated();
            onSuccess();
          });
        } else {
          listingComponent.onImageThumbUpdated();
          onSuccess();
        }
      }
    }, {
      key: "renderData",
      value: function renderData() {
        var _this3 = this,
            _this$dataElement,
            _this$dataElement2;

        this.dataElement.empty();
        var exportPanel = new _lib_ui_components_export_panel__WEBPACK_IMPORTED_MODULE_10__["ExportPanel"](function () {
          return _this3.exportJson();
        }, function () {
          return _this3.exportGpx();
        });
        this.dataElement.append(exportPanel.render());
        var topPagination = this.createPagination(false);
        var bottomPagination = this.createPagination(true);

        (_this$dataElement = this.dataElement).append.apply(_this$dataElement, _toConsumableArray(topPagination.render()));

        var listingComponents = [];
        this.state.currentListingItems.forEach(function (listingItem) {
          var _this3$dataElement;

          var listingComponent = new _lib_ui_components_listing_item__WEBPACK_IMPORTED_MODULE_3__["ListingItemComponent"](listingItem, _this3.state.view, function () {
            return _this3.onSaveListing.apply(_this3, arguments);
          }, _this3.onLoadGallery);

          (_this3$dataElement = _this3.dataElement).append.apply(_this3$dataElement, _toConsumableArray(listingComponent.render()));

          listingComponents.push(listingComponent);
        });
        _lib_async_utils__WEBPACK_IMPORTED_MODULE_5__["AsyncUtils"].runSequence(listingComponents.map(function (listingComponent) {
          return function (onSuccess) {
            return _this3.loadImageThumb(listingComponent, onSuccess);
          };
        }));
        var categories = [];
        categories = categories.concat(this.state.currentListingItems.map(function (item) {
          return 'Category:WLM/' + item.data.knid;
        }));
        categories = categories.concat(this.state.currentListingItems.map(function (item) {
          return item.data.commonscat;
        }).filter(function (commonscatValue) {
          return _lib_string_utils__WEBPACK_IMPORTED_MODULE_13__["StringUtils"].emptyToString(commonscatValue) !== '';
        }).map(function (commonscatValue) {
          return 'Category:' + commonscatValue;
        }));
        _lib_commons_api__WEBPACK_IMPORTED_MODULE_12__["CommonsApi"].countCategoriesFiles(categories, function (categoriesWithImages) {
          var filesCountByCategory = {};
          categoriesWithImages.forEach(function (item) {
            filesCountByCategory[item.category] = item.files;
          });

          var getCategoryFilesCount = function getCategoryFilesCount(category) {
            if (_lib_string_utils__WEBPACK_IMPORTED_MODULE_13__["StringUtils"].emptyToString(category) === '') {
              return 0;
            }

            var filesCount = filesCountByCategory[category];
            return filesCount !== undefined ? filesCount : 0;
          };

          listingComponents.forEach(function (listingComponent) {
            listingComponent.listingItem.imagesCount = getCategoryFilesCount('Category:WLM/' + listingComponent.listingItem.data.knid) + getCategoryFilesCount('Category:' + _lib_string_utils__WEBPACK_IMPORTED_MODULE_13__["StringUtils"].emptyToString(listingComponent.listingItem.data.commonscat).replace(/_'/g, ' '));
            listingComponent.onUpdateImageCount();
          });
        });

        (_this$dataElement2 = this.dataElement).append.apply(_this$dataElement2, _toConsumableArray(bottomPagination.render()));
      }
    }, {
      key: "createPagination",
      value: function createPagination(scrollToTop) {
        var _this4 = this;

        return new _lib_ui_components_pagination__WEBPACK_IMPORTED_MODULE_2__["PaginationComponent"](this.state.filterListingItems.length, this.state.itemsPerPage, this.state.page, function (pageNumber) {
          _this4.state.page = pageNumber;

          _this4.updateCurrentListingItems();

          _this4.renderData();

          if (scrollToTop) {
            $("html, body").animate({
              scrollTop: 0
            }, "slow");
          }
        });
      }
    }]);

    return HeritageListGadget;
  }();

  var showGadget = function showGadget(gadgetContentElement, gadgetSettings) {
    var gadget = new HeritageListGadget(gadgetContentElement);
    gadget.render();
    gadget.loadData(gadgetSettings.pages);
  };

  $('.gadget-heritage-list').each(function (index, gadgetElement) {
    return initGadget($(gadgetElement));
  });
});

/***/ }),
/* 2 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MediawikiApi", function() { return MediawikiApi; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var MediawikiApi =
/*#__PURE__*/
function () {
  function MediawikiApi() {
    _classCallCheck(this, MediawikiApi);
  }

  _createClass(MediawikiApi, [{
    key: "getPageText",
    value: function getPageText(pageUrl, onSuccess, onError) {
      $.ajax({
        // TODO ability to specify URL
        url: mw.util.wikiScript(''),
        data: {
          title: pageUrl,
          action: 'raw'
        },
        cache: false
      }).done(function (data) {
        onSuccess(data);
      }).fail(function (jqXHR, textStatus, errorThrown) {
        onError(new Error('Ошибка при получении исходного вики-текста статьи: ' + textStatus + ' ' + errorThrown));
      });
    }
  }]);

  return MediawikiApi;
}();

/***/ }),
/* 3 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WikitextSectionEditor", function() { return WikitextSectionEditor; });
/* harmony import */ var _wikitext_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4);
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }


var WikitextSectionEditor =
/*#__PURE__*/
function () {
  function WikitextSectionEditor(sectionText, listingName) {
    _classCallCheck(this, WikitextSectionEditor);

    this._sectionText = sectionText;
    this._listingName = listingName;
    this._commentReplacements = {};

    this._stripComments();
  }

  _createClass(WikitextSectionEditor, [{
    key: "getListingData",
    value: function getListingData(listingIndex) {
      var listingText = _wikitext_parser__WEBPACK_IMPORTED_MODULE_0__["WikitextParser"].getListingWikitextBraces(this._sectionText, this._listingName, listingIndex);

      if (!listingText) {
        return null;
      }

      var listingData = _wikitext_parser__WEBPACK_IMPORTED_MODULE_0__["WikitextParser"].wikiTextToListing(listingText);

      for (var key in listingData) {
        if (!listingData.hasOwnProperty(key)) {
          continue;
        }

        listingData[key] = this._restoreComments(listingData[key]);
      }

      return listingData;
    }
  }, {
    key: "getSectionTextWithReplacedListing",
    value: function getSectionTextWithReplacedListing(listingIndex, newListingText) {
      var oldListingText = _wikitext_parser__WEBPACK_IMPORTED_MODULE_0__["WikitextParser"].getListingWikitextBraces(this._sectionText, this._listingName, listingIndex);
      var result = this._sectionText;
      result = result.replace(oldListingText, newListingText);
      result = this._restoreComments(result);
      return result;
    }
  }, {
    key: "getSectionTextWithAddedListing",
    value: function getSectionTextWithAddedListing(newListingText) {
      var result = this._sectionText;
      var index = result.indexOf('{{footer');

      if (index > 0) {
        result = result.substr(0, index) + '\n' + newListingText + '\n' + result.substr(index);
      } else {
        result += '\n' + newListingText;
      }

      result = this._restoreComments(result);
      return result;
    }
    /**
     * Commented-out listings can result in the wrong listing being edited, so
     * strip out any comments and replace them with placeholders that can be
     * restored prior to saving changes.
     */

  }, {
    key: "_stripComments",
    value: function _stripComments() {
      var comments = this._sectionText.match(/<!--[\s\S]*?-->/mig);

      if (comments !== null) {
        for (var i = 0; i < comments.length; i++) {
          var comment = comments[i];
          var rep = '<<<COMMENT' + i + '>>>';
          this._sectionText = this._sectionText.replace(comment, rep);
          this._commentReplacements[rep] = comment;
        }
      }
    }
    /**
     * Search the text provided, and if it contains any text that was
     * previously stripped out for replacement purposes, restore it.
     */

  }, {
    key: "_restoreComments",
    value: function _restoreComments(sectionText) {
      for (var key in this._commentReplacements) {
        var val = this._commentReplacements[key];
        sectionText = sectionText.replace(key, val);
      }

      return sectionText;
    }
  }]);

  return WikitextSectionEditor;
}();

/***/ }),
/* 4 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WikitextParser", function() { return WikitextParser; });
/* harmony import */ var _string_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5);

var WikitextParser = {
  /**
   * Given a listing index, return the full wikitext for that listing
   * ("{{listing|key=value|...}}"). An index of 0 returns the first listing
   * template invocation, 1 returns the second, etc.
   */
  getListingWikitextBraces: function getListingWikitextBraces(wikitext, listingName, listingIndex) {
    // find the listing wikitext that matches the same index as the listing index
    var listingRegex = new RegExp('{{\\s*(' + listingName + ')(\\s|\\|)', 'ig'); // look through all matches for "{{listing|see|do...}}" within the section
    // wikitext, returning the nth match, where 'n' is equal to the index of the
    // edit link that was clicked

    var listingSyntax, regexResult, listingMatchIndex;

    for (var i = 0; i <= listingIndex; i++) {
      regexResult = listingRegex.exec(wikitext);

      if (!regexResult) {
        return null;
      }

      listingMatchIndex = regexResult.index;
      listingSyntax = regexResult[0];
    } // listings may contain nested templates, so step through all section
    // text after the matched text to find MATCHING closing braces
    // the first two braces are matched by the listing regex and already
    // captured in the listingSyntax variable


    var curlyBraceCount = 2;
    var endPos = wikitext.length;
    var startPos = listingMatchIndex + listingSyntax.length;
    var matchFound = false;

    for (var j = startPos; j < endPos; j++) {
      if (wikitext[j] === '{') {
        ++curlyBraceCount;
      } else if (wikitext[j] === '}') {
        --curlyBraceCount;
      }

      if (curlyBraceCount === 0 && j + 1 < endPos) {
        listingSyntax = wikitext.substring(listingMatchIndex, j + 1);
        matchFound = true;
        break;
      }
    }

    if (!matchFound) {
      listingSyntax = wikitext.substring(listingMatchIndex);
    }

    return _string_utils__WEBPACK_IMPORTED_MODULE_0__["StringUtils"].trim(listingSyntax);
  },

  /**
   * Convert raw wiki listing syntax into a mapping of key-value pairs
   * corresponding to the listing template parameters.
   */
  wikiTextToListing: function wikiTextToListing(wikitext) {
    // remove the trailing braces if there are some
    for (var i = 0; i < 2; i++) {
      if (wikitext[wikitext.length - 1] === '}') {
        wikitext = wikitext.slice(0, -1);
      }
    }

    var listingData = {};
    var lastKey;
    var listParams = WikitextParser.listingTemplateToParamsArray(wikitext);

    for (var _i = 1; _i < listParams.length; _i++) {
      var param = listParams[_i];
      var index = param.indexOf('=');

      if (index > 0) {
        // param is of the form key=value
        var key = _string_utils__WEBPACK_IMPORTED_MODULE_0__["StringUtils"].trim(param.substr(0, index));
        listingData[key] = _string_utils__WEBPACK_IMPORTED_MODULE_0__["StringUtils"].trim(param.substr(index + 1));
        lastKey = key;
      } else if (listingData[lastKey].length) {
        // there was a pipe character within a param value, such as
        // "key=value1|value2", so just append to the previous param
        listingData[lastKey] += '|' + param;
      }
    }

    return listingData;
  },

  /**
   * Split the raw template wikitext into an array of params. The pipe
   * symbol delimits template params, but this method will also inspect the
   * description to deal with nested templates or wikilinks that might contain
   * pipe characters that should not be used as delimiters.
   */
  listingTemplateToParamsArray: function listingTemplateToParamsArray(wikitext) {
    var results = [];
    var paramValue = '';
    var pos = 0;

    while (pos < wikitext.length) {
      var remainingString = wikitext.substr(pos); // check for a nested template or wikilink

      var patternMatch = WikitextParser.findPatternMatch(remainingString, "{{", "}}");

      if (patternMatch.length === 0) {
        patternMatch = WikitextParser.findPatternMatch(remainingString, "[[", "]]");
      }

      if (patternMatch.length > 0) {
        paramValue += patternMatch;
        pos += patternMatch.length;
      } else if (wikitext.charAt(pos) === '|') {
        // delimiter - push the previous param and move on to the next
        results.push(paramValue);
        paramValue = '';
        pos++;
      } else {
        // append the character to the param value being built
        paramValue += wikitext.charAt(pos);
        pos++;
      }
    }

    if (paramValue.length > 0) {
      // append the last param value
      results.push(paramValue);
    }

    return results;
  },

  /**
   * Utility method for finding a matching end pattern for a specified start
   * pattern, including nesting.  The specified value must start with the
   * start value, otherwise an empty string will be returned.
   */
  findPatternMatch: function findPatternMatch(value, startPattern, endPattern) {
    var matchString = '';
    var startRegex = new RegExp('^' + WikitextParser.replaceSpecial(startPattern), 'i');

    if (startRegex.test(value)) {
      var endRegex = new RegExp('^' + WikitextParser.replaceSpecial(endPattern), 'i');
      var matchCount = 1;

      for (var i = startPattern.length; i < value.length; i++) {
        var remainingValue = value.substr(i);

        if (startRegex.test(remainingValue)) {
          matchCount++;
        } else if (endRegex.test(remainingValue)) {
          matchCount--;
        }

        if (matchCount === 0) {
          matchString = value.substr(0, i);
          break;
        }
      }
    }

    return matchString;
  },
  replaceSpecial: function replaceSpecial(str) {
    return str.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&");
  }
};

/***/ }),
/* 5 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "StringUtils", function() { return StringUtils; });
var StringUtils = {
  contains: function contains(string, substring) {
    return string.indexOf(substring) >= 0;
  },
  trim: function trim(string) {
    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim
    return string.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
  },
  emptyToString: function emptyToString(value) {
    if (value === undefined || value === null) {
      return '';
    } else {
      return value;
    }
  }
};

/***/ }),
/* 6 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PaginationComponent", function() { return PaginationComponent; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var PaginationComponent =
/*#__PURE__*/
function () {
  function PaginationComponent(itemsCount, itemsPerPage, currentPage, setPageFunction) {
    _classCallCheck(this, PaginationComponent);

    this.itemsPerPage = itemsPerPage;

    if (this.itemsPerPage !== 0) {
      this.pagesCount = Math.ceil(itemsCount / itemsPerPage);
    }

    this.setPageFunction = setPageFunction;
    this.currentPage = currentPage;
  }

  _createClass(PaginationComponent, [{
    key: "render",
    value: function render() {
      if (this.itemsPerPage === 0 || this.pagesCount < 2) {
        return [];
      }

      var firstPage = 0;
      var previousPage = this.currentPage > 0 ? this.currentPage - 1 : null;
      var lastPage = this.pagesCount - 1;
      var nextPage = this.currentPage < this.pagesCount - 1 ? this.currentPage + 1 : null;
      var pagesDistance = 3;
      var paginationElement = $('<div style="display: flex; flex-direction: row;">');
      paginationElement.append(this.createPaginationItemElement('<<', firstPage));
      paginationElement.append(this.createPaginationItemElement('<', previousPage));
      var startPage = Math.max(0, this.currentPage - pagesDistance);
      var endPage = Math.min(this.pagesCount - 1, this.currentPage + pagesDistance + 1);

      if (startPage !== firstPage) {
        paginationElement.append(this.createMoreItemsElement());
      }

      for (var pageNumber = startPage; pageNumber < this.currentPage; pageNumber++) {
        paginationElement.append(this.createPaginationItemElement(pageNumber, pageNumber));
      }

      paginationElement.append(this.createPaginationItemElement(this.currentPage, this.currentPage));

      for (var _pageNumber = this.currentPage + 1; _pageNumber < endPage + 1; _pageNumber++) {
        paginationElement.append(this.createPaginationItemElement(_pageNumber, _pageNumber));
      }

      if (endPage !== lastPage) {
        paginationElement.append(this.createMoreItemsElement());
      }

      paginationElement.append(this.createPaginationItemElement('>', nextPage));
      paginationElement.append(this.createPaginationItemElement('>>', lastPage));
      return [paginationElement];
    }
  }, {
    key: "createMoreItemsElement",
    value: function createMoreItemsElement() {
      return $('<div>').attr('style', 'padding-right: 3px;').text('...');
    }
  }, {
    key: "createPaginationItemElement",
    value: function createPaginationItemElement(title, pageNumber) {
      var _this = this;

      var isActive = pageNumber !== null && pageNumber !== this.currentPage;
      var paginationItemElement = $('<div>').text('[' + title + ']').attr('style', isActive ? 'padding-right: 3px; color: blue; cursor: pointer;' : 'padding-right: 3px;');

      if (isActive) {
        paginationItemElement.click(function () {
          _this.setPageFunction(pageNumber);
        });
      }

      return paginationItemElement;
    }
  }]);

  return PaginationComponent;
}();

/***/ }),
/* 7 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ListingItemComponent", function() { return ListingItemComponent; });
/* harmony import */ var _cultural_monument_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8);
/* harmony import */ var _cultural_monument_styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9);
/* harmony import */ var _cultural_monument_protections__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(10);
/* harmony import */ var _regions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(11);
/* harmony import */ var _validation_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(12);
/* harmony import */ var _listing_item_icons__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(13);
/* harmony import */ var _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(14);
/* harmony import */ var _search_bar__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(16);
/* harmony import */ var _changes_description__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(17);
/* harmony import */ var _string_utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(5);
/* harmony import */ var _array_utils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(18);
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }












var ListingItemComponent =
/*#__PURE__*/
function () {
  function ListingItemComponent(listingItem, view, onSaveListing, onLoadGallery) {
    _classCallCheck(this, ListingItemComponent);

    this.view = view;
    this.listingItem = listingItem;
    this.listingItemContainer = $('<div>');
    this.onSaveListing = onSaveListing;
    this.onLoadGallery = onLoadGallery;
    this._mode = MODES.VIEW;
    this._listingTable = null;
    this._listingDataRow = null;
    this._listingGalleryRow = null;
  }

  _createClass(ListingItemComponent, [{
    key: "render",
    value: function render() {
      this.listingItemContainer.append(this.renderView());
      return [this.listingItemContainer, $('<hr/>')];
    }
  }, {
    key: "renderView",
    value: function renderView() {
      if (this.view === _search_bar__WEBPACK_IMPORTED_MODULE_7__["SearchConstants"].VIEW_COMPACT) {
        return this.renderViewCompact();
      } else {
        return this.renderViewFull();
      }
    }
  }, {
    key: "renderViewFull",
    value: function renderViewFull() {
      var _this = this;

      var listingData = this.listingItem.data;
      this.imageCellComponent = new ImageCellComponent(listingData, this.listingItem.imageThumb, this.listingItem.imagesCount, function () {
        return _this.onToggleGallery();
      });
      var imageCell = this.imageCellComponent.render();
      this.dataCell = $('<td style="padding-left:10px;" valign="middle">');
      this.renderDataCellView();
      var uploadCellComponent = new UploadCellComponent(listingData);
      var uploadCell = uploadCellComponent.render();
      this._listingDataRow = $('<tr valign="top">');

      this._listingDataRow.append(imageCell);

      this._listingDataRow.append(this.dataCell);

      this._listingDataRow.append(uploadCell);

      this.galleryRowComponent = new GalleryRowComponent(function (image) {
        return _this.onSelectImage(image);
      });
      this._listingGalleryRow = this.galleryRowComponent.render();
      this.galleryRowComponent.onModeUpdate(this._mode);
      this._listingTable = $('<table class="monument" border="0" style="font-size:97%; width:100%;">');

      this._listingTable.append(this._listingDataRow);

      this._listingTable.append(this._listingGalleryRow);

      this._updateListingDataStatus();

      return this._listingTable;
    }
  }, {
    key: "_updateListingDataStatus",
    value: function _updateListingDataStatus() {
      var listingData = this.listingItem.data;

      if (!this._listingDataRow) {
        return;
      }

      if (this._mode === MODES.VIEW && listingData.status === 'destroyed') {
        this._listingDataRow.css('color', '#808080');
      } else {
        this._listingDataRow.css('color', '#000000');
      }
    }
  }, {
    key: "renderDataCellView",
    value: function renderDataCellView() {
      var _this2 = this;

      this._mode = MODES.VIEW;
      this.updateMode();
      var listingData = this.listingItem.data;
      this.dataCell.empty();
      var viewComponent = new ViewComponent(this.dataCell, listingData, function () {
        _this2.renderDataCellEdit();

        _this2._updateListingDataStatus();
      });
      viewComponent.render();
    }
  }, {
    key: "renderDataCellEdit",
    value: function renderDataCellEdit() {
      var _this3 = this;

      this._mode = MODES.EDIT;
      this.updateMode();
      var listingData = this.listingItem.data;
      this.dataCell.empty();
      this._editComponent = new EditorComponent(this.dataCell, listingData, function () {
        return _this3.onEditDiscard();
      }, function (values, changes) {
        return _this3.onEditSave(values, changes);
      });

      this._editComponent.render();
    }
  }, {
    key: "updateMode",
    value: function updateMode() {
      if (this.galleryRowComponent) {
        this.galleryRowComponent.onModeUpdate(this._mode);
      }
    }
  }, {
    key: "onImageThumbUpdated",
    value: function onImageThumbUpdated() {
      this.imageCellComponent.onImageThumbUpdated(this.listingItem.imageThumb);
    }
  }, {
    key: "onUpdateImageCount",
    value: function onUpdateImageCount() {
      this.imageCellComponent.onUpdateImageCount(this.listingItem.imagesCount);
    }
  }, {
    key: "onEditDiscard",
    value: function onEditDiscard() {
      this.renderDataCellView();

      this._updateListingDataStatus();
    }
  }, {
    key: "onEditSave",
    value: function onEditSave(values, changesDescription) {
      var _this4 = this;

      var onSaveSuccessful = function onSaveSuccessful() {
        _this4.listingItem.data = values;

        _this4.renderDataCellView();

        _this4._updateListingDataStatus();
      };

      if (this.onSaveListing) {
        this.onSaveListing(this.listingItem.page, this, this.listingItem.index, values, changesDescription, onSaveSuccessful);
      } else {
        onSaveSuccessful();
      }
    }
  }, {
    key: "onToggleGallery",
    value: function onToggleGallery() {
      var _this5 = this;

      if (!this.listingItem.galleryImages) {
        this.onLoadGallery(this.listingItem, function () {
          _this5.onGalleryUpdated();
        });
      }

      this.galleryRowComponent.toggle();
    }
  }, {
    key: "onGalleryUpdated",
    value: function onGalleryUpdated() {
      this.galleryRowComponent.setGalleryImages(this.listingItem.galleryImages);
    }
  }, {
    key: "onSelectImage",
    value: function onSelectImage(image) {
      if (this._editComponent) {
        this._editComponent.setImage(image);
      }
    }
  }, {
    key: "renderViewCompact",
    value: function renderViewCompact() {
      var listingData = this.listingItem.data;
      return $('<div>').append($('<b>').text(listingData.name)).append($('<br/>')).append(listingData.address);
    }
  }]);

  return ListingItemComponent;
}();

var ImageCellComponent =
/*#__PURE__*/
function () {
  function ImageCellComponent(listingData, imageThumb, galleryImagesCount, onToggleGallery) {
    _classCallCheck(this, ImageCellComponent);

    this._listingData = listingData;
    this._imageThumb = imageThumb;
    this._galleryImagesCount = galleryImagesCount;
    this._onToggleGallery = onToggleGallery;
  }

  _createClass(ImageCellComponent, [{
    key: "render",
    value: function render() {
      var _this6 = this;

      var imageCell = $('<td width="160px;">');
      this.image = this.renderImage();
      imageCell.append(this.image);
      this.galleryLink = $('<a style="display: none;">');
      this.galleryLink.click(function () {
        return _this6._onToggleGallery();
      });
      imageCell.append($('<div style="text-align: center;">').append(this.galleryLink));
      return imageCell;
    }
  }, {
    key: "onImageThumbUpdated",
    value: function onImageThumbUpdated(imageThumb) {
      this._imageThumb = imageThumb;
      this.renderImageThumb();
    }
  }, {
    key: "onUpdateImageCount",
    value: function onUpdateImageCount(galleryImagesCount) {
      this._galleryImagesCount = galleryImagesCount;

      if (!this.galleryLink) {
        return;
      }

      if (this._galleryImagesCount > 0) {
        this.galleryLink.show();
        this.galleryLink.text('смотреть фото (' + this._galleryImagesCount + ')');
      } else {
        this.galleryLink.hide();
      }
    }
  }, {
    key: "renderImageThumb",
    value: function renderImageThumb() {
      if (this.image && this._listingData.image && this._imageThumb) {
        this.image.attr('src', this._imageThumb);
      }
    }
  }, {
    key: "renderImage",
    value: function renderImage() {
      var image = $('<img>');
      image.attr('src', 'https://upload.wikimedia.org/' + 'wikipedia/commons/thumb/c/ca/Village_without_photo.svg/150px-Village_without_photo.svg.png');

      if (this._listingData.image) {
        image.attr('alt', this._listingData.name);
      } else {
        image.attr('alt', 'Нет фото');
        image.attr('class', 'thumbborder');
      }

      this.renderImageThumb();
      return image;
    }
  }]);

  return ImageCellComponent;
}();

var UploadCellComponent =
/*#__PURE__*/
function () {
  function UploadCellComponent(listingData) {
    _classCallCheck(this, UploadCellComponent);

    this._listingData = listingData;
  }

  _createClass(UploadCellComponent, [{
    key: "render",
    value: function render() {
      return $('<td>').attr('style', 'width:10%; ' + 'text-align: center; ' + 'vertical-align: middle; ' + 'font-size: 120%; ' + 'background-color: #FFFACD').append($('<a>').attr('href', this.composeUploadUrl()).attr('class', 'external text').text('Загрузить фото'));
    }
  }, {
    key: "composeUploadUrl",
    value: function composeUploadUrl() {
      var params = {
        title: 'Special:UploadWizard',
        campaign: this._listingData.campaign,
        id: this._listingData.knid,
        id2: this._listingData.uid,
        // TODO full description
        description: this._listingData.description,
        categories: this._listingData.commonscat,
        userlang: 'ru'
      }; // TODO check how URL encoding works with spaces

      return 'http://commons.wikimedia.org/w/index.php?' + $.param(params);
    }
  }]);

  return UploadCellComponent;
}();

var ViewComponent =
/*#__PURE__*/
function () {
  function ViewComponent(container, listingData, onEdit) {
    _classCallCheck(this, ViewComponent);

    this._container = container;
    this._listingData = listingData;
    this._onEdit = onEdit;
  }

  _createClass(ViewComponent, [{
    key: "render",
    value: function render() {
      var _this7 = this;

      var isMainComplexElement = this._listingData.complex && this._listingData.complex === this._listingData.knid;

      var cardBackgroundColor = this._getCardBackgroundColor();

      if (cardBackgroundColor) {
        this._container.css({
          'background-color': cardBackgroundColor
        });
      }

      if (this._listingData.type === 'architecture') {
        this._container.append(_listing_item_icons__WEBPACK_IMPORTED_MODULE_5__["ListingItemIcons"].MonumentType.createArchitectureIcon());
      } else if (this._listingData.type === 'history') {
        this._container.append(_listing_item_icons__WEBPACK_IMPORTED_MODULE_5__["ListingItemIcons"].MonumentType.createHistoryIcon());
      } else if (this._listingData.type === 'archeology') {
        this._container.append(_listing_item_icons__WEBPACK_IMPORTED_MODULE_5__["ListingItemIcons"].MonumentType.createArcheologyIcon());
      } else if (this._listingData.type === 'monument') {
        this._container.append(_listing_item_icons__WEBPACK_IMPORTED_MODULE_5__["ListingItemIcons"].MonumentType.createMonumentIcon());
      }

      this._container.append('&nbsp;');

      if (isMainComplexElement) {
        this._container.append(_listing_item_icons__WEBPACK_IMPORTED_MODULE_5__["ListingItemIcons"].createComplexMainElementIcon());

        this._container.append('&nbsp;');
      }

      var itemNameElement = $('<span class="monument-name" style="font-size:115%; font-weight:bold">');
      itemNameElement.text(this._listingData.name);

      this._container.append(itemNameElement);

      var editButton = this.renderEditButton(); // TODO handle only click on image

      editButton.click(function () {
        _this7._onEdit();
      });

      this._container.append(editButton);

      this._container.append($('<br/>'));

      this._container.append($('<i>').text('Адрес: '));

      if (this._listingData.municipality) {
        this._container.append($('<i>').text(this._listingData.municipality));
      }

      if (this._listingData.munid) {
        this._container.append('&nbsp;'); // TODO urlencode


        this._container.append($('<a>').attr('href', 'http://wikidata.org/wiki/' + this._listingData.munid).append(_listing_item_icons__WEBPACK_IMPORTED_MODULE_5__["ListingItemIcons"].createMunidIcon()));
      }

      if (this._listingData.block) {
        this._container.append(', квартал ' + this._listingData.block);
      }

      if (this._listingData.address) {
        if (this._listingData.municipality) {
          this._container.append(',&nbsp;');
        }

        this._container.append(this._listingData.address);
      }

      this._container.append($('<br/>'));

      this._container.append($('<i>').text('Номер объекта: '));

      var knidSpan = $('<span>').attr('id', this._listingData.knid).text(this._listingData.knid);

      if (this._listingData['knid-new']) {
        knidSpan.append('&nbsp;&nbsp;/&nbsp;&nbsp;').append($('<abbr>').attr('title', '15-значный номер в Едином государственном реестре').append($('<a>').attr('href', 'https://tools.wmflabs.org/ru_monuments/get_info.php?id=' + this._listingData['knid-new']).text(this._listingData['knid-new'])));
      } // TODO: listing data UID


      this._container.append($('<span style="font-size:93%">').append(knidSpan));

      this._container.append('&nbsp;&nbsp;&nbsp;');

      this._container.append($('<i>').text('Ссылки:'));

      this._container.append('&nbsp;');

      if (this._listingData.lat && this._listingData.long) {
        this._container.append($('<a>') // TODO correct link & escaping
        .attr('href', 'https://tools.wmflabs.org/wikivoyage/w/monmap1.php?lat=' + this._listingData.lat + '&lon=' + this._listingData.long + '&zoom=13&layer=OX&lang=ru').append(_listing_item_icons__WEBPACK_IMPORTED_MODULE_5__["ListingItemIcons"].createMapIcon()));

        if (this._listingData.precise !== 'yes') {
          this._container.append($('<span style="color:#FF0000">!</span>'));
        }

        this._container.append('&nbsp;');
      }

      if (this._listingData.wiki) {
        this._container.append($('<a>').attr('alt', 'Статья в Википедии') // TODO urlencode
        .attr('href', 'http://ru.wikipedia.org/wiki/' + this._listingData.wiki).append(_listing_item_icons__WEBPACK_IMPORTED_MODULE_5__["ListingItemIcons"].createWikipediaIcon()));
      }

      if (this._listingData.commonscat) {
        this._container.append($('<a>').attr('alt', 'Категория на Викискладе') // TODO urlencode
        .attr('href', 'http://commons.wikimedia.org/wiki/Category:' + this._listingData.commonscat).append(_listing_item_icons__WEBPACK_IMPORTED_MODULE_5__["ListingItemIcons"].createCommonsIcon()));

        this._container.append('&thinsp;&thinsp;');
      }

      if (this._listingData.wdid) {
        this._container.append($('<a>').attr('alt', 'Элемент в Викиданных') // TODO urlencode
        .attr('href', 'http://www.wikidata.org/wiki/' + this._listingData.wdid).append(_listing_item_icons__WEBPACK_IMPORTED_MODULE_5__["ListingItemIcons"].createWikidataIcon()));
      } // TODO external links


      this._container.append($('<a>').attr('href', 'https://commons.wikimedia.org/wiki/Category:WLM/' + this._listingData.knid).text('галерея'));

      this._container.append('<br>');

      this._container.append($('<i>').text('Описание:'));

      var descriptionComponents = [];

      if (this._listingData.year) {
        descriptionComponents.push(this._listingData.year);
      }

      if (this._listingData.author) {
        descriptionComponents.push(this._listingData.author);
      }

      if (descriptionComponents.length > 0) {
        this._container.append(descriptionComponents.join(', ') + '.');
      }

      var typeText = '';

      if (this._listingData.type === 'architecture') {
        typeText = 'Памятник архитектуры';
      } else if (this._listingData.type === 'history') {
        typeText = 'Памятник истории';
      } else if (this._listingData.type === 'archeology') {
        typeText = 'Памятник археологии';
      } else if (this._listingData.type === 'monument') {
        typeText = 'Памятник монументального искусства';
      }

      this._container.append(' ' + typeText);

      var protectionText = '';

      if (this._listingData.protection === 'Ф') {
        protectionText = '&nbsp;федерального значения';
      } else if (this._listingData.protection === 'Р') {
        protectionText = '&nbsp;регионального значения';
      } else if (this._listingData.protection === 'М') {
        protectionText = '&nbsp;местного значения';
      } else if (this._listingData.protection === 'В') {
        protectionText = ', выявленный';
      }

      if (protectionText) {
        this._container.append(protectionText);
      } // TODO documents

    }
  }, {
    key: "renderEditButton",
    value: function renderEditButton() {
      var editListingButton = $('<span>').attr({
        'class': 'vcard-edit-button noprint',
        'style': 'padding-left: 5px;'
      });
      var editListingLink = $('<a>').attr({
        'class': 'icon-pencil',
        'title': 'Редактировать'
      }).text('Редактировать');
      editListingButton.append(editListingLink);
      return editListingButton;
    }
  }, {
    key: "_getCardBackgroundColor",
    value: function _getCardBackgroundColor() {
      var knid = this._listingData.knid;
      var complex = this._listingData.complex;

      if (!knid) {
        return '';
      }

      var isOfficial = !(knid % 100000000 >= 40000000 && knid % 100000000 <= 49999999);
      var isMainComplexElement = knid === complex;

      if (isOfficial) {
        if (complex) {
          if (isMainComplexElement) {
            return '#baffc1';
          } else {
            return '#e1ffe4';
          }
        } else {
          return '#f8f8f8';
        }
      } else {
        if (complex) {
          if (isMainComplexElement) {
            return '#cdeefe';
          } else {
            return '#ebf5f9';
          }
        } else {
          return '#f8f8ed';
        }
      }
    }
  }]);

  return ViewComponent;
}();

var EditorComponent =
/*#__PURE__*/
function () {
  function EditorComponent(container, listingData, onDiscard, onSave) {
    _classCallCheck(this, EditorComponent);

    this._container = container;
    this._listingData = listingData;
    this._onDiscard = onDiscard;
    this._onSave = onSave;
  }

  _createClass(EditorComponent, [{
    key: "setImage",
    value: function setImage(image) {
      this._inputImage.val(image);

      this._onValueChange();
    }
  }, {
    key: "render",
    value: function render() {
      var _this8 = this;

      this._container.css({
        'background-color': '#FFFFFF'
      });

      var inputName = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createTextInputLarge();
      var inputRegion = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createSelector(_regions__WEBPACK_IMPORTED_MODULE_3__["regions"].map(function (region) {
        return {
          title: region.getTitle(),
          value: region.getId()
        };
      }));
      var inputDistrict = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createTextInput();
      var inputMunicipality = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createTextInput();
      var inputBlock = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createTextInput();
      var inputAddress = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createTextInput();
      var inputLat = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createTextInputSmall();
      var inputLong = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createTextInputSmall();
      var inputPrecise = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createCheckboxInput();
      var inputStyle = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createSelector(_cultural_monument_styles__WEBPACK_IMPORTED_MODULE_1__["culturalMonumentStyles"].map(function (culturalMonumentStyle) {
        return {
          title: culturalMonumentStyle.getTitle(),
          value: culturalMonumentStyle.getValue()
        };
      }));
      var inputType = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createSelector(_cultural_monument_types__WEBPACK_IMPORTED_MODULE_0__["culturalMonumentTypes"].map(function (culturalMonumentType) {
        return {
          title: culturalMonumentType.getTitle(),
          value: culturalMonumentType.getValue()
        };
      }));
      var inputProtection = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createSelector(_cultural_monument_protections__WEBPACK_IMPORTED_MODULE_2__["culturalMonumentProtections"].map(function (culturalMonumentProtection) {
        return {
          title: culturalMonumentProtection.getTitle(),
          value: culturalMonumentProtection.getValue()
        };
      }));
      var inputYear = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createTextInputSmall();
      var inputAuthor = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createTextInput();
      var inputDestroyed = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createCheckboxInput();
      this._inputImage = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createTextInput();
      var inputWikipedia = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createTextInput();
      var inputWikidata = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createTextInputSmall();
      var inputCommons = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createTextInput();
      var inputMunid = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createTextInputSmall();
      var inputDocument = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createTextInput();
      var inputLink = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createTextInput();
      var inputLinkExtra = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createTextInput();
      var inputKnid = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createTextInput(10);
      var inputComplex = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createTextInput(10);
      var inputKnidNew = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createTextInput(15);
      var inputDescription = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createTextarea();
      var allInputs = [inputName, inputType, inputRegion, inputDistrict, inputMunicipality, inputBlock, inputAddress, inputLat, inputLong, inputYear, inputAuthor, inputKnid, inputComplex, inputKnidNew, this._inputImage, inputWikipedia, inputWikidata, inputCommons, inputMunid, inputDocument, inputLink, inputLinkExtra, inputDescription, inputProtection, inputStyle, inputDestroyed, inputPrecise];
      var directMappingInputs = {
        name: inputName,
        type: inputType,
        region: inputRegion,
        district: inputDistrict,
        municipality: inputMunicipality,
        block: inputBlock,
        address: inputAddress,
        lat: inputLat,
        long: inputLong,
        year: inputYear,
        author: inputAuthor,
        knid: inputKnid,
        complex: inputComplex,
        'knid-new': inputKnidNew,
        image: this._inputImage,
        wiki: inputWikipedia,
        wdid: inputWikidata,
        commonscat: inputCommons,
        munid: inputMunid,
        document: inputDocument,
        link: inputLink,
        linkextra: inputLinkExtra,
        description: inputDescription,
        protection: inputProtection
      };

      var setValues = function setValues(listing) {
        Object.keys(directMappingInputs).forEach(function (key) {
          if (listing[key]) {
            directMappingInputs[key].val(listing[key]);
          }
        });

        if (listing['style']) {
          inputStyle.val(listing['style'].toLowerCase());
        }

        inputDestroyed.attr('checked', listing['status'] === 'destroyed');
        inputPrecise.attr('checked', listing['precise'] === 'yes');
      };

      var getValues = function getValues() {
        var listingData = {};
        Object.keys(directMappingInputs).forEach(function (key) {
          listingData[key] = directMappingInputs[key].val();
        });

        if (inputDestroyed.is(':checked')) {
          listingData['status'] = 'destroyed';
        } else {
          listingData['status'] = '';
        }

        if (inputPrecise.is(':checked')) {
          listingData['precise'] = 'yes';
        } else {
          listingData['precise'] = 'no';
        }

        listingData['link'] = _validation_utils__WEBPACK_IMPORTED_MODULE_4__["ValidationUtils"].normalizeUrl(listingData['link']);
        listingData['linkextra'] = _validation_utils__WEBPACK_IMPORTED_MODULE_4__["ValidationUtils"].normalizeUrl(listingData['linkextra']);
        listingData['style'] = inputStyle.val();
        return listingData;
      };

      setValues(this._listingData);
      var nameRow = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormRow('Название:').append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement(null, inputName)).append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createInsertSymbols(inputName));

      this._container.append(nameRow);

      var addressRow = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormRow('Адрес:').append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('Регион', inputRegion)).append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('Район', inputDistrict)).append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('Населенный пункт', inputMunicipality)).append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('Квартал', inputBlock)).append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('Улица, дом', inputAddress));

      this._container.append(addressRow);

      var coordRow = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormRow('Координаты: ').append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('Широта', inputLat)).append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('Долгота', inputLong)).append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('Заданы точно?', inputPrecise));

      this._container.append(coordRow);

      var propsRow = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormRow('Свойства: ').append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('Тип', inputType)).append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('Стиль', inputStyle)).append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('Категория охраны', inputProtection)).append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('Год', inputYear)).append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('Автор', inputAuthor)).append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('Утрачен', inputDestroyed));

      this._container.append(propsRow);

      var linksRow = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormRow('Ссылки: ').append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('Изображение', this._inputImage)).append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('Википедия', inputWikipedia)).append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('Викиданные', inputWikidata)).append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('Викисклад', inputCommons)).append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('Викиданные нас. пункта', inputMunid)).append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('Код документа', inputDocument)).append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('Ссылка №1', inputLink)).append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('Ссылка №2', inputLinkExtra));

      this._container.append(linksRow);

      var numbersRow = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormRow('Номера: ').append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('10-значный № объекта', inputKnid)).append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('10-значный № комплекса', inputComplex)).append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('15-значный № объекта', inputKnidNew));

      this._container.append(numbersRow);

      var descriptionRow = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormRow('Описание:').append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement(null, inputDescription));

      this._container.append(descriptionRow);

      var inputChanges = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createTextInputLarge();
      var inputIsMinor = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createCheckboxInput();
      var changesDescriptionRow = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormRow('Описание изменений: ').append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement(null, inputChanges)).append(_listing_item_form_composer__WEBPACK_IMPORTED_MODULE_6__["ListingItemFormComposer"].createFormElement('незначительные?', inputIsMinor));
      changesDescriptionRow.css('border-top', '1px dotted gray');
      changesDescriptionRow.css('border-bottom', '1px dotted gray');
      changesDescriptionRow.css('margin-top', '3px');
      var changesChanged = false;
      inputChanges.change(function () {
        changesChanged = true;
      });

      this._onValueChange = function () {
        if (!changesChanged) {
          var values = getValues();
          var originalData = _this8._listingData;
          var changedItems = [];
          Object.keys(values).forEach(function (key) {
            if (_string_utils__WEBPACK_IMPORTED_MODULE_9__["StringUtils"].emptyToString(originalData[key]) !== _string_utils__WEBPACK_IMPORTED_MODULE_9__["StringUtils"].emptyToString(values[key])) {
              changedItems.push(key);
            }
          });

          if (_array_utils__WEBPACK_IMPORTED_MODULE_10__["ArrayUtils"].consistsOnlyOf(changedItems, ['name'])) {
            inputChanges.val('название');
          } else if (_array_utils__WEBPACK_IMPORTED_MODULE_10__["ArrayUtils"].consistsOnlyOf(changedItems, ['image'])) {
            inputChanges.val('изображение');
          } else if (_array_utils__WEBPACK_IMPORTED_MODULE_10__["ArrayUtils"].consistsOnlyOf(changedItems, ['address'])) {
            inputChanges.val('адрес');
          } else if (_array_utils__WEBPACK_IMPORTED_MODULE_10__["ArrayUtils"].consistsOnlyOf(changedItems, ['lat', 'long', 'precise'])) {
            inputChanges.val('координаты');
          } else {
            inputChanges.val('');
          }
        }
      };

      allInputs.forEach(function (input) {
        return input.change(_this8._onValueChange);
      });

      this._container.append(changesDescriptionRow);

      var buttonsBlock = $('<div>').attr('class', 'ui-dialog-buttonset');
      var buttonDiscard = this.renderButton('Отменить');
      var buttonSave = this.renderButton('Сохранить');
      buttonsBlock.append(buttonDiscard);
      buttonsBlock.append(buttonSave);
      buttonDiscard.click(function () {
        _this8._onDiscard();
      });
      buttonSave.click(function () {
        var values = getValues();
        var changesDescription = new _changes_description__WEBPACK_IMPORTED_MODULE_8__["ChangesDescription"](inputChanges.val(), inputIsMinor.is(':checked'));

        _this8._onSave(values, changesDescription);
      });

      this._container.append(buttonsBlock);
    }
  }, {
    key: "renderButton",
    value: function renderButton(buttonText) {
      return $('<button>').attr('class', 'ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only').append($('<span>').attr('class', 'ui-button-text').text(buttonText));
    }
  }]);

  return EditorComponent;
}();

var GalleryRowComponent =
/*#__PURE__*/
function () {
  function GalleryRowComponent(onSelectImage) {
    _classCallCheck(this, GalleryRowComponent);

    this._onSelectImage = onSelectImage;
  }

  _createClass(GalleryRowComponent, [{
    key: "render",
    value: function render() {
      this._galleryContents = $('<td colspan="2">');
      this._galleryComponent = new GalleryComponent(this._galleryContents, this._onSelectImage);

      this._galleryComponent.render();

      this._galleryRow = $('<tr style="display: none;">').append(this._galleryContents);
      return this._galleryRow;
    }
  }, {
    key: "onModeUpdate",
    value: function onModeUpdate(mode) {
      this._mode = mode;
      this.updateMode();
    }
  }, {
    key: "updateMode",
    value: function updateMode() {
      this._galleryComponent.onModeUpdate(this._mode);
    }
  }, {
    key: "toggle",
    value: function toggle() {
      this._galleryRow.toggle();
    }
  }, {
    key: "setGalleryImages",
    value: function setGalleryImages(galleryImages) {
      this._galleryComponent.setGalleryImages(galleryImages);
    }
  }]);

  return GalleryRowComponent;
}();

var GalleryComponent =
/*#__PURE__*/
function () {
  function GalleryComponent(container, onSelectImage) {
    _classCallCheck(this, GalleryComponent);

    this._galleryImages = null;
    this._container = container;
    this._imageComponents = [];
    this._onSelectImage = onSelectImage;
  }

  _createClass(GalleryComponent, [{
    key: "onModeUpdate",
    value: function onModeUpdate(mode) {
      this._mode = mode;
      this.updateMode();
    }
  }, {
    key: "updateMode",
    value: function updateMode() {
      var _this9 = this;

      this._imageComponents.forEach(function (imageComponent) {
        imageComponent.onModeUpdate(_this9._mode);
      });
    }
  }, {
    key: "setGalleryImages",
    value: function setGalleryImages(galleryImages) {
      this._galleryImages = galleryImages;
      this.render();
    }
  }, {
    key: "render",
    value: function render() {
      if (!this._container) {
        return;
      }

      this._container.empty();

      this._renderGallery();
    }
  }, {
    key: "_renderGallery",
    value: function _renderGallery() {
      if (!this._galleryImages) {
        this._container.text('загрузка...');
      } else {
        if (this._galleryImages.hasWlmImages()) {
          this._container.append(this._renderGallerySection('Фотографии Wiki Loves Monuments', this._galleryImages.getWlmImages()));
        }

        if (this._galleryImages.hasCommonsImages()) {
          this._container.append(this._renderGallerySection('Фотографии из категории Commons', this._galleryImages.getCommonsImages()));
        }
      }
    }
  }, {
    key: "_renderGallerySection",
    value: function _renderGallerySection(title, images) {
      var _this10 = this;

      var headerDiv = $('<div style="width: 100%; text-align: center; font-weight: bold;">').text(title);
      var imagesDiv = $('<div style="display: flex; flex-direction: row; flex-wrap: wrap; align-items: center">');
      images.forEach(function (image) {
        var imageComponent = new GalleryImageComponent(imagesDiv, image, _this10._onSelectImage, _this10._mode);
        imageComponent.render();

        _this10._imageComponents.push(imageComponent);
      });
      return $('<div>').append(headerDiv).append(imagesDiv);
    }
  }]);

  return GalleryComponent;
}();

var GalleryImageComponent =
/*#__PURE__*/
function () {
  function GalleryImageComponent(container, image, onSelect, mode) {
    _classCallCheck(this, GalleryImageComponent);

    this._container = container;
    this._image = image;
    this._onSelect = onSelect;
    this.mode = mode;
  }

  _createClass(GalleryImageComponent, [{
    key: "onModeUpdate",
    value: function onModeUpdate(mode) {
      this.mode = mode;
      this.updateMode();
    }
  }, {
    key: "updateMode",
    value: function updateMode() {
      if (this.mode === MODES.EDIT) {
        this._selectLink.show();
      } else {
        this._selectLink.hide();
      }
    }
  }, {
    key: "render",
    value: function render() {
      var _this11 = this;

      var imageElement = $('<img>').attr('src', this._image.thumb);
      var commonsUrl = 'https://commons.wikimedia.org/wiki/' + this._image.image;
      var fullSizeUrl = this._image.url;
      var imageLink = $('<a>').attr('href', fullSizeUrl).attr('target', '_blank').append(imageElement);
      var viewCommonsLink = $('<a>').text('[Смотрeть на Commons]').attr('href', commonsUrl).attr('target', '_blank');
      var viewFullLink = $('<a>').text('[Смотреть в полном размере]').attr('href', fullSizeUrl).attr('target', '_blank');
      this._selectLink = $('<a style="display: none;">').text('[Выбрать]').click(function () {
        return _this11._onSelect(_this11._image.image.replace(/^File:/, '').replace(' ', '_'));
      });

      this._container.append($('<div style="padding: 10px; display: flex; flex-direction: column; justify-content: center">').append($('<div>').append(imageLink)).append($('<div style="text-align: center">').append(viewCommonsLink)).append($('<div style="text-align: center">').append(viewFullLink)).append($('<div style="text-align: center">').append(this._selectLink)));

      this.updateMode();
    }
  }]);

  return GalleryImageComponent;
}();

var MODES = {
  VIEW: 'view',
  EDIT: 'edit'
};

/***/ }),
/* 8 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CulturalMonumentType", function() { return CulturalMonumentType; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "culturalMonumentTypes", function() { return culturalMonumentTypes; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var CulturalMonumentType =
/*#__PURE__*/
function () {
  function CulturalMonumentType(value, title) {
    _classCallCheck(this, CulturalMonumentType);

    this._value = value;
    this._title = title;
  }

  _createClass(CulturalMonumentType, [{
    key: "getValue",
    value: function getValue() {
      return this._value;
    }
  }, {
    key: "getTitle",
    value: function getTitle() {
      return this._title;
    }
  }]);

  return CulturalMonumentType;
}();
var culturalMonumentTypes = [new CulturalMonumentType('', ''), new CulturalMonumentType('architecture', 'памятник архитектуры'), new CulturalMonumentType('history', 'памятник истории'), new CulturalMonumentType('monument', 'памятник монументального искусства'), new CulturalMonumentType('archeology', 'памятник археологии')];

/***/ }),
/* 9 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CulturalMonumentStyle", function() { return CulturalMonumentStyle; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "culturalMonumentStyles", function() { return culturalMonumentStyles; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var CulturalMonumentStyle =
/*#__PURE__*/
function () {
  function CulturalMonumentStyle(value, title) {
    _classCallCheck(this, CulturalMonumentStyle);

    this._value = value;
    this._title = title;
  }

  _createClass(CulturalMonumentStyle, [{
    key: "getTitle",
    value: function getTitle() {
      return this._title;
    }
  }, {
    key: "getValue",
    value: function getValue() {
      return this._value;
    }
  }]);

  return CulturalMonumentStyle;
}();
var culturalMonumentStyles = [new CulturalMonumentStyle('', ''), new CulturalMonumentStyle('конструктивизм', 'конструктивизм'), new CulturalMonumentStyle('модерн', 'модерн')];

/***/ }),
/* 10 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CulturalMonumentProtection", function() { return CulturalMonumentProtection; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "culturalMonumentProtections", function() { return culturalMonumentProtections; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var CulturalMonumentProtection =
/*#__PURE__*/
function () {
  function CulturalMonumentProtection(value, title) {
    _classCallCheck(this, CulturalMonumentProtection);

    this._value = value;
    this._title = title;
  }

  _createClass(CulturalMonumentProtection, [{
    key: "getTitle",
    value: function getTitle() {
      return this._title;
    }
  }, {
    key: "getValue",
    value: function getValue() {
      return this._value;
    }
  }]);

  return CulturalMonumentProtection;
}();
var culturalMonumentProtections = [new CulturalMonumentProtection('', ''), new CulturalMonumentProtection('Ф', 'федеральная'), new CulturalMonumentProtection('Р', 'региональная'), new CulturalMonumentProtection('М', 'местная'), new CulturalMonumentProtection('В', 'выявленный объект')];

/***/ }),
/* 11 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Region", function() { return Region; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "regions", function() { return regions; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var Region =
/*#__PURE__*/
function () {
  function Region(id, title) {
    _classCallCheck(this, Region);

    this._id = id;
    this._title = title;
  }

  _createClass(Region, [{
    key: "getId",
    value: function getId() {
      return this._id;
    }
  }, {
    key: "getTitle",
    value: function getTitle() {
      return this._title;
    }
  }]);

  return Region;
}();
var regions = [new Region("", "не задан"), new Region("ru-ad", "Адыгея"), new Region("ru-ba", "Башкортостан"), new Region("ru-bu", "Бурятия"), new Region("ru-al", "Алтай"), new Region("ru-da", "Дагестан"), new Region("ru-in", "Ингушетия"), new Region("ru-kb", "Кабардино-Балкария"), new Region("ru-kl", "Калмыкия"), new Region("ru-kc", "Карачаево-Черкесия"), new Region("ru-krl", "Карелия"), new Region("ru-ko", "республика Коми"), new Region("ru-me", "Марий Эл"), new Region("ru-mo", "Мордовия"), new Region("ru-sa", "Якутия (Саха)"), new Region("ru-se", "Северная Осетия"), new Region("ru-ta", "Татарстан"), new Region("ru-ty", "Тува"), new Region("ru-ud", "Удмуртия"), new Region("ru-kk", "Хакасия"), new Region("ru-ce", "Чеченская республика"), new Region("ru-chv", "Чувашия"), new Region("ru-alt", "Алтайский край"), new Region("ru-kda", "Краснодарский край"), new Region("ru-kya", "Красноярский край"), new Region("ru-pri", "Приморский край"), new Region("ru-sta", "Ставропольский край"), new Region("ru-kha", "Хабаровский край"), new Region("ru-amu", "Амурская область"), new Region("ru-ark", "Архангельская область"), new Region("ru-ast", "Астраханская область"), new Region("ru-bel", "Белгородская область"), new Region("ru-bry", "Брянская область"), new Region("ru-vla", "Владимирская область"), new Region("ru-vgg", "Волгоградская область"), new Region("ru-vol", "Вологодская область"), new Region("ru-vor", "Воронежская область"), new Region("ru-iva", "Ивановская область"), new Region("ru-irk", "Иркутская область"), new Region("ru-kal", "Калининградская область"), new Region("ru-klu", "Калужская область"), new Region("ru-kam", "Камчатский край"), new Region("ru-kem", "Кемеровская область"), new Region("ru-kir", "Кировская область"), new Region("ru-kos", "Костромская область"), new Region("ru-kgn", "Курганская область"), new Region("ru-krs", "Курская область"), new Region("ru-len", "Ленинградская область"), new Region("ru-lip", "Липецкая область"), new Region("ru-mag", "Магаданская область"), new Region("ru-mos", "Московская область"), new Region("ru-mur", "Мурманская область"), new Region("ru-niz", "Нижегородская область"), new Region("ru-ngr", "Новгородская область"), new Region("ru-nvs", "Новосибирская область"), new Region("ru-oms", "Омская область"), new Region("ru-ore", "Оренбургская область"), new Region("ru-orl", "Орловская область"), new Region("ru-pnz", "Пензенская область"), new Region("ru-per", "Пермский край"), new Region("ru-psk", "Псковская область"), new Region("ru-ros", "Ростовская область"), new Region("ru-rya", "Рязанская область"), new Region("ru-sam", "Самарская область"), new Region("ru-sar", "Саратовская область"), new Region("ru-sak", "Сахалинская область"), new Region("ru-sve", "Свердловская область"), new Region("ru-smo", "Смоленская область"), new Region("ru-tam", "Тамбовская область"), new Region("ru-tve", "Тверская область"), new Region("ru-tom", "Томская область"), new Region("ru-tul", "Тульская область"), new Region("ru-tyu", "Тюменская область"), new Region("ru-uly", "Ульяновская область"), new Region("ru-che", "Челябинская область"), new Region("ru-zab", "Забайкальский край"), new Region("ru-yar", "Ярославская область"), new Region("ru-mow", "Москва"), new Region("ru-spb", "Санкт-Петербург"), new Region("ru-jew", "Еврейская автономная область"), new Region("ru-km", "Крым"), new Region("ru-nen", "Ненецкий автономный округ"), new Region("ru-khm", "Ханты-Мансийский автономный округ"), new Region("ru-chu", "Чукотский автономный округ"), new Region("ru-yam", "Ямало-Ненецкий автономный округ"), new Region("ru-sev", "Севастополь")];

/***/ }),
/* 12 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ValidationUtils", function() { return ValidationUtils; });
var ValidationUtils = {
  normalizeUrl: function normalizeUrl(url) {
    var webRegex = new RegExp('^https?://', 'i');

    if (!webRegex.test(url) && url !== '') {
      return 'http://' + url;
    } else {
      return url;
    }
  }
};

/***/ }),
/* 13 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ListingItemIcons", function() { return ListingItemIcons; });
var ListingItemIcons = {
  THUMBS_URL: 'https://upload.wikimedia.org/wikipedia/commons/thumb/',
  createComplexMainElementIcon: function createComplexMainElementIcon() {
    return $('<img>').attr({
      'src': ListingItemIcons.THUMBS_URL + '8/8c/Location_dot_darkslategray.svg/10px-Location_dot_darkslategray.svg.png',
      'alt': 'главный элемент комплекса',
      'width': '10px',
      'height': '10px'
    });
  },
  createMunidIcon: function createMunidIcon() {
    return $('<img>').attr({
      'src': ListingItemIcons.THUMBS_URL + 'f/ff/Wikidata-logo.svg/18px-Wikidata-logo.svg.png',
      'alt': 'район на Викиданных',
      'width': '18px',
      'height': '10px'
    });
  },
  createMapIcon: function createMapIcon() {
    return $('<img>').attr({
      'src': ListingItemIcons.THUMBS_URL + 'c/ce/Map_mag.png/17px-Map_mag.png',
      'alt': 'Расположение на карте',
      'width': '17px',
      'height': '17px'
    });
  },
  createWikipediaIcon: function createWikipediaIcon() {
    return $('<img>').attr({
      'src': ListingItemIcons.THUMBS_URL + '8/80/Wikipedia-logo-v2.svg/19px-Wikipedia-logo-v2.svg.png',
      'alt': 'Расположение на карте',
      'width': '19px',
      'height': '17px'
    });
  },
  createCommonsIcon: function createCommonsIcon() {
    return $('<img>').attr({
      'src': ListingItemIcons.THUMBS_URL + '4/4a/Commons-logo.svg/17px-Commons-logo.svg.png',
      'alt': 'Расположение на карте',
      'width': '17px',
      'height': '23px'
    });
  },
  createWikidataIcon: function createWikidataIcon() {
    return $('<img>').attr({
      'src': ListingItemIcons.THUMBS_URL + 'f/ff/Wikidata-logo.svg/24px-Wikidata-logo.svg.png',
      'alt': 'Расположение на карте',
      'width': '24px',
      'height': '13px'
    });
  },
  MonumentType: {
    createArchitectureIcon: function createArchitectureIcon() {
      return $('<img>').attr({
        'src': ListingItemIcons.THUMBS_URL + 'c/cc/PorticoIcon.svg/20px-PorticoIcon.svg.png',
        'alt': 'памятник архитектуры',
        'width': '20px',
        'height': '20px'
      });
    },
    createHistoryIcon: function createHistoryIcon() {
      return $('<img>').attr({
        'src': ListingItemIcons.THUMBS_URL + 'c/c8/HistoryIcon.svg/18px-HistoryIcon.svg.png',
        'alt': 'памятник истории',
        'width': '18px',
        'height': '18px'
      });
    },
    createArcheologyIcon: function createArcheologyIcon() {
      return $('<img>').attr({
        'src': ListingItemIcons.THUMBS_URL + 'c/ce/ArcheologyIcon.svg/22px-ArcheologyIcon.svg.png',
        'alt': 'памятник археологии',
        'width': '22px',
        'height': '22px'
      });
    },
    createMonumentIcon: function createMonumentIcon() {
      return $('<img>').attr({
        'src': ListingItemIcons.THUMBS_URL + 'c/c2/MonumentIcon.svg/20px-MonumentIcon.svg.png',
        'alt': 'памятник монументального искусства',
        'width': '20px',
        'height': '20px'
      });
    }
  }
};

/***/ }),
/* 14 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ListingItemFormComposer", function() { return ListingItemFormComposer; });
/* harmony import */ var _input_insert_symbols__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(15);

var ListingItemFormComposer = {
  createTextInput: function createTextInput(size) {
    var input = $('<input>').attr({
      'type': 'text',
      'style': 'font-size: 97%; border: 1px solid grey;'
    });

    if (size) {
      input.attr('size', size);
    }

    return input;
  },
  createTextInputLarge: function createTextInputLarge() {
    return $('<input>').attr({
      'type': 'text',
      'style': 'font-size: 97%; border: 1px solid grey; width: 600px;'
    });
  },
  createTextInputSmall: function createTextInputSmall() {
    return $('<input>').attr({
      'type': 'text',
      'style': 'font-size: 97%; border: 1px solid grey; width: 100px;'
    });
  },
  createTextarea: function createTextarea() {
    return $('<textarea>').attr({
      'type': 'text',
      'style': 'font-size: 97%; border: 1px solid grey; width: 600px;',
      'rows': '3'
    });
  },
  createCheckboxInput: function createCheckboxInput() {
    return $('<input>').attr({
      'type': 'checkbox',
      'style': 'border: 1px solid grey;'
    });
  },
  createSelector: function createSelector(options) {
    var inputElement = $('<select>').attr({
      'style': 'font-size: 97%; border: 1px solid grey; width: 200px;'
    });
    options.forEach(function (option) {
      var optionElement = $('<option>', {
        'value': option.value,
        'html': option.title
      });
      inputElement.append(optionElement);
    });
    return inputElement;
  },
  createFormRow: function createFormRow(rowTitle) {
    return $('<div>').attr('style', 'display: flex; flex-wrap: wrap;').append($('<div>').attr('style', 'font-weight: bold; padding-top: 5px;').text(rowTitle));
  },
  createFormElement: function createFormElement(title, input) {
    var formElement = $('<div>').attr('style', 'padding-left: 5px; display: flex; padding-top: 5px;');

    if (title) {
      formElement.append($('<div>').attr('style', 'padding-left: 5px;').text(title));
    }

    formElement.append($('<div>').attr('style', 'padding-left: 5px;').append(input));
    return formElement;
  },
  createInsertSymbols: function createInsertSymbols(input) {
    var buttonInsertQuotes = $('<a>', {
      'class': 'name-quotes-template',
      href: 'javascript:;',
      html: '«»'
    });
    var buttonInsertDash = $('<a>', {
      'class': 'name-dash-template',
      href: 'javascript:;',
      html: '—'
    });
    _input_insert_symbols__WEBPACK_IMPORTED_MODULE_0__["InputInsertSymbols"].addDashInsertHandler(buttonInsertDash, input);
    _input_insert_symbols__WEBPACK_IMPORTED_MODULE_0__["InputInsertSymbols"].addQuotesInsertHandler(buttonInsertQuotes, input);
    return $('<span>').append('&nbsp;').append(buttonInsertQuotes).append('&nbsp;').append(buttonInsertDash);
  }
};

/***/ }),
/* 15 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InputInsertSymbols", function() { return InputInsertSymbols; });
var InputInsertSymbols = {
  addQuotesInsertHandler: function addQuotesInsertHandler(insertButton, insertToInput) {
    insertButton.click(function () {
      var selectionStart = insertToInput[0].selectionStart;
      var selectionEnd = insertToInput[0].selectionEnd;
      var oldValue = insertToInput.val();
      var newValue = oldValue.substring(0, selectionStart) + "«" + oldValue.substring(selectionStart, selectionEnd) + "»" + oldValue.substring(selectionEnd);
      insertToInput.val(newValue);

      InputInsertSymbols._selectRange(insertToInput[0], selectionStart + 1, selectionEnd + 1);
    });
  },
  addDashInsertHandler: function addDashInsertHandler(insertButton, insertToInput) {
    insertButton.click(function () {
      var caretPos = insertToInput[0].selectionStart;
      var oldValue = insertToInput.val();
      var newValue = oldValue.substring(0, caretPos) + "—" + oldValue.substring(caretPos);
      insertToInput.val(newValue);

      InputInsertSymbols._selectRange(insertToInput[0], caretPos + 1);
    });
  },
  _selectRange: function _selectRange(element, start, end) {
    if (end === undefined) {
      end = start;
    }

    element.focus();

    if ('selectionStart' in element) {
      element.selectionStart = start;
      element.selectionEnd = end;
    } else if (element.setSelectionRange) {
      element.setSelectionRange(start, end);
    } else if (element.createTextRange) {
      var range = element.createTextRange();
      range.collapse(true);
      range.moveEnd('character', end);
      range.moveStart('character', start);
      range.select();
    }
  }
};

/***/ }),
/* 16 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SearchBar", function() { return SearchBar; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SearchConstants", function() { return SearchConstants; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SortConstants", function() { return SortConstants; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SearchFilter", function() { return SearchFilter; });
/* harmony import */ var _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(14);
/* harmony import */ var _cultural_monument_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8);
/* harmony import */ var _cultural_monument_styles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9);
/* harmony import */ var _cultural_monument_protections__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(10);
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }





var SearchBar =
/*#__PURE__*/
function () {
  function SearchBar(onUpdate, onUpdateItemsOnPage, onUpdateView, onUpdateSort) {
    _classCallCheck(this, SearchBar);

    this._onUpdate = onUpdate;
    this._onUpdateItemsOnPage = onUpdateItemsOnPage;
    this._onUpdateView = onUpdateView;
    this._onUpdateSort = onUpdateSort;

    this._initComponents();
  }

  _createClass(SearchBar, [{
    key: "render",
    value: function render() {
      return this._searchBar;
    }
  }, {
    key: "_initComponents",
    value: function _initComponents() {
      var _this = this;

      this._searchBar = $('<div style="padding: 10px; background-color: #f8f9fa; border: 1px solid #a2a9b1;">');
      this._inputSort = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_0__["ListingItemFormComposer"].createSelector([{
        title: 'По-умолчанию',
        value: SortConstants.DEFAULT
      }, {
        title: 'По названию',
        value: SortConstants.NAME
      }, {
        title: 'По адресу',
        value: SortConstants.ADDRESS
      }, {
        title: 'По типу',
        value: SortConstants.TYPE
      }]);
      this._inputItemsOnPage = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_0__["ListingItemFormComposer"].createSelector([{
        title: '10',
        value: 10
      }, {
        title: '50',
        value: 50
      }, {
        title: '100',
        value: 100
      }, {
        title: '250',
        value: 250
      }, {
        title: '500',
        value: 500
      }, {
        title: 'все',
        value: 0
      }]).css('width', '50px');
      this._inputView = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_0__["ListingItemFormComposer"].createSelector([{
        title: 'полный',
        value: SearchConstants.VIEW_FULL
      }, {
        title: 'компактный',
        value: SearchConstants.VIEW_COMPACT
      }]).css('width', '120px');
      this._inputSearchDescription = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_0__["ListingItemFormComposer"].createTextInput();
      this._inputSearchAddress = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_0__["ListingItemFormComposer"].createTextInput();
      this._inputImage = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_0__["ListingItemFormComposer"].createSelector([{
        title: '',
        value: SearchConstants.PHOTO_ANY
      }, {
        title: 'Отсутствует',
        value: SearchConstants.PHOTO_NO
      }, {
        title: 'Присутствует',
        value: SearchConstants.PHOTO_YES
      }]);
      this._inputCoordinates = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_0__["ListingItemFormComposer"].createSelector([{
        title: '',
        value: SearchConstants.COORDINATES_ANY
      }, {
        title: 'Заданы, точные',
        value: SearchConstants.COORDINATES_PRECISE
      }, {
        title: 'Заданы, неточные',
        value: SearchConstants.COORDINATES_NOT_PRECISE
      }, {
        title: 'Заданы, любые',
        value: SearchConstants.COORDINATES_EXISTS
      }, {
        title: 'Не заданы',
        value: SearchConstants.COORDINATES_NO
      }]);
      var filterStyleVals = _cultural_monument_styles__WEBPACK_IMPORTED_MODULE_2__["culturalMonumentStyles"].map(function (culturalMonumentStyle) {
        return {
          title: culturalMonumentStyle.getTitle(),
          value: culturalMonumentStyle.getValue()
        };
      });
      this._inputStyle = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_0__["ListingItemFormComposer"].createSelector(filterStyleVals);
      var filterTypeVals = _cultural_monument_types__WEBPACK_IMPORTED_MODULE_1__["culturalMonumentTypes"].map(function (culturalMonumentType) {
        return {
          title: culturalMonumentType.getTitle(),
          value: culturalMonumentType.getValue()
        };
      });
      this._inputType = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_0__["ListingItemFormComposer"].createSelector(filterTypeVals);
      var filterProtectionVals = _cultural_monument_protections__WEBPACK_IMPORTED_MODULE_3__["culturalMonumentProtections"].map(function (culturalMonumentProtection) {
        return {
          title: culturalMonumentProtection.getTitle(),
          value: culturalMonumentProtection.getValue()
        };
      });
      this._inputProtection = _listing_item_form_composer__WEBPACK_IMPORTED_MODULE_0__["ListingItemFormComposer"].createSelector(filterProtectionVals);
      this._hideLink = $('<a href="javascript:;" style="display: none;">').text('[Скрыть]');
      this._showLink = $('<a href="javascript:;">').text('[Показать]');

      this._searchBar.append($('<div style="display: flex; justify-content: space-between;">').append($('<div>').append($('<b>').text('Фильтры')).append('&nbsp;').append(this._hideLink).append(this._showLink)).append($('<div style="display: flex;">').append($('<div>').append($('<b>').text('Упорядочить: ')).append(this._inputSort)).append($('<div style="padding-left: 10px;">').append($('<b>').text('Вид: ')).append(this._inputView)).append($('<div style="padding-left: 10px;">').append($('<b>').text('Элементов на странице: ')).append(this._inputItemsOnPage))));

      this._filtersBar = $('<div style="display: none;">');

      this._hideLink.click(function () {
        _this._hideLink.hide();

        _this._showLink.show();

        _this._filtersBar.hide();
      });

      this._showLink.click(function () {
        _this._showLink.hide();

        _this._hideLink.show();

        _this._filtersBar.show();
      });

      this._searchBar.append(this._filtersBar);

      this._filtersBar.append($('<div style="padding: 5px;">').append('Название или описание: ').append(this._inputSearchDescription));

      this._filtersBar.append($('<div style="padding: 5px;">').append('Адрес: ').append(this._inputSearchAddress));

      this._filtersBar.append($('<div style="padding: 5px;">').append('Фотография: ').append(this._inputImage));

      this._filtersBar.append($('<div style="padding: 5px;">').append('Координаты: ').append(this._inputCoordinates));

      this._filtersBar.append($('<div style="padding: 5px;">').append('Стиль: ').append(this._inputStyle));

      this._filtersBar.append($('<div style="padding: 5px;">').append('Тип: ').append(this._inputType));

      this._filtersBar.append($('<div style="padding: 5px;">').append('Категория охраны: ').append(this._inputProtection));

      this._inputSearchDescription.keyup(function () {
        return _this._onUpdateSearch();
      });

      this._inputSearchAddress.keyup(function () {
        return _this._onUpdateSearch();
      });

      this._inputImage.change(function () {
        return _this._onUpdateSearch();
      });

      this._inputCoordinates.change(function () {
        return _this._onUpdateSearch();
      });

      this._inputType.change(function () {
        return _this._onUpdateSearch();
      });

      this._inputStyle.change(function () {
        return _this._onUpdateSearch();
      });

      this._inputProtection.change(function () {
        return _this._onUpdateSearch();
      });

      this._inputItemsOnPage.change(function () {
        return _this._onUpdateItemsOnPage(parseInt(_this._inputItemsOnPage.val()));
      });

      this._inputView.change(function () {
        return _this._onUpdateView(_this._inputView.val());
      });

      this._inputSort.change(function () {
        return _this._onUpdateSort(_this._inputSort.val());
      });
    }
  }, {
    key: "_onUpdateSearch",
    value: function _onUpdateSearch() {
      this._onUpdate(this._getCurrentSearchFilter());
    }
  }, {
    key: "_getCurrentSearchFilter",
    value: function _getCurrentSearchFilter() {
      return new SearchFilter(this._inputSearchDescription.val(), this._inputSearchAddress.val(), this._inputImage.val(), this._inputCoordinates.val(), this._inputType.val(), this._inputStyle.val(), this._inputProtection.val());
    }
  }]);

  return SearchBar;
}();
var SearchConstants = {
  PHOTO_ANY: '',
  PHOTO_YES: 'yes',
  PHOTO_NO: 'no',
  COORDINATES_ANY: '',
  COORDINATES_EXISTS: 'exists',
  COORDINATES_PRECISE: 'precise',
  COORDINATES_NOT_PRECISE: 'not-precise',
  COORDINATES_NO: 'no',
  VIEW_FULL: 'full',
  VIEW_COMPACT: 'compact'
};
var SortConstants = {
  DEFAULT: 'default',
  NAME: 'name',
  ADDRESS: 'address',
  TYPE: 'type'
};
var SearchFilter =
/*#__PURE__*/
function () {
  function SearchFilter(searchText, searchAddress, photo, coordinates, type, style, protection) {
    _classCallCheck(this, SearchFilter);

    this._searchDescription = searchText;
    this._searchAddress = searchAddress;
    this._photo = photo;
    this._coordinates = coordinates;
    this._type = type;
    this._style = style;
    this._protection = protection;
  }

  _createClass(SearchFilter, [{
    key: "getSearchDescription",
    value: function getSearchDescription() {
      return this._searchDescription;
    }
  }, {
    key: "getSearchAddress",
    value: function getSearchAddress() {
      return this._searchAddress;
    }
  }, {
    key: "getPhoto",
    value: function getPhoto() {
      return this._photo;
    }
  }, {
    key: "getCoordinates",
    value: function getCoordinates() {
      return this._coordinates;
    }
  }, {
    key: "getType",
    value: function getType() {
      return this._type;
    }
  }, {
    key: "getStyle",
    value: function getStyle() {
      return this._style;
    }
  }, {
    key: "getProtection",
    value: function getProtection() {
      return this._protection;
    }
  }]);

  return SearchFilter;
}();

/***/ }),
/* 17 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ChangesDescription", function() { return ChangesDescription; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var ChangesDescription =
/*#__PURE__*/
function () {
  function ChangesDescription(description, isMinor) {
    _classCallCheck(this, ChangesDescription);

    this._description = description;
    this._isMinor = isMinor;
  }

  _createClass(ChangesDescription, [{
    key: "getDescription",
    value: function getDescription() {
      return this._description;
    }
  }, {
    key: "getIsMinor",
    value: function getIsMinor() {
      return this._isMinor;
    }
  }]);

  return ChangesDescription;
}();

/***/ }),
/* 18 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ArrayUtils", function() { return ArrayUtils; });
var ArrayUtils = {
  hasElement: function hasElement(array, element) {
    return array.indexOf(element) >= 0;
  },
  inArray: function inArray(element, array) {
    return this.hasElement(array, element);
  },
  diff: function diff(array1, array2) {
    var _this = this;

    return array1.filter(function (item) {
      return !_this.inArray(item, array2);
    });
  },
  consistsOnlyOf: function consistsOnlyOf(array, items) {
    var arrayUnique = this.unique(array);
    var itemsUnique = this.unique(items);
    arrayUnique.sort();
    itemsUnique.sort();

    for (var i = 0; i < arrayUnique.length; i++) {
      if (!this.inArray(arrayUnique[i], itemsUnique[i])) {
        return false;
      }
    }

    return true;
  },
  unique: function unique(array) {
    return array.filter(function (value, index) {
      return array.indexOf(value) === index;
    });
  }
};

/***/ }),
/* 19 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsyncUtils", function() { return AsyncUtils; });
var AsyncUtils = {
  runSequence: function runSequence(functions, onSuccess, results) {
    if (!results) {
      results = [];
    }

    if (functions.length > 0) {
      var firstFunction = functions[0];
      firstFunction(function (result) {
        results.push(result);
        setTimeout( // hack to break recursion chain
        function () {
          AsyncUtils.runSequence(functions.slice(1), onSuccess, results);
        }, 0);
      });
    } else {
      if (onSuccess) {
        onSuccess(results);
      }
    }
  },
  runChunks: function runChunks(runSingleChunkFunction, maxChunkSize, data, onSuccess) {
    var chunkRunFunctions = [];

    var _loop = function _loop(dataNumStart) {
      var dataChunk = data.slice(dataNumStart, dataNumStart + maxChunkSize);
      chunkRunFunctions.push(function (onSuccess) {
        return runSingleChunkFunction(dataChunk, onSuccess);
      });
    };

    for (var dataNumStart = 0; dataNumStart < data.length; dataNumStart += maxChunkSize) {
      _loop(dataNumStart);
    }

    this.runSequence(chunkRunFunctions, function (chunkResults) {
      var result = chunkResults.reduce(function (current, total) {
        return total.concat(current);
      }, []);
      onSuccess(result);
    });
  }
};

/***/ }),
/* 20 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WikivoyageApi", function() { return WikivoyageApi; });
var WikivoyageApi = {
  baseUrl: 'https://ru.wikivoyage.org/w/api.php',
  executeRequest: function executeRequest(parameters, onSuccess, onFailure) {
    $.ajax({
      url: this.baseUrl,
      data: parameters,
      crossDomain: true,
      dataType: 'jsonp'
    }).done(function (data) {
      onSuccess(data);
    }).fail(function () {
      if (onFailure) {
        onFailure();
      }
    });
  },
  getPage: function getPage(page, onSuccess) {
    this.executeRequest({
      'action': 'query',
      'prop': 'revisions',
      'rvprop': 'content',
      'rvlimit': '1',
      'titles': page,
      'format': 'json'
    }, function (data) {
      if (!data || !data.query || !data.query.pages) {
        return;
      }

      var pages = data.query.pages;
      var firstPage = pages[Object.keys(pages)[0]];

      if (!firstPage || !firstPage.revisions || firstPage.revisions.length <= 0) {
        return;
      }

      onSuccess(firstPage.revisions[0]['*']);
    });
  },
  getImageInfo: function getImageInfo(image, onSuccess, onFailure) {
    var self = this;
    self.executeRequest({
      'action': 'query',
      'titles': image,
      'prop': 'imageinfo',
      'iiprop': 'url',
      'iiurlwidth': '200',
      'iiurlheight': '200',
      'format': 'json'
    }, function (data) {
      if (!data.query || !data.query.pages) {
        if (onFailure) {
          onFailure();
        }

        return;
      }

      var pages = data.query.pages;
      var firstPage = pages[Object.keys(pages)[0]];

      if (!firstPage || !firstPage.imageinfo || firstPage.imageinfo.length <= 0) {
        if (onFailure) {
          onFailure();
        }

        return;
      }

      var imageInfo = firstPage.imageinfo[0];
      onSuccess({
        'image': image,
        'thumb': imageInfo.thumburl,
        'url': imageInfo.url
      });
    }, function () {
      if (onFailure) {
        onFailure();
      }
    });
  }
};

/***/ }),
/* 21 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CulturalEditorListingSerializer", function() { return CulturalEditorListingSerializer; });
/* harmony import */ var _listing_serializer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(22);

var CulturalEditorListingSerializer = {
  serializeListingData: function serializeListingData(listingData) {
    var serializer = new _listing_serializer__WEBPACK_IMPORTED_MODULE_0__["ListingSerializer"]('monument', listingData);
    serializer.writeListingStart();
    serializer.writeParametersLine(['type', 'status']);
    serializer.writeParametersLine(['lat', 'long', 'precise']);
    serializer.writeParameterLine('name');
    serializer.writeParametersLine(['knid', 'complex'], ['complex']);
    serializer.writeParameterLine('knid-new');
    serializer.writeParametersLine(['region', 'district']);
    serializer.writeParametersLine(['municipality', 'munid']);
    serializer.writeParameterLine('block', true);
    serializer.writeParameterLine('address');
    serializer.writeParametersLine(['year', 'author']);
    serializer.writeParameterLine('style', true);
    serializer.writeParameterLine('description');
    serializer.writeParameterLine('image');
    serializer.writeParameterLine('wdid');
    serializer.writeParameterLine('wiki');
    serializer.writeParametersLine(['commonscat', 'protection'], ['protection']);
    serializer.writeParameterLine('link');
    serializer.writeParameterLine('linkextra', true);
    serializer.writeParameterLine('document', true);
    serializer.writeParameterLine('doc', true);
    serializer.writeParameterLine('style', true);
    serializer.writeParameterLine('protection', true);
    serializer.writeParameterLine('dismissed', true);
    serializer.writeOtherNonEmptyParameters();
    serializer.writeListingEnd();
    return serializer.getSerializedListing();
  }
};

/***/ }),
/* 22 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ListingSerializer", function() { return ListingSerializer; });
/* harmony import */ var _array_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(18);
/* harmony import */ var _string_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5);
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }



var ListingSerializer =
/*#__PURE__*/
function () {
  function ListingSerializer(listingType, listingData) {
    _classCallCheck(this, ListingSerializer);

    this._listingType = listingType;
    this._listingData = listingData;
    this._serializedListing = '';
    this._serializedParameters = [];
  }

  _createClass(ListingSerializer, [{
    key: "writeListingStart",
    value: function writeListingStart(addNewline) {
      this._serializedListing += '{{' + this._listingType;

      if (addNewline) {
        this._serializedListing += '\n';
      } else {
        this._serializedListing += ' ';
      }
    }
  }, {
    key: "writeParameterLine",
    value: function writeParameterLine(parameterName, isOptional) {
      var parameterValue = this._getParameterValue(parameterName);

      if (isOptional && parameterValue === '') {
        return;
      }

      this._serializedListing += ListingSerializer._parameterString(parameterName, parameterValue, true);

      this._serializedParameters.push(parameterName);
    }
  }, {
    key: "writeParametersLine",
    value: function writeParametersLine(parameterNames, optionalParameters) {
      var _this = this;

      var isFirst = true;
      parameterNames.forEach(function (parameterName) {
        var parameterValue = _this._getParameterValue(parameterName);

        var isOptional = optionalParameters && _array_utils__WEBPACK_IMPORTED_MODULE_0__["ArrayUtils"].inArray(parameterName, optionalParameters);

        if (isOptional && parameterValue === '') {
          return;
        }

        if (!isFirst) {
          _this._serializedListing += ' ';
        }

        _this._serializedListing += ListingSerializer._parameterString(parameterName, parameterValue, false);

        _this._serializedParameters.push(parameterName);

        isFirst = false;
      });

      if (!isFirst) {
        this._serializedListing += '\n';
      }
    }
  }, {
    key: "writeOtherNonEmptyParameters",
    value: function writeOtherNonEmptyParameters() {
      var _this2 = this;

      var allParameterNames = Object.keys(this._listingData);
      var otherParameterNames = _array_utils__WEBPACK_IMPORTED_MODULE_0__["ArrayUtils"].diff(allParameterNames, this._serializedParameters);
      otherParameterNames.forEach(function (parameterName) {
        var parameterValue = _this2._getParameterValue(parameterName);

        if (parameterValue !== '') {
          _this2._serializedListing += ListingSerializer._parameterString(parameterName, parameterValue, true);
        }
      });
    }
  }, {
    key: "writeListingEnd",
    value: function writeListingEnd() {
      this._serializedListing += '}}';
    }
  }, {
    key: "getSerializedListing",
    value: function getSerializedListing() {
      return this._serializedListing;
    }
  }, {
    key: "_getParameterValue",
    value: function _getParameterValue(parameterName) {
      return _string_utils__WEBPACK_IMPORTED_MODULE_1__["StringUtils"].emptyToString(this._listingData[parameterName]);
    }
  }], [{
    key: "_parameterString",
    value: function _parameterString(parameterName, parameterValue, addNewline) {
      var result = '|' + parameterName + '= ' + parameterValue;

      if (addNewline) {
        result += '\n';
      }

      return result;
    }
  }]);

  return ListingSerializer;
}();

/***/ }),
/* 23 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MediaWikiPageWikitext", function() { return MediaWikiPageWikitext; });
/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(24);

var api = new mw.Api();
var MediaWikiPageWikitext = {
  loadSectionWikitext: function loadSectionWikitext(sectionIndex, onSuccess) {
    $.ajax({
      url: mw.util.wikiScript(''),
      data: {
        title: mw.config.get('wgPageName'),
        action: 'raw',
        section: sectionIndex
      },
      cache: false
    }).done(function (data) {
      onSuccess(data);
    }).fail(function (jqXHR, textStatus, errorThrown) {
      alert('Ошибка при получении исходного вики-текста статьи: ' + textStatus + ' ' + errorThrown);
    });
  },
  saveSectionWikitext: function saveSectionWikitext(sectionIndex, sectionWikitext, changesSummary, changesIsMinor, captchaId, captchaAnswer, onSuccess, onFailure, onCaptcha, pageName) {
    if (!pageName) {
      pageName = mw.config.get("wgPageName");
    }

    var editPayload = {
      action: "edit",
      title: pageName,
      text: sectionWikitext,
      summary: changesSummary,
      captchaid: captchaId,
      captchaword: captchaAnswer
    };

    if (sectionIndex !== null) {
      $.extend(editPayload, {
        section: sectionIndex
      });
    }

    if (changesIsMinor) {
      $.extend(editPayload, {
        minor: 'true'
      });
    }

    api.postWithToken("csrf", editPayload).done(function (data) {
      if (data && data.edit && data.edit.result === 'Success') {
        onSuccess();
      } else if (data && data.error) {
        onFailure(_messages__WEBPACK_IMPORTED_MODULE_0__["commonMessages"].submitApiError + ' "' + data.error.code + '": ' + data.error.info);
      } else if (data && data.edit.spamblacklist) {
        onFailure(_messages__WEBPACK_IMPORTED_MODULE_0__["commonMessages"].submitBlacklistError + ': ' + data.edit.spamblacklist);
      } else if (data && data.edit.captcha) {
        onCaptcha(data.edit.captcha.url, data.edit.captcha.id);
      } else {
        onFailure(_messages__WEBPACK_IMPORTED_MODULE_0__["commonMessages"].submitUnknownError);
      }
    }).fail(function (code, result) {
      if (code === "http") {
        onFailure(_messages__WEBPACK_IMPORTED_MODULE_0__["commonMessages"].submitHttpError + ': ' + result.textStatus);
      } else if (code === "ok-but-empty") {
        onFailure(_messages__WEBPACK_IMPORTED_MODULE_0__["commonMessages"].submitEmptyError);
      } else {
        onFailure(_messages__WEBPACK_IMPORTED_MODULE_0__["commonMessages"].submitUnknownError + ': ' + code);
      }
    });
  },
  getSectionName: function getSectionName(sectionWikitext) {
    var HEADING_REGEX = /^=+\s*([^=]+)\s*=+\s*\n/;
    var result = HEADING_REGEX.exec(sectionWikitext);
    return result !== null ? result[1].trim() : "";
  }
};

/***/ }),
/* 24 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commonMessages", function() { return commonMessages; });
var commonMessages = {
  addTitle: 'Добавить объект',
  editTitle: 'Редактировать объект',
  submitApiError: 'Во время сохранения листинга на сервере произошла ошибка, пожайлуста, попробуйте сохранить ещё раз',
  submitBlacklistError: 'Ошибка: текст содержит ссылку из чёрного списка, пожайлуста, удалите её и попробуйте сохранить снова',
  submitUnknownError: 'Ошибка: при попытке сохранить листинг произошла неизвестная ошибка, пожайлуста, попробуйте сохранить ещё раз',
  submitHttpError: 'Ошибка: сервер сообщил о HTTP ошибке, возникшей во время сохранения листинга, пожайлуста, попробуйте сохранить ещё раз',
  submitEmptyError: 'Ошибка: сервер вернул пустой ответ при попытке сохранить листинг, пожайлуста, попробуйте сохранить ещё раз',
  enterCaptcha: 'Введите CAPTCHA',
  changesSummaryAdded: 'Добавлен объект',
  changesSummaryUpdated: 'Обновлён объект',
  captchaSubmit: 'Продолжить',
  captchaCancel: 'Отмена'
};

/***/ }),
/* 25 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "downloadContent", function() { return downloadContent; });
// https://stackoverflow.com/questions/3665115/create-a-file-in-memory-for-user-to-download-not-through-server
var downloadContent = function downloadContent(filename, text) {
  var element = document.createElement('a');
  element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
  element.setAttribute('download', filename);
  element.style.display = 'none';
  document.body.appendChild(element);
  element.click();
  document.body.removeChild(element);
};

/***/ }),
/* 26 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExportPanel", function() { return ExportPanel; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var ExportPanel =
/*#__PURE__*/
function () {
  function ExportPanel(onExportJson, onExportGpx) {
    _classCallCheck(this, ExportPanel);

    this._onExportJson = onExportJson;
    this._onExportGpx = onExportGpx;
  }

  _createClass(ExportPanel, [{
    key: "render",
    value: function render() {
      var _this = this;

      var exportPanel = $('<div style="float: right;">');
      var exportJsonLink = $("<a>").text('[JSON]');
      exportPanel.append(exportJsonLink);
      exportJsonLink.click(function () {
        return _this._onExportJson();
      });
      exportPanel.append('&nbsp;');
      var exportGpxLink = $("<a>").text('[GPX]');
      exportPanel.append(exportGpxLink);
      exportGpxLink.click(function () {
        return _this._onExportGpx();
      });
      return exportPanel;
    }
  }]);

  return ExportPanel;
}();

/***/ }),
/* 27 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CommonsApi", function() { return CommonsApi; });
/* harmony import */ var _async_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(19);

var CommonsApi = {
  baseUrl: 'https://commons.wikimedia.org/w/api.php',
  executeRequest: function executeRequest(parameters, onSuccess) {
    $.ajax({
      url: this.baseUrl,
      data: parameters,
      crossDomain: true,
      dataType: 'jsonp'
    }).done(function (data) {
      onSuccess(data);
    });
  },
  getCategoryFiles: function getCategoryFiles(category, limit, onSuccess) {
    var self = this;
    self.executeRequest({
      'action': 'query',
      'list': 'categorymembers',
      'cmtype': 'file',
      'cmtitle': 'Category:' + category,
      'cmlimit': 'max',
      'format': 'json'
    }, function (data) {
      if (data.query && data.query.categorymembers) {
        var files = [];
        data.query.categorymembers.forEach(function (member) {
          if (member.title) {
            files.push(member.title);
          }
        });
        onSuccess(files);
      }
    });
  },
  getCategoryImages: function getCategoryImages(category, limit, onSucess) {
    this.getCategoryFiles(category, limit, function (files) {
      var images = [];
      files.forEach(function (file) {
        var extension = file.toLowerCase().substr(file.length - 4);

        if (extension === '.jpg' || extension === '.png' || extension === '.gif') {
          images.push(file);
        }
      });
      onSucess(images);
    });
  },
  getImageInfo: function getImageInfo(image, onSuccess) {
    var self = this;
    self.executeRequest({
      'action': 'query',
      'titles': image,
      'prop': 'imageinfo|revisions',
      'iiprop': 'url',
      'iiurlwidth': '200',
      'iiurlheight': '200',
      'rvprop': 'content',
      'rvlimit': '1',
      'format': 'json'
    }, function (data) {
      if (!data.query || !data.query.pages) {
        return;
      }

      var pages = data.query.pages;
      var firstPage = pages[Object.keys(pages)[0]];

      if (!firstPage || !firstPage.imageinfo || firstPage.imageinfo.length <= 0) {
        return;
      }

      var text = '';

      if (firstPage.revisions && firstPage.revisions.length > 0) {
        var revision = firstPage.revisions[0];

        if (revision['*']) {
          text = revision['*'];
        }
      }

      var imageInfo = firstPage.imageinfo[0];
      onSuccess({
        'image': image,
        'thumb': imageInfo.thumburl,
        'text': text,
        'url': imageInfo.url
      });
    });
  },
  getImagesInfo: function getImagesInfo(images, onSuccess) {
    var self = this;
    _async_utils__WEBPACK_IMPORTED_MODULE_0__["AsyncUtils"].runSequence(images.map(function (image) {
      return function (onSuccess) {
        self.getImageInfo(image, onSuccess);
      };
    }), function (imageInfos) {
      onSuccess(imageInfos);
    });
  },

  /**
   *
   * @param categories list of category titles, e.g. ['Novosibirsk', 'Tomsk', 'Culture_of_Novosibirsk']
   * @param onSuccess function which accepts single argument - list which has category
   * titles for each category which has at least one file, e.g.
   * ['Novosibirsk': 'Culture_of_Novosibirsk']
   */
  hasCategoriesFiles: function hasCategoriesFiles(categories, onSuccess) {
    var _this = this;

    var maxChunkSize = 30;
    _async_utils__WEBPACK_IMPORTED_MODULE_0__["AsyncUtils"].runChunks(function (categoriesChunk, onSuccess) {
      _this.executeRequest({
        action: 'query',
        titles: categoriesChunk.join("|"),
        prop: 'categoryinfo',
        format: 'json'
      }, function (data) {
        var result = [];

        if (!data || !data.query || !data.query.pages) {
          return;
        }

        Object.keys(data.query.pages).forEach(function (key) {
          var pageInfo = data.query.pages[key];

          if (pageInfo.title && pageInfo.categoryinfo && pageInfo.categoryinfo.files && pageInfo.categoryinfo.files > 0) {
            result.push(pageInfo.title);
          }
        });
        onSuccess(result);
      });
    }, maxChunkSize, categories, onSuccess);
  },

  /**
   *
   * @param categories list of category titles, e.g. ['Novosibirsk', 'Tomsk', 'Culture_of_Novosibirsk']
   * @param onSuccess function which accepts single argument -  list where each item has category
   * title and files count, e.g. [
   *   {category: 'Novosibirsk', files: 51},
   *   {category: 'Tomsk', files: 42}
   *   {category: 'Culture_of_Novosibirsk', files: 48}
   * ]
   */
  countCategoriesFiles: function countCategoriesFiles(categories, onSuccess) {
    var _this2 = this;

    var maxChunkSize = 30;
    _async_utils__WEBPACK_IMPORTED_MODULE_0__["AsyncUtils"].runChunks(function (categoriesChunk, onSuccess) {
      _this2.executeRequest({
        action: 'query',
        titles: categoriesChunk.join("|"),
        prop: 'categoryinfo',
        format: 'json'
      }, function (data) {
        var result = [];

        if (!data || !data.query || !data.query.pages) {
          return;
        }

        Object.keys(data.query.pages).forEach(function (key) {
          var pageInfo = data.query.pages[key];

          if (pageInfo.title) {
            var filesCount = pageInfo.categoryinfo && pageInfo.categoryinfo.files ? pageInfo.categoryinfo.files : 0;
            result.push({
              category: pageInfo.title,
              files: filesCount
            });
          }
        });
        onSuccess(result);
      });
    }, maxChunkSize, categories, onSuccess);
  }
};

/***/ }),
/* 28 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CommonsImagesLoader", function() { return CommonsImagesLoader; });
/* harmony import */ var _commons_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(27);

var CommonsImagesLoader = {
  loadImagesFromWLMCategory: function loadImagesFromWLMCategory(knid, onSuccess) {
    var _this = this;

    if (!knid) {
      onSuccess([]);
    } else {
      _commons_api__WEBPACK_IMPORTED_MODULE_0__["CommonsApi"].getCategoryImages('WLM/' + knid, 'max', function (images) {
        return _this.loadImages(images, onSuccess);
      });
    }
  },
  loadImagesFromWLECategory: function loadImagesFromWLECategory(knid, onSuccess) {
    var _this2 = this;

    if (!knid) {
      onSuccess([]);
    } else {
      _commons_api__WEBPACK_IMPORTED_MODULE_0__["CommonsApi"].getCategoryImages('Protected_areas_of_Russia/' + knid, 'max', function (images) {
        return _this2.loadImages(images, onSuccess);
      });
    }
  },
  loadImagesFromCommonsCategory: function loadImagesFromCommonsCategory(commonsCat, onSuccess) {
    var _this3 = this;

    if (!commonsCat) {
      onSuccess([]);
    } else {
      _commons_api__WEBPACK_IMPORTED_MODULE_0__["CommonsApi"].getCategoryImages(commonsCat, 'max', function (images) {
        return _this3.loadImages(images, onSuccess);
      });
    }
  },
  loadImages: function loadImages(images, onSuccess) {
    _commons_api__WEBPACK_IMPORTED_MODULE_0__["CommonsApi"].getImagesInfo(images, onSuccess);
  }
};

/***/ }),
/* 29 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CulturalGalleryImages", function() { return CulturalGalleryImages; });
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var CulturalGalleryImages =
/*#__PURE__*/
function () {
  function CulturalGalleryImages(wlmImages, commonsImages) {
    _classCallCheck(this, CulturalGalleryImages);

    this._wlmImages = wlmImages;
    this._commonsImages = commonsImages;
  }

  _createClass(CulturalGalleryImages, [{
    key: "getWlmImages",
    value: function getWlmImages() {
      return this._wlmImages;
    }
  }, {
    key: "hasWlmImages",
    value: function hasWlmImages() {
      return CulturalGalleryImages._hasImages(this.getWlmImages());
    }
  }, {
    key: "getCommonsImages",
    value: function getCommonsImages() {
      return this._commonsImages;
    }
  }, {
    key: "hasCommonsImages",
    value: function hasCommonsImages() {
      return CulturalGalleryImages._hasImages(this.getCommonsImages());
    }
  }], [{
    key: "_hasImages",
    value: function _hasImages(images) {
      return images !== undefined && images !== null && images.length > 0;
    }
  }]);

  return CulturalGalleryImages;
}();

/***/ })
/******/ ]);