c80_map 0.1.0.2 → 0.1.0.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +19 -1
  3. data/app/assets/javascripts/buttons/admin_buttons/button_area_link.js +88 -0
  4. data/app/assets/javascripts/buttons/admin_buttons/button_back_to_map.js +2 -4
  5. data/app/assets/javascripts/buttons/admin_buttons/button_cancel_remove.js +23 -0
  6. data/app/assets/javascripts/buttons/admin_buttons/button_edit.js +16 -0
  7. data/app/assets/javascripts/buttons/admin_buttons/button_remove.js +23 -0
  8. data/app/assets/javascripts/buttons/admin_buttons/button_save.js +32 -4
  9. data/app/assets/javascripts/c80_map.js.coffee +4 -1
  10. data/app/assets/javascripts/map_objects/area.js +20 -9
  11. data/app/assets/javascripts/map_objects/building.js +2 -3
  12. data/app/assets/javascripts/src/main.js +74 -10
  13. data/app/assets/javascripts/src/state_controller.js +97 -23
  14. data/app/assets/javascripts/src/utils/map_utils.js +23 -0
  15. data/app/assets/javascripts/src/utils/opacity_buttons_utils.js +15 -0
  16. data/app/assets/javascripts/src/{utils.js → utils/utils.js} +13 -0
  17. data/app/assets/javascripts/svg_elements/area_label.js +25 -0
  18. data/app/assets/javascripts/svg_elements/polygon.js +3 -1
  19. data/app/assets/stylesheets/map.scss +148 -66
  20. data/app/assets/stylesheets/view/modal_window.scss +13 -0
  21. data/app/controllers/c80_map/map_ajax_controller.rb +5 -1
  22. data/app/models/c80_map/area.rb +1 -0
  23. data/app/models/c80_map/area_representator.rb +75 -0
  24. data/app/models/c80_map/map_json.rb +28 -14
  25. data/app/views/c80_map/_map_row_index.html.erb +1 -0
  26. data/app/views/c80_map/shared/_modal_window.html.erb +28 -0
  27. data/db/migrate/{20160620040202_create_c80_map_areas.rb → 20160620040225_create_c80_map_areas.rb} +4 -1
  28. data/lib/c80_map/version.rb +1 -1
  29. metadata +14 -5
  30. /data/db/migrate/{20160620040206_create_c80_map_buildings.rb → 20160620040217_create_c80_map_buildings.rb} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d665b0899ef1892fa872db9e7d5eb4ccb1ed0e7c
4
- data.tar.gz: 6cc5fd6361ed4625b8c2bf924c59d83ccb9d77b9
3
+ metadata.gz: 4b43c74930a6f28b01f695dc6d5dbc1c4e204bf7
4
+ data.tar.gz: c8bafb47d3dd2a5302596c55640e6f41b3718ffc
5
5
  SHA512:
6
- metadata.gz: ccf055688da0f4c368d30a44504174dff41a1144dd5478f61fa31bf016126174e0c88068e350b346e7274ad3928f43990625f32b314a87309911d45e9c1f2442
7
- data.tar.gz: 4edd62b64af0b96f65ac9a0ee627e42bac4effaf203406ad961fc79928a6799986e81920aaad18857b6d5d0d4f7691a0b6b94077fce69ac6e4d463704374248e
6
+ metadata.gz: a60ce784ef3a4e3ba833b91e246ac00564b807ff0b40bf88f835e9068bd80597fc380cc93ea6a1d27c93cfa45958a3115fef5e82af21b9a7619372e2e60361d8
7
+ data.tar.gz: 5a21d16436b114a496a796e7f0738cfb50dbcbfc46ef43a3b864c8ef4c4c5becb77ca3f65b86f77c4fd53203a49d34e3f13c2863c8ffd3cbd777ede5743afedb
data/README.md CHANGED
@@ -22,7 +22,25 @@ Or install it yourself as:
22
22
 
23
23
  ## Usage
24
24
 
