"use strict"; var IS_ADMIN = false; var map_on_index_page = null; var InitMap = function () { // - to delete start ----------------------------------------------------------------------------------------------------------------------- var scale = 0.599999; var window_height = $(window).height() - 200; if (window_height < 400) window_height = 400; var window_width = $(window).width(); var image_width = MAP_WIDTH * scale; var image_height = MAP_HEIGHT * scale; var x = (window_width - image_width)/2; var y = (window_height - image_height)/2; // - to delete end ----------------------------------------------------------------------------------------------------------------------- map_on_index_page = $('#map_wrapper').beMap( { source:LOCS_HASH, scale: scale, x: x, y: y, mapwidth: MAP_WIDTH, mapheight: MAP_HEIGHT, height: window_height } ); }; var clog = function () { console.log(arguments[0]); }; (function () { var Map = function () { var self = this; self.debug = true; self.o = { source: 'locations.json', // data height: 400, // viewbox height, pixels mapwidth: 100, // actual image size, in pixels mapheight: 100, mapfill: true, zoom: true, zoombuttons: true, maxscale: 1, fitscale: 0.51, skin: '', // css class name scale: 1, x: 0, y: 0 }; self.svg = null; self.svg_overlay = null; self.container = null; self.mode = 'viewing'; self.prev_mode = null; self.setMode = null; self.selected_area = null; // ссылка на полигон из #svg_overlay self.drawing_poligon = null; self.events = []; self.edit_type = null; self.remove_button_klass = null; self.new_button_klass = null; self.edit_button_klass = null; self.complete_creating_button_klass = null; self.back_to_map_button_klass = null; self.current_building = null; self.current_area = null; self.is_draw = false; self.save_button_klass = null; self.area_link_button_klass = null; self.drawn_areas = []; // если имеются нарисованные но несохранённые Площади - они хранятся тут self.drawn_buildings = []; // если имеются нарисованные но несохранённые Здания - они хранятся тут self.save_preloader_klass = null; self.last_clicked_g = null; // начали просматривать area\building (запустили сессию), и здесь храним ссылку на последний кликнутый полигон из svg_overlay в течение сессии // true, если: //- юзер еще не кликал по кнопкам zoom //- юзер еще не делал drag-n-drop //- юзер ещё не вошёл ни в здание ни в площадь // Т.Е., другими словами, true до момента, пока пользователь не начал взаимодействовать с картой self.mark_virgin = true; // здесь сохранятся параметры для метода moveTo // чтобы вернуть карту в исходное состояние после нажатия кнопки "назад на карту" self.initial_map_position = null; self.init = function (el, params) { // extend options self.o = $.extend(self.o, params); self.x = self.o.x; self.y = self.o.y; self.scale = self.o.scale; self.el = el.addClass('melem mloading').addClass(self.o.skin).height(self.o.height); // Disable modules when landmark mode is active /*if (self.o.landmark) { self.o.sidebar = false; self.o.zoombuttons = false; self.o.deeplinking = false; }*/ if (typeof self.o.source === 'string') { // Loading .json file with AJAX $.getJSON(self.o.source, function (data) { // Success initProcessData(data); self.el.removeClass('mloading'); //setTimeout(invalidateZoom,1000); }).fail(function () { // Failure: couldn't load JSON file, or it is invalid. console.error('Couldn\'t load map data. (Make sure you are running the script through a server and not just opening the html file with your browser)'); self.el.removeClass('mloading').addClass('merror'); alert('Data file missing or invalid!'); }); } else { // Inline json object initProcessData(self.o.source); self.el.removeClass('mloading'); } return self; }; var initProcessData = function (data) { self.data = data; //var nrlevels = 0; //var shownLevel; self.container = $('.mcontainer'); //$('
').addClass('mcontainer').appendTo(self.el); self.map = self.container.find('.mmap'); //$('
').addClass('mmap').appendTo(self.container); if (self.o.zoom) self.map.addClass('mapplic-zoomable'); self.map_layers = self.map.find('.layers'); self.map_overlay_layers = self.map.find('.overlay_layers'); self.svg = $("#svg"); self.svg_overlay = $('#svg_overlay'); //$('') //.attr('xmlns','http://www.w3.org/2000/svg') //.attr('version','1.2') //.attr('baseProfile','tiny') //.attr('id','svg') //.appendTo(self.map); self.levelselect = $('').addClass('mlevels_select'); self.container.css('width', '100%'); // if (!self.o.sidebar) self.contentWidth = parseInt(data.mapwidth); self.contentHeight = parseInt(data.mapheight); self.hw_ratio = data.mapheight / data.mapwidth; self.map.css({ 'width': data.mapwidth, 'height': data.mapheight }); // Create new map layer var layer = $('
').addClass('mlayer').addClass(data["object_type"]).appendTo(self.map_layers); // .hide() $('').attr('src', data["img"]).addClass('mmap-image').appendTo(layer); // Zoom buttons if (self.o.zoombuttons) { self.zoombuttons = new ZoomButtons(); self.zoombuttons.init({height: self.o.height}, self); //if (!self.o.clearbutton) self.zoombuttons.el.css('bottom', '0'); } var sc = new StateController(); sc.init(self); self.setMode = sc.setMode; // Admin buttons $.ajax({ url: '/ajax/map_edit_buttons', type: 'POST', dataType: 'script', data: { div_css_selector: '#container_buttons .mzoom_buttons' } }).done(function () { clog(''); self.edit_button_klass = new EditButton(); self.edit_button_klass.init('.mapplic-edit-button', self); var e = new NewButton(); e.init('.mapplic-new-button', self); self.new_button_klass = e; e = new RemoveButton(); e.init('.mapplic-remove-button', self); self.remove_button_klass = e; e = new CancelRemoveButton(); e.init('#cancelRemoving', self); e = new CancelCreatingButton(); e.init("#cancelCreating", self); e = new CompleteCreatingButton(); e.init("#completeCreating", self); self.save_button_klass = new SaveChangesButton(); self.save_button_klass.init('.mapplic-save-button', self); // при клике на эту кнопку произойдет показ модального окна self.area_link_button_klass = new AreaLinkButton(); self.area_link_button_klass.init('.mapplic-area-link-button', self); // при клике на эту кнопку произойдет показ модального окна, в котором можно будет указать здание, соответствующее полигону self.building_link_button_klass = new BuildingLinkButton(); self.building_link_button_klass.init('.mapplic-building-link-button', self); $('[data-toggle="tooltip"]').tooltip(); }); // Controls initAddControls(); self.draw_childs(data["childs"]); self.ivalidateViewArea(); // Browser resize $(window).resize(function () { // Mobile //if ($(window).width() < 668) { // self.container.height($(window).height() - 66); //} //else self.container.height('100%'); // Контейнер с картой должен слушать изменения габаритов окна и подгоняться по высоте var window_height = $(window).height() - 200; if (window_height < 400) window_height = 400; self.el.height(window_height + "px"); // ------------------------------------------------------------------------------------------------------------------------ // если пользователь еще не взаимодействовал с картой или вне здания\площади // вписываем картинку карты в главный прямоугольник карты // т.е. меняем масштаб if (self.mark_virgin) { // рассчитаем масштаб, при котором можно вписать главный прямоугольник карты в прямоугольник рабочей области var scaleX = self.calcScale(self.o.mapwidth*0.05, self.o.mapwidth *.95, self.X10, self.X20); var scaleY = self.calcScale(self.o.mapheight*0.05, self.o.mapheight *.95, self.Y10, self.Y20); var scale = (scaleX < scaleY) ? scaleX : scaleY; self.scale = scale; } // совмещаем точку на экране, в которую надо центрировать карту, // с центром карты (или с центром здания\площади, в котором находится юзер), // с учётом рассчитанного масштаба // если пользователь еще не взаимодействовал с картой или вне здания\площади, // то фокусируемся на центр карты, // иначе - фокусируемся на центр здания\площади, в котором находится пользователь и // фокус сдвигаем, с учётом того, что сбоку открыта панель с информацией о здании // NOTE-25::хардкод // логические координаты - геометрический центр картинки var cx = self.o.mapwidth/2; var cy = self.o.mapheight/2; var mark_do_moving = false; if (self.current_building) { cx = self.current_building.cx(); cy = self.current_building.cy(); mark_do_moving = true; } else if (self.current_area) { cx = self.current_area.cx(); cy = self.current_area.cy(); mark_do_moving = true; } else if (self.mark_virgin) { mark_do_moving = true; } if (mark_do_moving) { self.x = self.normalizeX(self.CX - self.scale * cx - self.container.offset().left); self.y = self.normalizeY(self.CY - self.scale * cy - self.container.offset().top); clog(" call moveTo"); self.moveTo(self.x, self.y, self.scale, 100); // если пользователь ещё не взаимодействовал с картой (т.е. она только загрузилась и готова к использованию) // запомним позицию, чтобы при нажатии на кнопку "назад на карту" происходил возврат с исходному // состоянию if (self.mark_virgin) { self.initial_map_position = { x: self.x, y: self.y, scale: self.scale } } } // ------------------------------------------------------------------------------------------------------------------------ self.ivalidateViewArea(); }).resize(); }; var initAddControls = function () { var map = self.map, mapbody = $('.mmap-image', self.map); document.ondragstart = function () { return false; }; // IE drag fix function onSvgMousedown(e) { clog(" self.mode = " + self.mode); if (self.mode === 'editing' || self.mode === "edit_building" || self.mode === 'edit_area') { if (e.target.parentNode.tagName === 'g') { clog(" e = "); //clog(e.pageX); //clog(" e.target.parentNode.tagName = " + e.target.parentNode.tagName); //clog(e.target); //info.unload(); // запомним ссылку на "выбранную" область self.selected_area = e.target.parentNode.obj; //app.deselectAll(); // поменяем внешний вид полигона - добавим класс .selected self.selected_area.select(); // запомним начальные координаты кликаы self.selected_area.delta = { 'x': e.pageX, 'y': e.pageY }; // если взаимодействуем с вершиной if (utils.hasClass(e.target, 'helper')) { var helper = e.target; //clog(" helper.action = "); //clog(helper.action); self.edit_type = helper.action; // pointMove if (helper.n >= 0) { // if typeof selected_area == polygon self.selected_area.selected_point = helper.n; } self.addEvent(self.el[0], 'mousemove', self.onEdit) //self.addEvent(self.el[0], 'mousemove', self.selected_area.onEdit) .addEvent(self.el[0], 'mouseup', self.onEditStop); } else if (e.target.tagName === 'rect' || e.target.tagName === 'circle' || e.target.tagName === 'polygon') { self.edit_type = 'move'; self.addEvent(self.el[0], 'mousemove', self.onEdit) .addEvent(self.el[0], 'mouseup', self.onEditStop); } } else { //app.deselectAll(); //info.unload(); } } } self.svg.on('mousedown', onSvgMousedown); //self.el[0].addEventListener('mousedown', onSvgMousedown, false); // Drag & drop function onDragNdrop(event) { //clog(" edit_type = " + self.edit_type); clog(" mode = " + self.mode); //clog(event); // если в данный момент не редактируем фигуру (т.е. не двигаем вершину фигуры) if (self.edit_type == null) { self.dragging = false; map.stop(); map.data('mouseX', event.pageX); map.data('mouseY', event.pageY); map.data('lastX', self.x); map.data('lastY', self.y); map.data('startX', self.x); map.data('startY', self.y); map.addClass('mdragging'); self.map.on('mousemove', function (event) { self.dragging = true; var x = event.pageX - map.data('mouseX') + self.x; var y = event.pageY - map.data('mouseY') + self.y; x = self.normalizeX(x); y = self.normalizeY(y); //clog(" x = " + x + "; y = " + y); //clog(" Call moveTo."); self.moveTo(x, y); map.data('lastX', x); map.data('lastY', y); }); $(document).on('mouseup', function (event) { //clog(" dragging = " + self.dragging + ", mode = " + self.mode + "; is_draw = " + self.is_draw + "; scale = " + self.scale); //clog(" event = "); //clog(event); //clog(" event.target = "); //clog($(event.target).parent()[0].obj); //clog(" [qq] screen: " + event.pageX + ", " + event.pageY + //"; logic: " + self.rightX(event.pageX) + ", " + self.rightY(event.pageY)); clog(" self.mode = " + self.mode); // исключаем случайный dnd дрожащей рукой var dx = map.data('startX') - map.data('lastX'); var dy = map.data('startY') - map.data('lastY'); var delta = Math.sqrt(dx*dx + dy*dy); var is_real_dragging = delta > 10; // если это в самом деле был drag\n\drop if (self.dragging && is_real_dragging) { self.x = map.data('lastX'); self.y = map.data('lastY'); } // иначе - пытаемся выяснить, в каком режиме находимся else { var p; /* если находимся в режиме просмотра всей карты - входим в здание */ if (self.mode == 'viewing') { //clog($(event.target).parent()[0].obj.building); // добираемся до объекта класса Здание, который обслуживает полигон p = $(event.target).parent()[0]; if (p.obj && p.obj.building) { var building = p.obj.building; clog(" Входим в здание."); building.enter(); } } /* если находимся в режиме рисования - рисуем */ else if (self.mode == 'creating') { // и если ещё пока не начали рисовать (т.е. если это первый клик) if (!self.is_draw) { var xx = self.rightX(event.pageX); var yy = self.rightY(event.pageY); //clog(" " + xx + "; " + yy); self.drawing_poligon = new Polygon(xx, yy, false, self); //self.addEvent(self.el[0], 'mousemove', self.drawing_poligon.onDraw) self.addEvent(self.el[0], 'mousemove', function (e) { var _n_f = self.drawing_poligon; var right_angle = !!e.shiftKey; //e.shiftKey ? true : false; _n_f.dynamicDraw(self.rightX(e.pageX), self.rightY(e.pageY), right_angle); }) //.addEvent(self.drawing_poligon.helpers[0].helper, 'click', self.drawing_poligon.onDrawStop) //.addEvent(self.el[0], 'click', self.drawing_poligon.onDrawAddPoint); .addEvent(self.el[0], 'click', function (e) { // если кликнули в первую точку фигуры - заканчиваем рисование var $et = $(e.target); var $h = $(self.drawing_poligon.helpers[0].helper); if ($et.attr('x') == $h.attr('x') && $et.attr('y') == $h.attr('y')) { //self.drawing_poligon.onDrawStop(); self.onDrawStop(); return; } var x = self.rightX(e.pageX), y = self.rightY(e.pageY), _n_f = self.drawing_poligon; if (e.shiftKey) { var right_coords = _n_f.right_angle(x, y); x = right_coords.x; y = right_coords.y; } _n_f.addPoint(x, y); }) .addEvent(document, 'keydown', self.onDrawStop); } } /* если находимся в режиме просмотра здания - входим в площадь */ /* если находится в режиме просмотра площади - переключаемся на другую площадь */ else if (self.mode == 'view_building' || self.mode == 'view_area') { //console.log($(event.target).parent()); // => g, который живёт в #svg_overlay, или, другими словами, // тот g, по которому кликнули последний раз, // просматривая либо здание, либо площадь var $viewing_g_from_svg_overlay = $(event.target).parent(); // добираемся до объекта класса Area, который обслуживает полигон p = $viewing_g_from_svg_overlay[0]; //clog($(event.target).parent()[0].obj.area_hash); if (p.obj && p.obj.area) { // запомним последний кликнутый полигон self.last_clicked_g = $viewing_g_from_svg_overlay; var area = p.obj.area; clog(" Входим в площадь. self.last_clicked_g = "); clog(self.last_clicked_g); area.enter(); } } } self.map.off('mousemove'); $(document).off('mouseup'); map.removeClass('mdragging'); }); } } self.svg.on('mousedown', onDragNdrop); self.svg_overlay.on('mousedown', onDragNdrop); self.el[0].addEventListener('mousemove', function (e) { //coords_info.innerHTML = 'x: ' + rightX(e.pageX) + ', ' + 'y: ' + rightY(e.pageY); }, false); self.el[0].addEventListener('mouseleave', function () { //coords_info.innerHTML = ''; }, false); /* Disable selection */ //self.el[0].addEventListener('mousedown', function(e) { e.preventDefault(); }, false); /* Disable image dragging */ self.el[0].addEventListener('dragstart', function (e) { e.preventDefault(); }, false); self.back_to_map_button_klass = new BackToMapButton(); self.back_to_map_button_klass.init("#ui", self); self.save_preloader_klass = new SavePreloader(); self.save_preloader_klass.init(); }; // какой должен быть минимальный масштаб, чтобы вписать отрезок [min,max] в отрезок [p1,p2] self.calcScale = function (min, max, p1, p2) { //clog(" [" + min + "," + max + '] to [' + p1 + "," + p2 + "]"); return (p2 - p1) / (max - min); }; self.calcCoord = function (scale, pageC, logicC) { return pageC - scale * logicC; }; /* --- ivalidateViewArea BEGIN --------------------------------------------------------------------------------- */ var _$m = $("#map_wrapper"); var _$b = $('footer .container'); var $building_info = $('.building_info'); // "layouts/shared/map_row/building_info" var $area_order_button = $('.area_order_button'); var $container_buttons = $('#container_buttons'); var _is_debug_drawn = true; self.ivalidateViewArea = function () { //clog(' _$b.offset().left = ' + _$b.offset().left); // рассчитаем "константы" - прямоугольник, в который надо вписывать картинки зданий при входе в них self.X1 = _$b.offset().left + 100; self.X1S = _$b.offset().left + 200; self.Y1 = 73; self.Y1S = 140; self.X2 = self.X1 + _$b.width() * .5; self.X2S = self.X1 + _$b.width() * .4; self.X3 = self.X1 + _$b.width() - 100; self.Y2 = _$m.height() - 20; self.Y2S = _$m.height() - 80; self.CX = (self.X2 - self.X1) / 2 - 2 + self.X1; self.CY = (self.Y2 - self.Y1) / 2 - 2 + self.Y1; self.X10 = _$b.offset().left + 15; self.X20 = self.X10 + _$b.width(); self.Y10 = 73; self.Y20 = _$m.height(); // позиционируем элементы $building_info.css("left", self.X2 + "px"); $area_order_button.css("left", self.X2 + "px"); if (self.container) $container_buttons.css("margin-top", (self.container.height() -10) + "px"); // DEBUG if (self.debug) { if (!_is_debug_drawn) { _is_debug_drawn = true; var style = "display:block;position:absolute;background-color:#00ff00;opacity:0.4;"; var style_x = style + "width:1px;height:800px;top:0;left:{X}px;"; var style_y = style + "width:3000px;height:1px;left:0;top:{Y}px;"; var style_dot = style + 'width:4px;height:4px;left:{X}px;top:{Y}px;'; var to_draw = [ {x: self.X10}, {x: self.X20}, {y: self.Y10}, {y: self.Y20}, {x: self.CX}, {y: self.CY}, ]; var i, istyle, xx, yy, ip; for (i = 0; i < to_draw.length; i++) { ip = to_draw[i]; if (ip.x != undefined) { istyle = style_x.split("{X}").join(ip.x); } else if (ip.y != undefined) { istyle = style_y.split("{Y}").join(ip.y); } _$m.append($("
")); } } } }; /* --- ivalidateViewArea END ----------------------------------------------------------------------------------- */ self.addEvent = function (target, eventType, func) { self.events.push(new AppEvent(target, eventType, func)); return self; }; self.removeAllEvents = function () { utils.foreach(self.events, function (x) { x.remove(); }); self.events.length = 0; self.edit_type = null; return this; }; self.addNodeToSvg = function (node, is_overlay) { if (is_overlay) { self.svg_overlay[0].appendChild(node); } else { self.svg[0].appendChild(node); } return self; }; self.removeNodeFromSvg = function(node, is_overlay) { if (is_overlay) { self.svg_overlay[0].removeChild(node); } else { self.svg[0].removeChild(node); } return this; }; self.svgRemoveAllNodes = function () { self.svg.empty(); self.svg_overlay.empty(); }; self.draw_childs = function (childs, parent_hash) { //clog(""); //var ip; var iobj; var ib, id, ia; for (var i = 0; i < childs.length; i++) { iobj = childs[i]; switch (iobj["object_type"]) { case 'building': ib = new Building(); ib.init(iobj,self); break; case 'dot': id = new Dot(); id.init(iobj,self); break; case 'area': ia = new Area(); ia.init(iobj, parent_hash, self); break; } //ip = Polygon.createFromSaved(iobj); //utils.id('svg').appendChild(ip.g); } }; // self.draw_child_bg_image = function (img_src, obj_type, is_overlay) { var t; if (is_overlay == true) { t = self.map_overlay_layers; } else { t = self.map_layers; } // Create new map layer var layer = $('
').addClass('mlayer').addClass(obj_type).appendTo(t); // .hide() $('').attr('src', img_src).addClass('mmap-image').appendTo(layer); return layer; }; self.onEdit = function (e) { //clog(" _s_f = " + _s_f); //clog(" e = "); //clog(_s_f); //clog(e.pageX); var selected_area = self.selected_area; var edit_type = self.edit_type; //clog(" edit_type = " + edit_type); selected_area.dynamicEdit(selected_area[edit_type](e.pageX - selected_area.delta.x, e.pageY - selected_area.delta.y)); selected_area.delta.x = e.pageX; selected_area.delta.y = e.pageY; }; self.onDrawStop = function (e) { clog(""); if (e != undefined) { if (e.type == 'keydown' && e.keyCode == 13) { // its ok, continue execution.. } else { return } } var _n_f = self.drawing_poligon; if (_n_f.params.length >= 6) { //>= 3 points for polygon _n_f.polyline = _n_f.polygon; _n_f.polygon = document.createElementNS('http://www.w3.org/2000/svg', 'polygon'); _n_f.g.replaceChild(_n_f.polygon, _n_f.polyline); _n_f.setCoords(_n_f.params).deselect(); delete(_n_f.polyline); // в зависимости от предыдущего состояния, создадим либо Здание, либо Площадь if (self.prev_mode == "edit_building") { var bo = self.current_building.options; var a = new Area(); a.init({ coords:_n_f.params }, bo, self); //a.is_new = true; _n_f.remove(); // удаляем нарисованный полигон, т.к. его уже заменили полигоном Area self.registerJustDrownArea(a); } else if (self.prev_mode == 'editing') { var b = new Building(); b.init({ coords:_n_f.params }, self); //b.is_new = true; _n_f.remove(); // удаляем нарисованный полигон, т.к. его уже заменили полигоном Building self.registerJustDrownBuilding(b); } self.removeAllEvents(); self.drawing_poligon = null; self.is_draw = false; } self.setMode('editing'); }; self.onEditStop = function (e) { //clog(""); var _s_f = self.selected_area, edit_type = self.edit_type; _s_f.setParams(_s_f.dynamicEdit(_s_f[edit_type](e.pageX - _s_f.delta.x, e.pageY - _s_f.delta.y))); self.removeAllEvents(); }; self.registerJustDrownArea = function (area) { self.drawn_areas.push(area); }; self.registerJustDrownBuilding = function (building) { self.drawn_buildings.push(building); }; self.normalizeX = function (x) { var minX = self.container.width() - self.contentWidth * self.scale; if (minX < 0) { if (x > 0) x = 0; else if (x < minX) x = minX; } else x = minX / 2; return x; }; self.normalizeY = function (y) { var minY = self.container.height() - self.contentHeight * self.scale; if (minY < 0) { if (y >= 0) y = 0; else if (y < minY) y = minY; } else y = minY / 2; return y; }; self.normalizeScale = function (scale) { clog('' + self.o.fitscale); if (scale < self.o.fitscale) scale = self.o.fitscale; else if (scale > self.o.maxscale) scale = self.o.maxscale; if (self.zoombuttons) self.zoombuttons.update(scale); return scale; }; self.zoomTo = function (x, y, s, duration, easing, ry) { duration = typeof duration !== 'undefined' ? duration : 400; ry = typeof ry !== 'undefined' ? ry : 0.5; self.scale = self.normalizeScale(self.o.fitscale * s); self.x = self.normalizeX(self.container.width() * 0.5 - self.scale * self.contentWidth * x); self.y = self.normalizeY(self.container.height() * ry - self.scale * self.contentHeight * y); clog(" Call moveTo."); self.moveTo(self.x, self.y, self.scale, duration, easing); }; // optimisation var __moveToStep = function () { //clog(self.map.attr('style')); // left: -69.9985px; top: -299.999px; // left: [-]{0,1}(\d+\.\d+px); var str = self.map.attr('style'); var rx_left = /left: [-]{0,1}(\d+\.\d+)px;/; var rx_top = /top: ([-]{0,1}\d+\.\d+)px;/; var match_left = str.match(rx_left); var match_right = str.match(rx_top); if (match_left != null && match_right != null) { var x = -1 * Number(match_left[1]); // ["left: -69.9985px;", "69.9985"] var y = -1 * Number(match_right[1]); // ["left: -69.9985px;", "69.9985"] var att = x + " " + y + " " + self.contentWidth + " " + self.contentHeight; //clog(x + "; y = " + y); self.svg.attr('viewBox', att); self.svg_overlay.attr('viewBox', att); } }; var __moveToTimeout = function () { if (self.mode === 'edit_area'|| self.mode === 'view_area') { $("#masked").removeClass('hiddn'); } }; var __moveToAnimate = function () { if (self.tooltip) self.tooltip.position(); }; // x,y - экранные координаты self.moveTo = function (x, y, scale, d, easing) { //clog(" x = " + x + "; y = " + y + "; scale = " + scale); clog(''); // если подан аргумент scale(масштаб) // перемещаемся анимированно if (scale !== undefined) { // на время движения скрываем слой с полосатой анимацией if (self.current_area != null) { $("#masked").addClass('hiddn'); setTimeout(__moveToTimeout, d); setTimeout(__moveToStep, d); } self.map.stop().animate( { 'left': x, 'top': y, 'width': self.contentWidth * scale, 'height': self.contentHeight * scale }, //{ 'step': __moveToStep }, d, easing, __moveToAnimate ); } // если не подан аргумент scale(масштаб) // перемещаемся без анимации else { self.map.css({ 'left': x, 'top': y }); var t = (-x) + " " + (-y) + " " + self.contentWidth * self.scale + " " + self.contentHeight * self.scale; self.svg.attr('viewBox',t); self.svg_overlay.attr('viewBox', t); } if (self.current_area != null) { self.current_area.invalidateAnimationMask(); } //if (self.tooltip) self.tooltip.position(); //if (self.minimap) self.minimap.update(x, y); }; // показать инфо о здании self.showBuildingInfo = function (building_hash) { console.log(" id = " + building_hash.id); //"building_hash": { // "id": 2, // "title": "Здание 2", // "props": { // "square": "1234 кв.м.", // "square_free": "124 кв. м", // "floor_height": "124 кв. м", // "column_step": "2 м", // "gate_type": "распашные", // "communications": "Интернет, электричество, водоснабжение", // "price": "от 155 руб/кв.м в месяц" // } if (building_hash.id == undefined) { $building_info.css('display','none'); } else { $building_info.css('display','block'); $building_info.find("h2").text(building_hash["title"]); var v, $ili, p; for (p in building_hash["props"]) { v = building_hash["props"][p]; $ili = $building_info.find("#" + p); $ili.find('span').text(v); //console.log("."+v+"."); // Не показывать пользователю карты незаполненные поля var li_css_display = 'block'; if (v == '' || v == '-1' || v === 'null' || v == null) { li_css_display = 'none'; } $ili.css('display',li_css_display); } $building_info.find("#square_free").css('height', 'auto'); } }; // показать инфо о просматриваемой площади self.showAreaInfo = function (area_hash, parent_building_hash) { //clog(area_hash); //"area_hash": { // "id": 2, // "title": "Площадь 2.12", // "is_free": false, // "props": { // "square": "100 кв.м.", // "floor_height": "6 кв. м", // "column_step": "2 м", // "gate_type": "распашные", // "communications": "Интернет, электричество, водоснабжение", // "price": "от 155 руб/кв.м в месяц" // } //"building_hash": { // "id": 2, // "title": "Здание 2", // "props": { // "square": "1234 кв.м.", // "square_free": "124 кв. м", // "floor_height": "6 кв. м", // "column_step": "2 м", // "gate_type": "распашные", // "communications": "Интернет, электричество, водоснабжение", // "price": "от 155 руб/кв.м в месяц" // } $building_info.find("h2").html("" + area_hash["title"] + " / " + parent_building_hash["title"]); var v; for (var p in area_hash["props"]) { v = area_hash["props"][p]; $building_info.find("#" + p).find('span').text(v); } $building_info.find("#square_free").css('height', '0'); // заполняем данными ссылку 'Оставить заявку' var $a_make_order = $building_info.find('.c80_order_invoking_btn'); $a_make_order.data('comment-text', 'Здравствуйте, оставляю заявку на площадь: ' + area_hash["title"]); $a_make_order.data('subj-id', area_hash["id"]); }; // перевод экранных координат в логические self.rightX = function(x) { return (x - self.x - self.container.offset().left) / self.scale; }; self.rightY = function(y) { return (y - self.y - self.container.offset().top) / self.scale }; // взять C80Map::current_area и назначить ей Rent::area.id, // выбранный в окне _modal_window.html.erb self.link_area = function () { // фиксируем компоненты модального окна var $m = $('#modal_window'); var $b = $m.find('.modal-footer').find('.btn'); var $s = $m.find('select'); // извлекаем значения var rent_area_id = $s.val(); var map_area_id = self.current_area.id; console.log(" rent_area_id = " + rent_area_id + "; map_area_id = " + map_area_id); // нажимаем кнопку "закрыть" $b.click(); // показываем прелоадер self.save_preloader_klass.show(); // отправляем запрос на сервер // TODO_MY:: реализовать обработчик ошибок $.ajax({ url:'/ajax/link_area', type:'POST', data: { rent_area_id: rent_area_id, map_area_id: map_area_id }, dataType:"json" }).done(function (data, result) { self.save_preloader_klass.hide(); self.data = data["updated_locations_json"]; }); }; // взять C80Map::current_building и назначить ему Rent::building.id, // выбранный в окне _modal_window.html.erb self.link_building = function () { console.log(' '); // фиксируем компоненты модального окна var $m = $('#modal_window'); var $b = $m.find('.modal-footer').find('.btn'); var $s = $m.find('select'); // извлекаем значения var rent_building_id = $s.val(); var map_building_id = self.current_building.id; console.log(" rent_building_id = " + rent_building_id + "; map_building_id = " + map_building_id); // нажимаем кнопку "закрыть" $b.click(); // показываем прелоадер self.save_preloader_klass.show(); // отправляем запрос на сервер // TODO_MY:: реализовать обработчик ошибок $.ajax({ url:'/ajax/link_building', type:'POST', data: { rent_building_id: rent_building_id, map_building_id: map_building_id }, dataType:"json" }).done(function (data, result) { self.save_preloader_klass.hide(); self.data = data["updated_locations_json"]; }); } }; // Create a jQuery plugin $.fn.beMap = function (params) { var len = this.length; return this.each(function (index) { var me = $(this), key = 'beMap' + (len > 1 ? '-' + ++index : ''), instance = (new Map).init(me, params); }); }; }) (jQuery);