// Функция обработчик движения слайдера
function SliderOnFinishMoving(data) {
CurrentMinYear = data.min;
CurrentMaxYear = data.max;
GetAllPoints(CurrentMinYear, CurrentMaxYear);
}
function OnFindNameUsing(name) {
// Добавить в коллекцию, чтобы гарантировать что данный объект появится на карте
Collections.FindName = name;
// Найти метку в коллекции всех меток
var placemark = Collections.AllGeoObjects.search('options.Name = "' + name + '"').get(0);
// Установить новый цвет
placemark.options.set('preset', 'islands#greenStretchyIcon');
// Отцентрировать карту и приблизить
Map.setCenter(placemark.geometry.getCoordinates(), 13);
// Через 5 секунд вернуть обратно прежний цвет
setTimeout(changePlacemarkPreset, 5000, placemark, 'islands#redStretchyIcon');
}
function changePlacemarkPreset(placemark, preset) {
placemark.options.set('preset', preset);
}
// Заполнение массивов из исходного (response.data)
// В соответствии с параметрами поселения
function FillDataArrays(fromData, isNeedSelect = false) {
Collections.AllGeoObjects.removeFromMap(Map);
Collections.All = new Array();
Collections.AllGeoObjects = new ymaps.geoQuery();
Collections.SettlementTypes = new Array();
Collections.Regions = new Array();
Collections.Names = new Array();
Collections.FindName = '';
Collections.isNeedFilters = false;
Collections.Names = fromData.arrayNameSettlements;
Collections.SettlementTypes = fromData.arrayNameTypes;
Collections.Regions = fromData.arrayNameRegions;
AutoCompleteInit(Collections.Names);
filterCollectionInit(Collections.Filters.Type, Collections.SettlementTypes, 'filterGroupTypes', 'countTypes');
filterCollectionInit(Collections.Filters.Region, Collections.Regions, 'filterGroupRegions', 'countRegions');
Collections.All = fromData.arraySettlements;
LoadCollection(fromData.arraySettlements, isNeedSelect, );
}
// Функция заполнения Яндекс-коллекций Яндекс-объектами из JSON массива
function LoadCollection(fromData, isNeedSelect = false) {
fromData.forEach(function (element) {
Collections.AllGeoObjects = Collections.AllGeoObjects.add(CreateYandexPlacemark(element)); // Добавление
});
if (isNeedSelect)
SelectDataFromArrays();
}
// Согласно текущим установленным фильтрам собрать нужный массив данных
function SelectDataFromArrays() {
var insideMap = Collections.AllGeoObjects.searchInside(Map);
var afterFilters = new ymaps.geoQuery();
if (!Collections.isNeedFilters)
afterFilters = insideMap;
else
{
var typeFilters = new ymaps.geoQuery();
var regionFilters = new ymaps.geoQuery();
// тут применить фильтры
// объединить по признаку типа
// объединить по признаку региона
// пересечь две выборки
for (e in Collections.Filters.Type) {
if (Collections.Filters.Type[e]) {
typeFilters = insideMap.search('options.Types regexp "{' + e + '}"').add(typeFilters);
}
}
for (e in Collections.Filters.Region) {
if (Collections.Filters.Region[e]) {
regionFilters = insideMap.search('options.Regions regexp "{' + e + '}"').add(regionFilters);
}
}
afterFilters = typeFilters.intersect(regionFilters).sort('options.Population desc');
}
var CollectionVisible = afterFilters.slice(0, Collections.VisibleCount).addToMap(Map);
// Оставшиеся объекты будем удалять с карты.
Collections.AllGeoObjects.remove(CollectionVisible).removeFromMap(Map).getLength();
}
// Функция создания Яндекс-объекта из одного элемента JSON массива
function CreateYandexPlacemark(fromElement) {
var coord = fromElement.Position.split(' ');
var placemark = new ymaps.Placemark([coord[0], coord[1]],
{
iconContent: fromElement.Title, // Содержимое названия
hintContent: fromElement.Position// Содержимое подписи при наведении
},
{
preset: 'islands#redStretchyIcon'
}
);
function compose (elem) {
var t = '';
fromElement[elem].forEach(function (element) {
t += ' {' + element + '}';
});
return t + ' ';
}
//Добавить свойство - Имя поселения
placemark.options.set('Name', fromElement.Title);
placemark.options.set('URL', fromElement.URL);
placemark.options.set('Population', fromElement.Population);
placemark.options.set('Types', compose('Type'));
placemark.options.set('Regions', compose('Region'));
// Переопределяем стадартный обработчик нажатия
placemark.events.add('click', function (e) {
e.preventDefault(); // Запрещаем стандартный обработчик
var targetURL = e.get('target').options.get('URL');
// Вызов запроса на получение данных о поселении
GetInfoAboutSettlement(targetURL, PrintInfoAboutSettlement);
// Показать боковую панель
if ($('#sidebar-left, #content').hasClass('active')) {
// Панель скрыта. Должна выехать
$('#sidebar-left, #content').removeClass('active');
$('.collapse.in').toggleClass('in');
$('a[aria-expanded=true]').attr('aria-expanded', 'false');
}
else
// Панель есть. Выбор, нужно ли её скрывать
if (targetURL == document.getElementById('settlement-url').innerHTML) {
$('#sidebar-left, #content').addClass('active');
$('.collapse.in').toggleClass('in');
$('a[aria-expanded=true]').attr('aria-expanded', 'false');
}
});
return placemark;
}
// функция динамической сортировки
function compareValues(key, order = 'asc') {
return function (a, b) {
if (!a.hasOwnProperty(key) || !b.hasOwnProperty(key)) {
// свойства нет ни в одном из объектов
return 0;
}
const varA = (typeof a[key] === 'string') ?
a[key].toUpperCase() : a[key];
const varB = (typeof b[key] === 'string') ?
b[key].toUpperCase() : b[key];
let comparison = 0;
if (varA > varB) {
comparison = 1;
} else if (varA < varB) {
comparison = -1;
}
return (
(order == 'desc') ? (comparison * -1) : comparison
);
};
}
function OpenRightPanel(addclass) {
$('#sidebar-right, #content').removeClass('active');
$('#sidebar-right, #content').addClass(addclass);
$('.collapse.in').toggleClass('in');
$('a[aria-expanded=true]').attr('aria-expanded', 'false');
}
function CloseRightPanel() {
$('#sidebar-right, #content').addClass('active');
$('#sidebar-right, #content').removeClass('export');
$('#sidebar-right, #content').removeClass('import');
$('.collapse.in').toggleClass('in');
$('a[aria-expanded=true]').attr('aria-expanded', 'false');
}
function exportSidebarButton() {
// панель закрыта
if ($('#sidebar-right, #content').hasClass('active')) {
switchRightSidebar('export');
OpenRightPanel('export');
}// панель открыта
else {
// был открыт импорт, нужно обновить содержимое
if ($('#sidebar-right, #content').hasClass('import')) {
switchRightSidebar('export');
$('#sidebar-right, #content').removeClass('import');
$('#sidebar-right, #content').addClass('export');
}
// был открыт экспорт, при повторном нажатии нужно скрыть панель
//else
// CloseRightPanel();
}
}
function importSidebarButton() {
// панель закрыта
if ($('#sidebar-right, #content').hasClass('active')) {
switchRightSidebar('import');
OpenRightPanel('import');
}// панель открыта
else {
// был открыт экспорт, нужно обновить содержимое
if ($('#sidebar-right, #content').hasClass('export')) {
switchRightSidebar('import');
$('#sidebar-right, #content').removeClass('export');
$('#sidebar-right, #content').addClass('import');
}
// был открыт импорт, при повторном нажатии нужно скрыть панель
//else
// CloseRightPanel();
}
}
function switchRightSidebar(flag) {
if (flag === 'export')
{
printExportCollection();
document.getElementById('sidebar-right-header-title').innerHTML = 'Экспорт';
document.getElementById('export-to-word').hidden = false;
document.getElementById('export-to-excel').hidden = false;
document.getElementById('sidebar-right-text-export').hidden = false;
document.getElementById('import-button').hidden = true;
document.getElementById('sidebar-right-text-import').hidden = true;
} else if (flag === 'import')
{
document.getElementById('sidebar-right-header-title').innerHTML = 'Импорт';
document.getElementById('export-to-word').hidden = true;
document.getElementById('export-to-excel').hidden = true;
document.getElementById('sidebar-right-text-export').hidden = true;
document.getElementById('import-button').hidden = false;
document.getElementById('sidebar-right-text-import').hidden = false;
}
}
function checkBoxChange(e) {
if (e.checked) {
// пользователь передумал и решил вернуть поселение в экспорт
var element = new Object();
element.name = e.parentElement.innerText;
element.url = e.id;
Collections.Export.push(element);
}
else
{
// пользователь убрал отметку экспорта. удаляем поселение из коллекции
// но отрисовку пока не делаем, вдруг он захочет вернуть отметку (т.е. добавить в экспорт)
Collections.Export = jQuery.grep(Collections.Export, function (element) {
return element.url != e.id;
});
}
}
function addToExport() {
var element = new Object();
element.name = $("#settlement-title")[0].innerHTML;
element.url = $("#settlement-url")[0].innerHTML;
// нельзя добавить уже добавленное поселение
if (!Collections.Export.some(currentValue => currentValue.url == element.url)){
Collections.Export.push(element);
printExportCollection();
}
}
function filterRegionChange(e) {
//console.log($("#"+e.id));
var name = e.parentElement.parentElement.parentElement.children[1].innerText;
Collections.Filters.Region[name] = e.checked;
}
function filterTypeChange(e) {
//console.log($("#" + e.id));
var name = e.parentElement.parentElement.parentElement.children[1].innerText;
Collections.Filters.Type[name] = e.checked;
}
function defaultFilters() {
for (e in Collections.Filters.Type) {
Collections.Filters.Type[e] = true;
}
for (e in Collections.Filters.Region) {
Collections.Filters.Region[e] = true;
}
$("#filterGroups input").each(function (index, element) {
element.checked = true;
});
Collections.isNeedFilters = false;
SelectDataFromArrays();
//console.log($("#filterGroupRegions")[0].children);
}
function activeFilters() {
Collections.isNeedFilters = true;
SelectDataFromArrays();
}
function checkOriginImportForm() {
// выставить значения по дефолту
//$('input').removeClass('is-valid');
$('input').removeClass('is-invalid');
$("#lat-error")[0].innerHTML = 'Неверное значение.';
$("#long-error")[0].innerHTML = 'Неверное значение.';
$("#hasBeginning-error")[0].innerHTML = 'Не верный год.';
var form_data = new Array();
form_data["url"] = $("input#import-url");
form_data["title"] = $("input#import-title");
form_data["lat"] = $("input#import-lat");
form_data["long"] = $("input#import-long");
form_data["founder"] = $("input#import-founder");
form_data["hasBeginning"] = $("input#import-hasBeginning");
form_data["legend"] = $("textarea#import-legend");
var valid = true;
// регулярное выражение:
// ^ - с начала строки
// \d\d - две цифры
// [.] - разделитель точка
// \d+ - после разделителя 1 и более цифр
// $ - окончание строки
// гарантирует, что введенное значение является координатой
var coordValidate = /^\d\d[.]\d+$/;
var lat = form_data["lat"].val();
var long = form_data["long"].val();
if (!coordValidate.test(lat)) {
// значение не соответствует шаблону
// вывод ошибки
$('#import-lat, #content').addClass('is-invalid');
valid = false;
}
else if (Number(lat) < Collections.MapArea[0][0] || Number(lat) > Collections.MapArea[1][0]) {
// значение не попадает в пределы карты
$("#lat-error")[0].innerHTML = 'Значение не попадает в пределы карты.';
valid = false;
$('#import-lat, #content').addClass('is-invalid');
}
if (!coordValidate.test(long)) {
// значение не соответствует шаблону
// вывод ошибки
$('#import-long, #content').addClass('is-invalid');
valid = false;
}
else if (Number(long) < Collections.MapArea[0][1] || Number(long) > Collections.MapArea[1][1]) {
// значение не попадает в пределы карты
$("#long-error")[0].innerHTML = 'Значение не попадает в пределы карты.';
valid = false;
$('#import-long, #content').addClass('is-invalid');
}
var year = form_data["hasBeginning"].val();
if (year != '') {
var yearValidate = /^\d{1,4}$/;
if (!yearValidate.test(year)) {
// значение не соответствует шаблону
// вывод ошибки
$('#import-hasBeginning, #content').addClass('is-invalid');
valid = false;
}
else if (Number(year) > MaxYear) {
// значение больше текущего года
$("#hasBeginning-error")[0].innerHTML = 'Значение больше текущего года';
valid = false;
$('#import-hasBeginning, #content').addClass('is-invalid');
}
}
// если поля формы верны, составляем строку и возвращаем её для отправки на сервер
if (valid) {
var y = '';
for (key in form_data) {
// если поле это url
// ему нужна доп проверка
if (key == 'url') {
y += '|' + key + '~';
// если НЕ установлен флаг "только чтение", т.е. пользователь ВВЕЛ СВОЙ url
if (!form_data[key][0].readOnly)
y += form_data[key].val();
// иначе url считается пустым и будет создан на сервере
}
else
y += '|' + key + '~' + form_data[key].val();
}
y += '|';
return y;
}
// если поля не верны, пользователь увидит ошибку, а вместо строки вернем null
else
return null;
}
function checkEditedImportForm() {
// выставить значения по дефолту
//$('input').removeClass('is-valid');
$('input').removeClass('is-invalid');
$("#edited-hasBeginning-error")[0].innerHTML = 'Не верный год.';
var form_data = new Array();
form_data["url"] = $("input#import-edited-url");
form_data["beforeTitle"] = $("input#import-before-title");
form_data["beforeUrl"] = $("input#import-before-url");
form_data["hasBeginning"] = $("input#import-edited-hasBeginning");
form_data["source"] = $("input#import-edited-source");
form_data["title"] = $("input#import-edited-title");
form_data["populationAll"] = $("input#import-edited-populationAll");
form_data["populationFemale"] = $("input#import-edited-populationFemale");
form_data["populationMale"] = $("input#import-edited-populationMale");
form_data["region"] = $("#import-edited-region");
form_data["type"] = $("#import-edited-type");
//Вот так можно получить значение атрибута value, выбранной опции:
//console.log($("#test_228").val());
//А вот так можно получить текст выбранной опции:
//console.log($("#test_228 option:selected").text());
var valid = true;
var year = form_data["hasBeginning"].val();
if (year != '') {
var yearValidate = /^\d{1,4}$/;
if (!yearValidate.test(year)) {
// значение не соответствует шаблону
// вывод ошибки
$('#import-edited-hasBeginning, #content').addClass('is-invalid');
valid = false;
}
else if (Number(year) > MaxYear) {
// значение больще текущего года
$("#edited-hasBeginning-error")[0].innerHTML = 'Значение больше текущего года';
valid = false;
$('#import-edited-hasBeginning, #content').addClass('is-invalid');
}
}
var digitValidate = /^\d+$/;
var popAll = form_data["populationAll"].val();
var popMale = form_data["populationMale"].val();
var popFemale = form_data["populationFemale"].val();
if (popAll != '') {
if (!digitValidate.test(popAll)) {
// значение не соответствует шаблону
// вывод ошибки
$('#import-edited-populationAll, #content').addClass('is-invalid');
valid = false;
}
}
if (popMale != '') {
if (!digitValidate.test(popMale)) {
// значение не соответствует шаблону
// вывод ошибки
$('#import-edited-populationMale, #content').addClass('is-invalid');
valid = false;
}
}
if (popFemale != '') {
if (!digitValidate.test(popFemale)) {
// значение не соответствует шаблону
// вывод ошибки
$('#import-edited-populationFemale, #content').addClass('is-invalid');
valid = false;
}
}
// если поля формы верны, составляем строку и возвращаем её для отправки на сервер
if (valid) {
var y = '';
for (key in form_data) {
y += '|' + key + '~' + form_data[key].val();
}
y += '|';
return y;
}
// если поля не верны, пользователь увидит ошибку, а вместо строки вернем null
else
return null;
}
function importFormSubmit(contentType) {
var data = '';
if (contentType == 'origin-import') {
data = checkOriginImportForm();
}
else if (contentType == 'edited-import') {
data = checkEditedImportForm();
}
if (data != null)
ImportForm(data, contentType);
}