/* * Приложение */ // ------------ Система статусов приложения ------------------------------------ var statusReady = 0; // Обычный режим. Просмотр точек, навигация по карте и прочее. var statusHunting = 1; // Курсор-прицел. Поиск места для добавления точки. var statusReHunting = 2; // КУрсор прицел. Переопределение координат точки. var statusAdd = 3; // Открыто окно добавления точки - форма. var statusEdit = 4; // Открыто окно редактирования точки. В нём информация о существующей точке, включая ID. var statusSendingToServer = 5; // Отправлен запрос на сервер - ждём, не даём жать кнопку повторно, отвлекаем пользователя. var statusMovingInHistory = 6; var status = statusReady; var statusPrev = statusReady; /** * Устанавливает новое значение статуса. * @returns {undefined} */ function setStatus(value) { statusPrev = status; status = value; } /** * Меняет значение статуса на предыдущее. * @returns {undefined} */ function resetStatus() { tmp = status; status = statusPrev; statusPrev = tmp; } // -------------------------------- Libs --------------------------------------- /** * Возвращает GET параметр * @param string name * @returns string */ function getURLParameter(name) { return decodeURI((RegExp(name + '=' + '(.+?)(&|$)').exec(location.search) || [, null])[1]); } // ----------------- Работа с правым блоком (BOX) ------------------------------ function openBox(type, keepOpen) { newTab = $('#box'+type).css('display') == 'none'; keepOpen = keepOpen == true; if (!newTab && !keepOpen) { return closeBox(); } $('div','#control').removeClass('active'); $('#box').children('div').css('display', 'none'); $('.boxButton'+type).addClass('active'); $('#box'+type).css('display', 'block'); $('body').addClass('openBox'); } function closeBox() { $('body').removeClass('openBox'); $('div','#control').removeClass('active'); $('#box').children('div').css('display', 'none'); return true; } function showImage(id) { point = pointsSources[id]; photos = []; if( typeof($('.fotorama').data('fotorama')) != 'undefined' ) { $('.fotorama').data('fotorama').destroy(); } $('#imageModalLabel').text(point.name); $('#imageModalImg').hide(); $('.fotorama').show(); if (typeof(point.images) == 'object') { point.images.forEach(function(entry) { if (true || window.devicePixelRatio > 1) { photos.push({img: '/photos/big/'+entry, thumb: '/photos/small/'+entry}); } else { photos.push({img: '/photos/middle/'+entry, thumb: '/photos/small/'+entry}); } }); } else { photos.push({img: point.img, thumb: point.img}); } initFotorama('.fotorama', photos); $('#imageModal').modal('show'); } function addRemoveFavorite(id) { if (user != '0') { $.ajax({ url: "/json/addRemoveFavorites/id/" + id, success: function(data) { if (data){ // Тут переключалку классов звёздочки $('#myFavoritesButton').toggleClass('glyphicon glyphicon-star-empty').toggleClass('glyphicon glyphicon-star'); } }}); } else { $('#loginModal').modal('show'); } } function addRemoveLike(id) { if (user != '0') { $.ajax({ url: "/json/addRemoveLike/id/" + id, success: function(data) { if (data){ $('#myLikesButton').toggleClass('glyphicon-thumbs-up').toggleClass('glyphicon-ok'); } }}); } else { $('#loginModal').modal('show'); } } window.addEventListener('popstate', function(e) { if (typeof(e.state) == 'object' && e.state != null) { setStatus(statusMovingInHistory); if (e.state.hasOwnProperty('pointId')) { showInfo(e.state.pointId, false, true); } else if (e.state.hasOwnProperty('zoom')) { lat = e.state.lat; lng = e.state.lng; zoom = e.state.zoom; myMap.setView([lat, lng], zoom); } else if (e.state.hasOwnProperty('route')) { loadRouteJSON(e.state.route); } } }, false); function getTime() { return Math.floor(Date.now() / 1000); } function showRandomPoint() { if (typeof fullLoad == 'undefined') { initPoints(); fullLoad = true; } roundIndex = Math.floor(Math.random() * points.length); runner = 0; for (var key in points) { if (runner++ >= roundIndex) { if (key != 'im'){ return showInfo(key); } else { return showRandomPoint(); } } } } /** * Загружает с сервера список категорий точек. * @returns {Boolean} */ function initCategories() { data = JSON.parse(categoryArray); for (var k in data) { categories[data[k]['id']] = L.icon({ iconUrl: data[k]['icon'], iconSize: [32, 37], iconAnchor: [16, 37], popupAnchor: [0, 1] }); } initPoints(true); return true; } /** * Производит поиск по адресу или координатам, введённым в соответствующее поле. * @returns {undefined} */ function searchAdderess() { $.ajax({ url: "/json/geocoding", data: { search: $('#addressField').val() }, success: function (data) { if (data.lat && data.lng) { myMap.setView([data.lat, data.lng], defaultZoom); L.popup() .setLatLng([data.lat, data.lng]) .setContent('Координаты: lat:' + data.lat + ' lng:' + data.lng) .openOn(myMap); } else { alert('Ничего не найдено.'); } } }); } /** * Активирет добавление точки - ждёт выбор координат, меняет курсор на прицел. * @returns {Boolean} */ function activateAddPoint() { $('#addPointButton').toggleClass('active'); if ($('#addPointButton').hasClass('active')) { $('.extraImage', '#imgsContainer').remove(); addNewImage(); $('#map').css('cursor', 'crosshair'); setStatus(statusHunting) } else { $('#map').css('cursor', 'arrow'); setStatus(statusReady) } return true; } /** * Отправляет данные о точке на сервер. * @returns {Boolean} */ function addPoint() { $('.form-group').removeClass('has-error'); if (status != statusSendingToServer) { setStatus(statusSendingToServer) id = $('#addPointId').length ? $('#addPointId').val() : 0; hasImages = false; $("input[name='imgs[]']", '#addPointForm').each(function () { if ($(this).val().length > 10) hasImages = true; }); $("input[name='photos[]']", '#addPointForm').each(function () { if ($(this).val().length > 5) hasImages = true; }) $.ajax({ type: "POST", url: "/json/addpoint/", data: { name: $('#addPointName').val(), img: hasImages ? 1 : 0, description: $('#addPointDescription').val(), categoryId: $('#addPointCategoryId').val(), source: $('#addPointSource').val(), lat: $('#addPointLat').val(), lng: $('#addPointLng').val(), status: $('#moderate').val(), id: id }, success: function (data) { if ($("input[name='photos[]']").length > 0 || $("input[name='imgs[]']").length > 0) { $('').appendTo('#addPointForm').val(data); $('#addPointForm').submit(); } text = id ? 'Точка успешно отредактирована!' : 'Точка успешно добавлена!'; if (id) { markers.removeLayer(points[id]); } text = '