25
- 1. Host application:
25
+ 0. Requires:
26
+
27
+ ```
28
+ #= require bootstrap/alert
29
+ #= require bootstrap/dropdown
30
+ #= require bootstrap-select
31
+ ```
32
+
33
+ 2. Add this:
34
+
35
+ ```
36
+ @import "c80_map";
37
+ ```
38
+
39
+ ```
40
+ #= require c80_map
41
+ ```
42
+
43
+ 1. Start (Host application script):
26
44
 
27
45
  ```
28
46
  $(document).ready(function() {
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+
3
+ // при клике на эту кнопку произойдет показ модального окна _modal_window.html.erb
4
+
5
+ function AreaLinkButton() {
6
+
7
+ var _map = null;
8
+ var _this = this;
9
+ _this.el = null;
10
+
11
+ var show_modal_window = function () {
12
+
13
+ //var $dialog = $('#modal_window');
14
+ //$dialog.find("h4").text($t.data("wtitle"));
15
+ //$dialog.find("#form_comment").css('display','block');
16
+ //$dialog.find("input#comment_part_id").val(partid);
17
+ //$dialog.find("input#comment_author").val(author);
18
+
19
+ var $m = $('#modal_window');
20
+ var $cc = $m.find('.modal-body');
21
+ $m.find('.modal-title').text('Укажите площадь, соответствующую полигону на карте');
22
+
23
+ setTimeout(function () {
24
+ $("select#unlinked_areas").selectpicker({size: 50, tickIcon: 'hidden'});
25
+ }, 1);
26
+
27
+ setTimeout(function () {
28
+ //console.log($cc.find("button"));
29
+ $cc.find("button").on('click', function () {
30
+ if ($(this).attr('id') == "submit_area_link") {
31
+ _map.link_area();
32
+ }
33
+ });
34
+ }, 1000);
35
+
36
+ $link_show_modal_window.click();
37
+
38
+ };
39
+
40
+ var fetch_free_areas = function () {
41
+ $.ajax({
42
+ url:'/ajax/fetch_unlinked_areas',
43
+ type:'POST',
44
+ data: {building_id:"building_id"},
45
+ dataType:'script'
46
+ }).done(fetch_free_areas_done);
47
+ };
48
+ var fetch_free_areas_done = function (data, result) {
49
+ _map.save_preloader_klass.hide();
50
+ show_modal_window();
51
+ };
52
+
53
+ var $link_show_modal_window = null;
54
+
55
+ _this.onClick = function (e) {
56
+ if (_this.el.hasClass('disabled')) return;
57
+ e.preventDefault();
58
+
59
+ console.log("<AreaLinkButton.click>");
60
+
61
+ _map.save_preloader_klass.show();
62
+
63
+ fetch_free_areas();
64
+ };
65
+
66
+ _this.init = function (button_css_selector, link_to_map) {
67
+ _map = link_to_map;
68
+ _this.el = $(button_css_selector);
69
+ _this.el.on('click', _this.onClick);
70
+ _this.hide();
71
+
72
+ // найдем кнопку, клик по которой покажет окно [_modal_window.html.erb]
73
+ $link_show_modal_window = $('.show_modal_window');
74
+
75
+ //console.log("<AreaLinkButton.init>");
76
+ //console.log(this.el);
77
+ };
78
+
79
+ _this.hide = function () {
80
+ _this.el.css('display','none');
81
+ };
82
+
83
+ _this.show = function () {
84
+ console.log("<AreaLinkButton.show>");
85
+ _this.el.css('display','block');
86
+ };
87
+
88
+ }
@@ -11,19 +11,17 @@ function BackToMapButton() {
11
11
  var _onClick = function () {
12
12
  _map.setMode('viewing');
13
13
 
14
- _map.current_area = null;
15
-
16
14
  if (_map.current_building) {
17
15
  _map.current_building.exit();
16
+ _map.current_building = null;
18
17
  }
19
18
 
20
19
  if (_map.current_area) {
21
20
  _map.current_area.exit();
21
+ _map.current_area = null;
22
22
  }
23
23
 
24
24
  _map.svgRemoveAllNodes();
25
-
26
-
27
25
  _map.draw_childs(_map.data["childs"]);
28
26
 
29
27
  };
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ function CancelRemoveButton() {
4
+
5
+ var _map = null;
6
+ var _this = this;
7
+ _this.el = null;
8
+
9
+ _this.onClick = function (e) {
10
+ if (_this.el.hasClass('disabled')) return;
11
+ e.preventDefault();
12
+
13
+ console.log("<CancelRemoveButton.onClick> Выходим из режима удаления полигона.");
14
+ _map.setMode('editing');
15
+
16
+ };
17
+
18
+ _this.init = function (button_css_selector, link_to_map) {
19
+ _map = link_to_map;
20
+ _this.el = $(button_css_selector);
21
+ _this.el.on('click', _this.onClick);
22
+ };
23
+ }
@@ -25,6 +25,7 @@ function EditButton() {
25
25
  _this.state = state;
26
26
  _this.el.removeClass('editing');
27
27
  _this.el.removeClass('viewing');
28
+ _this.el.removeClass('removing');
28
29
  _this.el.removeClass('view_building');
29
30
  _this.el.removeClass('edit_building');
30
31
  _this.el.removeClass('view_area');
@@ -40,6 +41,9 @@ function EditButton() {
40
41
  this.onClick = function (e) {
41
42
  e.preventDefault();
42
43
 
44
+ // если после исполнения switch..case эта перменная будет true - значит надо будет вызвать кое-какой код
45
+ var mark_restore_svg_overlay = false;
46
+
43
47
  switch (_this.state) {
44
48
  case 'editing':
45
49
  _this.setState('viewing');
@@ -53,20 +57,32 @@ function EditButton() {
53
57
  _this.setState('edit_building');
54
58
  break;
55
59
 
60
+ // находились в режиме редактирования здания, и перешли в режим просмотра здания
56
61
  case 'edit_building':
57
62
  _this.setState('view_building');
63
+ mark_restore_svg_overlay = true;
58
64
  break;
59
65
 
60
66
  case 'view_area':
61
67
  _this.setState('edit_area');
68
+ // спрячем от клика мышки все полигоны из svg_overlay, кроме редактируемого полигона
69
+ MapUtils.svgOverlayHideAllExcept(_map.last_clicked_g);
62
70
  break;
63
71
 
72
+ // находились в режиме редактирования площади, и перешли в режим просмотра площади
64
73
  case 'edit_area':
65
74
  _this.setState('view_area');
75
+ mark_restore_svg_overlay = true;
66
76
  break;
67
77
 
68
78
  }
69
79
 
80
+ // покажем для клика мышкой все полигоны из svg_overlay
81
+ if (mark_restore_svg_overlay) {
82
+ MapUtils.svgOverlayRestore(_map.last_clicked_g);
83
+ _map.last_clicked_g = null;
84
+ }
85
+
70
86
  };
71
87
 
72
88
  this.init = function (button_css_selector, link_to_map) {
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ function RemoveButton() {
4
+
5
+ var _map = null;
6
+ var _this = this;
7
+ _this.el = null;
8
+
9
+ _this.onClick = function (e) {
10
+ if (_this.el.hasClass('disabled')) return;
11
+ e.preventDefault();
12
+
13
+ console.log("<RemoveButton.onClick> Переходим в режим удаления полигона.");
14
+ _map.setMode('removing');
15
+
16
+ };
17
+
18
+ _this.init = function (button_css_selector, link_to_map) {
19
+ _map = link_to_map;
20
+ _this.el = $(button_css_selector);
21
+ _this.el.on('click', _this.onClick);
22
+ };
23
+ }
@@ -40,10 +40,38 @@ function SaveChangesButton() {
40
40
  };
41
41
 
42
42
  var sendDataToServerDone = function (data, result) {
43
- console.log("<ButtonSave.sendDataToServerDone> data,result:");
44
- console.log(data);
45
- console.log(result);
46
- console.log("<ButtonSave.sendDataToServerDone> ------------");
43
+
44
+ //console.log("<ButtonSave.sendDataToServerDone> data,result:");
45
+ //console.log(data);
46
+ // => Object
47
+ // areas: Array[1]
48
+ // 0: Object:
49
+ // id: 16,
50
+ // old_temp_id: "76400",
51
+ // buildings: Array,
52
+ // updated_locations_json: null
53
+ //console.log(result);
54
+ // => success
55
+
56
+ _map.save_preloader_klass.hide();
57
+
58
+ _map.data = data["updated_locations_json"];
59
+
60
+ //var i;
61
+ //var iarea_resp_params;
62
+ //var idrawn_area;
63
+ //for (i = 0; i< data["areas"].length; i++) {
64
+ // iarea_resp_params = data["areas"][i];
65
+ // найдем в массиве drawn_areas область, данные о которой сохранили на сервере
66
+ //idrawn_area = utils.getById(iarea["old_temp_id"], _map.drawn_areas);
67
+ //idrawn_area["id"] = iarea["id"];
68
+ //
69
+ //}
70
+
71
+ _map.drawn_areas = [];
72
+ _map.drawn_buildings = [];
73
+ _this.check_and_enable();
74
+
47
75
  };
48
76
 
49
77
  _this.onClick = function (e) {
@@ -1,11 +1,14 @@
1
1
  #= require ./svg_elements/helper.js
2
2
  #= require ./svg_elements/polygon.js
3
+ #= require ./svg_elements/area_label.js
3
4
 
4
5
  #= require_directory ./events
5
6
  #= require_directory ./map_objects
6
7
  #= require_directory ./view
7
8
  #= require_tree ./buttons
8
9
 
9
- #= require ./src/utils.js
10
+ #= require ./src/utils/utils.js
11
+ #= require ./src/utils/opacity_buttons_utils.js
12
+ #= require ./src/utils/map_utils.js
10
13
  #= require ./src/state_controller.js
11
14
  #= require ./src/main.js
@@ -4,6 +4,8 @@ function Area() {
4
4
 
5
5
  var _map = null;
6
6
  var _this = this;
7
+ _this.id = null;
8
+
7
9
  //var _polygon = null;
8
10
  //var _polygon_overlay = null;
9
11
 
@@ -50,6 +52,7 @@ function Area() {
50
52
 
51
53
  _map = pself;
52
54
  _this._options = options;
55
+ _this.id = options["id"];
53
56
 
54
57
  // [4ddl5df]
55
58
  if (_this._options["id"] == undefined) {
@@ -70,6 +73,10 @@ function Area() {
70
73
  _this._polygon.parent_building_hash = parent_building_hash;
71
74
  _this._polygon = $(_this._polygon.polygon);
72
75
 
76
+ // подпись над полигоном показываем только админам
77
+ if (IS_ADMIN) {
78
+ _this._label = new AreaLabel(options, _map);
79
+ }
73
80
 
74
81
  _this._polygon_overlay = Polygon.createFromSaved(options, true, _map);
75
82
  _this._polygon_overlay.area = _this;
@@ -77,10 +84,13 @@ function Area() {
77
84
  _this._polygon_overlay.hover(_this._mouse_in, _this._mouse_out);
78
85
  _this._calcBBox();
79
86
 
80
- var k = 'free';
87
+ var k = 'unassigned';
81
88
  if (options.area_hash != undefined) {
82
- if (!options.area_hash.is_free) {
83
- k = 'busy';
89
+ if (typeof options.area_hash.id !== 'undefined') {
90
+ k = 'free';
91
+ if (!options.area_hash.is_free) {
92
+ k = 'busy';
93
+ }
84
94
  }
85
95
  }
86
96
  _this._polygon.parent().attr("class", k);
@@ -94,7 +104,7 @@ function Area() {
94
104
  };
95
105
 
96
106
  _this.enter = function () {
97
- //clog("<Building.enter>");
107
+ console.log("<Area.enter>");
98
108
  //clog(_this._options);
99
109
 
100
110
  /* рассчитаем масштаб, при котором можно вписать прямоугольник дома в прямоугольник рабочей области */
@@ -108,8 +118,8 @@ function Area() {
108
118
  _map.x = _map.normalizeX(_map.CX - _map.scale * _cx - _map.container.offset().left);
109
119
  _map.y = _map.normalizeY(_map.CY - _map.scale * _cy - _map.container.offset().top);
110
120
 
111
- clog("<Area.enter> [qq] moveTo: " + _map.x + ", " + _map.y);
112
- clog("<Area.enter> Call moveTo.");
121
+ //clog("<Area.enter> [qq] moveTo: " + _map.x + ", " + _map.y);
122
+ //clog("<Area.enter> Call moveTo.");
113
123
  _map.moveTo(_map.x, _map.y, _map.scale, 400, 'easeInOutCubic');
114
124
 
115
125
  setTimeout(timeoutEnter, 400);
@@ -122,6 +132,7 @@ function Area() {
122
132
  _map.current_area._polygon.parent().attr("class", k);
123
133
  }
124
134
 
135
+ // <g class='busy viewing_area'>..<polygon >.</g>
125
136
  k = _this._polygon.parent().attr("class");
126
137
  k += " viewing_area";
127
138
  _this._polygon.parent().attr("class", k);
@@ -134,7 +145,7 @@ function Area() {
134
145
  };
135
146
 
136
147
  _this.exit = function () {
137
- _map.current_area = null;
148
+ console.log('<Area.exit>');
138
149
  };
139
150
 
140
151
  this.invalidateAnimationMask = function () {
@@ -182,9 +193,9 @@ function Area() {
182
193
  _cx = xmin + (xmax - xmin) / 2;
183
194
  _cy = ymin + (ymax - ymin) / 2;
184
195
 
185
- clog("<Area._calcBBox> " +
196
+ //clog("<Area._calcBBox> " +
186
197
  //xmin + "," + ymin + "; " + xmax + "," + ymax +
187
- "; center logical: " + _cx + "," + _cy + ", center screen: " + _map.rightX(_cx) + ", " + _map.rightY(_cy));
198
+ //"; center logical: " + _cx + "," + _cy + ", center screen: " + _map.rightX(_cx) + ", " + _map.rightY(_cy));
188
199
  };
189
200
 
190
201
  _this._mouse_in = function () {
@@ -245,7 +245,6 @@ function Building() {
245
245
  _image_bg = null;
246
246
  _image_overlay = null;
247
247
  _zoomToMe();
248
- _map.current_building = null;
249
248
  };
250
249
 
251
250
  // выдать центр дома в логических координатах
@@ -289,9 +288,9 @@ function Building() {
289
288
  _cx = xmin + (xmax - xmin) / 2;
290
289
  _cy = ymin + (ymax - ymin) / 2;
291
290
 
292
- console.log("<Building._calcBBox> " +
291
+ //console.log("<Building._calcBBox> " +
293
292
  //xmin + "," + ymin + "; " + xmax + "," + ymax +
294
- "; center logical: " + _cx + "," + _cy + ", center screen: " + _map.rightX(_cx) + ", " + _map.rightY(_cy));
293
+ //"; center logical: " + _cx + "," + _cy + ", center screen: " + _map.rightX(_cx) + ", " + _map.rightY(_cy));
295
294
  };
296
295
 
297
296
  // при редактировании здания (т.е. изменении полигонов и holer-ов площадей)
@@ -1,5 +1,8 @@
1
1
  "use strict";
2
2
 
3
+ var IS_ADMIN = false;
4
+ var map_on_index_page = null;
5
+
3
6
  var InitMap = function () {
4
7
 
5
8
  // - to delete start -----------------------------------------------------------------------------------------------------------------------
@@ -16,7 +19,7 @@ var InitMap = function () {
16
19
  var y = (window_height - image_height)/2;
17
20
  // - to delete end -----------------------------------------------------------------------------------------------------------------------
18
21
 
19
- $('#map_wrapper').beMap(
22
+ map_on_index_page = $('#map_wrapper').beMap(
20
23
  {
21
24
  source:LOCS_HASH,
22
25
  scale: scale,
@@ -61,10 +64,11 @@ var clog = function () {
61
64
  self.mode = 'viewing';
62
65
  self.prev_mode = null;
63
66
  self.setMode = null;
64
- self.selected_area = null;
67
+ self.selected_area = null; // ссылка на полигон из #svg_overlay
65
68
  self.drawing_poligon = null;
66
69
  self.events = [];
67
70
  self.edit_type = null;
71
+ self.remove_button_klass = null;
68
72
  self.new_button_klass = null;
69
73
  self.edit_button_klass = null;
70
74
  self.complete_creating_button_klass = null;
@@ -73,9 +77,11 @@ var clog = function () {
73
77
  self.current_area = null;
74
78
  self.is_draw = false;
75
79
  self.save_button_klass = null;
80
+ self.area_link_button_klass = null;
76
81
  self.drawn_areas = []; // если имеются нарисованные но несохранённые Площади - они хранятся тут
77
82
  self.drawn_buildings = []; // если имеются нарисованные но несохранённые Здания - они хранятся тут
78
83
  self.save_preloader_klass = null;
84
+ self.last_clicked_g = null; // начали просматривать area\building (запустили сессию), и здесь храним ссылку на последний кликнутый полигон из svg_overlay в течение сессии
79
85
 
80
86
  // true, если:
81
87
  //- юзер не кликал по кнопкам zoom
@@ -194,6 +200,13 @@ var clog = function () {
194
200
  e.init('.mapplic-new-button', self);
195
201
  self.new_button_klass = e;
196
202
 
203
+ e = new RemoveButton();
204
+ e.init('.mapplic-remove-button', self);
205
+ self.remove_button_klass = e;
206
+
207
+ e = new CancelRemoveButton();
208
+ e.init('#cancelRemoving', self);
209
+
197
210
  e = new CancelCreatingButton();
198
211
  e.init("#cancelCreating", self);
199
212
 
@@ -203,6 +216,12 @@ var clog = function () {
203
216
  self.save_button_klass = new SaveChangesButton();
204
217
  self.save_button_klass.init('.mapplic-save-button', self);
205
218
 
219
+ // при клике на эту кнопку произойдет показ модального окна
220
+ self.area_link_button_klass = new AreaLinkButton();
221
+ self.area_link_button_klass.init('.mapplic-area-link-button', self);
222
+
223
+ $('[data-toggle="tooltip"]').tooltip();
224
+
206
225
  });
207
226
 
208
227
  // Controls
@@ -306,7 +325,7 @@ var clog = function () {
306
325
 
307
326
  //app.deselectAll();
308
327
 
309
- // поменяем внешний вид - добавим класс .selected
328
+ // поменяем внешний вид полигона - добавим класс .selected
310
329
  self.selected_area.select();
311
330
 
312
331
  // запомним начальные координаты кликаы
@@ -376,8 +395,8 @@ var clog = function () {
376
395
  x = self.normalizeX(x);
377
396
  y = self.normalizeY(y);
378
397
 
379
- clog("<Map.mousemove> x = " + x + "; y = " + y);
380
- clog("<Map.mousemove> Call moveTo.");
398
+ //clog("<Map.mousemove> x = " + x + "; y = " + y);
399
+ //clog("<Map.mousemove> Call moveTo.");
381
400
  self.moveTo(x, y);
382
401
  map.data('lastX', x);
383
402
  map.data('lastY', y);
@@ -478,13 +497,24 @@ var clog = function () {
478
497
  /* если находится в режиме просмотра площади - переключаемся на другую площадь */
479
498
  else if (self.mode == 'view_building' || self.mode == 'view_area') {
480
499
 
500
+ //console.log($(event.target).parent());
501
+ // => g, который живёт в #svg_overlay, или, другими словами,
502
+ // тот g, по которому кликнули последний раз,
503
+ // просматривая либо здание, либо площадь
504
+ var $viewing_g_from_svg_overlay = $(event.target).parent();
505
+
481
506
  // добираемся до объекта класса Area, который обслуживает полигон
482
- p = $(event.target).parent()[0];
507
+ p = $viewing_g_from_svg_overlay[0];
483
508
  //clog($(event.target).parent()[0].obj.area_hash);
484
509
 
485
510
  if (p.obj && p.obj.area) {
511
+
512
+ // запомним последний кликнутый полигон
513
+ self.last_clicked_g = $viewing_g_from_svg_overlay;
514
+
486
515
  var area = p.obj.area;
487
- clog("<mouseup> Входим в площадь.");
516
+ clog("<mouseup> Входим в площадь. self.last_clicked_g = ");
517
+ clog(self.last_clicked_g);
488
518
  area.enter();
489
519
  }
490
520
 
@@ -528,7 +558,7 @@ var clog = function () {
528
558
 
529
559
  // какой должен быть минимальный масштаб, чтобы вписать отрезок [min,max] в отрезок [p1,p2]
530
560
  self.calcScale = function (min, max, p1, p2) {
531
- clog("<calcScale> [" + min + "," + max + '] to [' + p1 + "," + p2 + "]");
561
+ //clog("<calcScale> [" + min + "," + max + '] to [' + p1 + "," + p2 + "]");
532
562
  return (p2 - p1) / (max - min);
533
563
  };
534
564
 
@@ -647,6 +677,7 @@ var clog = function () {
647
677
 
648
678
  self.svgRemoveAllNodes = function () {
649
679
  self.svg.empty();
680
+ self.svg_overlay.empty();
650
681
  };
651
682
 
652
683
  self.draw_childs = function (childs, parent_hash) {
@@ -840,7 +871,9 @@ var clog = function () {
840
871
 
841
872
  };
842
873
  var __moveToTimeout = function () {
843
- $("#masked").removeClass('hiddn');
874
+ if (self.mode === 'edit_area'|| self.mode === 'view_area') {
875
+ $("#masked").removeClass('hiddn');
876
+ }
844
877
  };
845
878
  var __moveToAnimate = function () {
846
879
  if (self.tooltip) self.tooltip.position();
@@ -848,7 +881,8 @@ var clog = function () {
848
881
 
849
882
  // x,y - экранные координаты
850
883
  self.moveTo = function (x, y, scale, d, easing) {
851
- clog("<self.moveTo> x = " + x + "; y = " + y + "; scale = " + scale);
884
+ //clog("<self.moveTo> x = " + x + "; y = " + y + "; scale = " + scale);
885
+ clog('<self.moveTo>');
852
886
 
853
887
  // если подан аргумент scale(масштаб)
854
888
  // перемещаемся анимированно
@@ -974,6 +1008,36 @@ var clog = function () {
974
1008
 
975
1009
  self.rightY = function(y) {
976
1010
  return (y - self.y - self.container.offset().top) / self.scale
1011
+ };
1012
+
1013
+ // взять C80Map::current_area и назначить ей Rent::area.id,
1014
+ // выбранный в окне _modal_window.html.erb
1015
+ self.link_area = function () {
1016
+
1017
+ var $m = $('#modal_window');
1018
+ var $b = $m.find('.modal-footer').find('.btn');
1019
+ var $s = $m.find('select');
1020
+
1021
+ var rent_area_id = $s.val();
1022
+ var map_area_id = self.current_area.id;
1023
+ console.log("<Map.link_area> rent_area_id = " + rent_area_id + "; map_area_id = " + map_area_id);
1024
+
1025
+ $b.click();
1026
+ self.save_preloader_klass.show();
1027
+
1028
+ $.ajax({
1029
+ url:'/ajax/link_area',
1030
+ type:'POST',
1031
+ data: {
1032
+ rent_area_id: rent_area_id,
1033
+ map_area_id: map_area_id
1034
+ },
1035
+ dataType:"json"
1036
+ }).done(function (data, result) {
1037
+ self.save_preloader_klass.hide();
1038
+ self.data = data["updated_locations_json"];
1039
+ });
1040
+
977
1041
  }
978
1042
 
979
1043
  };