c80_map 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.travis.yml +3 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +51 -0
- data/Rakefile +1 -0
- data/app/admin/c80_map/settings.rb +32 -0
- data/app/assets/javascripts/buttons/admin_buttons/button_back_to_map.js +48 -0
- data/app/assets/javascripts/buttons/admin_buttons/button_cancel_create.js +21 -0
- data/app/assets/javascripts/buttons/admin_buttons/button_complete_create.js +22 -0
- data/app/assets/javascripts/buttons/admin_buttons/button_edit.js +80 -0
- data/app/assets/javascripts/buttons/admin_buttons/button_new.js +46 -0
- data/app/assets/javascripts/buttons/admin_buttons/button_save.js +83 -0
- data/app/assets/javascripts/buttons/zoom_buttons.js +61 -0
- data/app/assets/javascripts/c80_map.js.coffee +11 -0
- data/app/assets/javascripts/events/app_event.js +15 -0
- data/app/assets/javascripts/map_objects/area.js +221 -0
- data/app/assets/javascripts/map_objects/building.js +309 -0
- data/app/assets/javascripts/map_objects/dot.js +14 -0
- data/app/assets/javascripts/src/main.js +992 -0
- data/app/assets/javascripts/src/state_controller.js +220 -0
- data/app/assets/javascripts/src/utils.js +127 -0
- data/app/assets/javascripts/svg_elements/helper.js +36 -0
- data/app/assets/javascripts/svg_elements/polygon.js +192 -0
- data/app/assets/javascripts/view/save_preloader.js +30 -0
- data/app/assets/stylesheets/c80_map.scss +2 -0
- data/app/assets/stylesheets/map.scss +1435 -0
- data/app/assets/stylesheets/view/save_preloader.scss +206 -0
- data/app/controllers/c80_map/application_controller.rb +6 -0
- data/app/controllers/c80_map/map_ajax_controller.rb +54 -0
- data/app/helpers/c80_map/application_helper.rb +33 -0
- data/app/models/c80_map/area.rb +5 -0
- data/app/models/c80_map/building.rb +73 -0
- data/app/models/c80_map/setting.rb +30 -0
- data/app/uploaders/c80_map/map_image_uploader.rb +31 -0
- data/app/views/c80_map/_map_row.html.erb +15 -0
- data/app/views/c80_map/_map_row_index.html.erb +39 -0
- data/app/views/c80_map/shared/_save_preloader.html.erb +3 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/c80_map.gemspec +25 -0
- data/config/routes.rb +3 -0
- data/db/migrate/20160617130000_create_c80_map_settings.rb +8 -0
- data/db/migrate/20160620040202_create_c80_map_areas.rb +9 -0
- data/db/migrate/20160620040204_create_c80_map_buildings.rb +8 -0
- data/db/seeds/801_fill_map_settings.rb +6 -0
- data/lib/c80_map/engine.rb +23 -0
- data/lib/c80_map/version.rb +3 -0
- data/lib/c80_map.rb +8 -0
- metadata +136 -0
| @@ -0,0 +1,220 @@ | |
| 1 | 
            +
            "use strict";
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            function StateController() {
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                var _map = null;
         | 
| 6 | 
            +
                var _this = this;
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                _this.left_side = $("#left_side");
         | 
| 9 | 
            +
                _this.right_side = $("#right_side");
         | 
| 10 | 
            +
                _this.new_button = $('.mapplic-new-button');
         | 
| 11 | 
            +
                _this.mzoom_buttons = $('.mzoom_buttons');
         | 
| 12 | 
            +
                _this.map_creating = $('#map_creating');
         | 
| 13 | 
            +
                _this.map_editing = $('#map_editing');
         | 
| 14 | 
            +
                _this.main_map = $('.main_map');
         | 
| 15 | 
            +
                _this.svg_overlay = $('#svg_overlay');
         | 
| 16 | 
            +
                _this.building_info = $('.building_info');
         | 
| 17 | 
            +
                _this.area_order_button = $('.area_order_button');
         | 
| 18 | 
            +
                _this.masked = $('#masked');
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                _this.setMode = function (mode) {
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                    // Должен быть учёт, из какого состояния пришли в состояние рисования, и возвращаться в него
         | 
| 23 | 
            +
                    //      * При рисовании, находясь внутри здания, возвращаться в 'edit_building'
         | 
| 24 | 
            +
                    //      * При рисовании, находясь внутри площади, возвращаться в 'edit_area'
         | 
| 25 | 
            +
                    // За исключением ситуации, когда начали редактировать, находясь на карте
         | 
| 26 | 
            +
                    if (mode == 'editing' && _map.prev_mode != 'viewing') {
         | 
| 27 | 
            +
                        mode = _map.prev_mode;
         | 
| 28 | 
            +
                    }
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                    clog('<StateController.setMode> mode = ' + mode);
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                    _map.prev_mode = _map.mode;
         | 
| 33 | 
            +
                    _map.mode = mode;
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                    // этот код коррелирует с [x9cs7]. Возможно, нужен рефакторинг.
         | 
| 36 | 
            +
                    _map.container.removeClass("viewing");
         | 
| 37 | 
            +
                    _map.container.removeClass("editing");
         | 
| 38 | 
            +
                    _map.container.removeClass("creating");
         | 
| 39 | 
            +
                    _map.container.removeClass("view_building");
         | 
| 40 | 
            +
                    _map.container.removeClass("edit_building");
         | 
| 41 | 
            +
                    _map.container.removeClass("view_area");
         | 
| 42 | 
            +
                    _map.container.removeClass("edit_area");
         | 
| 43 | 
            +
                    _map.container.addClass(mode);
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                    _this.checkMode();
         | 
| 46 | 
            +
                };
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                _this.checkMode = function () {
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                    if (_this.new_button.length == 0) _this.new_button = $('.mapplic-new-button');
         | 
| 51 | 
            +
                    if (_this.right_side.length == 0) _this.right_side = $('#right_side');
         | 
| 52 | 
            +
                    if (_this.left_side.length == 0) _this.left_side = $('#left_side');
         | 
| 53 | 
            +
                    if (_this.mzoom_buttons.length == 0) _this.mzoom_buttons = $('.mzoom_buttons');
         | 
| 54 | 
            +
                    if (_this.map_creating.length == 0) _this.map_creating = $('#map_creating');
         | 
| 55 | 
            +
                    if (_this.map_editing.length == 0) _this.map_editing = $('#map_editing');
         | 
| 56 | 
            +
                    if (_this.main_map.length == 0) _this.main_map = $('.main_map');
         | 
| 57 | 
            +
                    if (_this.svg_overlay.length == 0) _this.svg_overlay = $('#svg_overlay');
         | 
| 58 | 
            +
                    if (_this.building_info.length == 0) _this.building_info = $('.building_info');
         | 
| 59 | 
            +
                    if (_this.area_order_button.length == 0) _this.area_order_button = $('.area_order_button');
         | 
| 60 | 
            +
                    if (_this.masked.length == 0) _this.masked = $("#masked");
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                    switch (_map.mode) {
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                        // перешли в состояние
         | 
| 65 | 
            +
                        // редактирования карты
         | 
| 66 | 
            +
                        case "editing":
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                            // спрячем надписи "цена за метр" и адрес с телефоном
         | 
| 69 | 
            +
                            _this.left_side.css("top", -300);
         | 
| 70 | 
            +
                            _this.right_side.css("top", -300);
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                            // покажем кнопку "добавить фигуру"
         | 
| 73 | 
            +
                            _this.new_button.css('opacity', '1');
         | 
| 74 | 
            +
                            _this.new_button.removeClass('mapplic-disabled');
         | 
| 75 | 
            +
                            _map.new_button_klass.resetState();
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                            // спрячем статусную область
         | 
| 78 | 
            +
                            _this.map_creating.css('display', 'none');
         | 
| 79 | 
            +
                            _this.map_editing.css('display', 'block');
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                            // покажем кнопки, присущие этому режиму
         | 
| 82 | 
            +
                            _this.mzoom_buttons.css('opacity', '1');
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                            _this.main_map.css('opacity', '1');
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                            _map.save_button_klass.show();
         | 
| 87 | 
            +
                            _map.save_button_klass.check_and_enable();
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                            break;
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                        // перешли в состояние
         | 
| 92 | 
            +
                        // просмотра карты, все здания с крышами
         | 
| 93 | 
            +
                        case "viewing":
         | 
| 94 | 
            +
                            //clog("_this.left_side.data('init') = " + _this.left_side.data('init'));
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                            // покажем надписи "цена за метр" и адрес с телефоном
         | 
| 97 | 
            +
                            if (_this.left_side.data('init') == undefined) {
         | 
| 98 | 
            +
                                _this.left_side.data('init', _this.left_side.css("top"));
         | 
| 99 | 
            +
                            }
         | 
| 100 | 
            +
                            if (_this.right_side.data('init') == undefined) {
         | 
| 101 | 
            +
                                _this.right_side.data('init', _this.right_side.css("top"));
         | 
| 102 | 
            +
                            }
         | 
| 103 | 
            +
                            _this.left_side.css("top", _this.left_side.data('init'));
         | 
| 104 | 
            +
                            _this.right_side.css("top", _this.right_side.data('init'));
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                            _this.new_button.css('opacity', '0');
         | 
| 107 | 
            +
                            _this.new_button.addClass('mapplic-disabled');
         | 
| 108 | 
            +
                            _this.mzoom_buttons.css('opacity', '1');
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                            _this.map_creating.css('display', 'none');
         | 
| 111 | 
            +
                            _this.map_editing.css('display', 'none');
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                            _this.main_map.css('opacity', '1');
         | 
| 114 | 
            +
                            _this.svg_overlay.css('display', 'none');
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                            if (_this.building_info.data("init") == undefined) {
         | 
| 117 | 
            +
                                _this.building_info.data('init', _this.building_info.css("top"));
         | 
| 118 | 
            +
                            }
         | 
| 119 | 
            +
                            _this.building_info.css("top", -300);
         | 
| 120 | 
            +
                            _this.building_info.css("display", "block");
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                            _map.back_to_map_button_klass.hide();
         | 
| 123 | 
            +
                            _this.masked.addClass('hiddn');
         | 
| 124 | 
            +
             | 
| 125 | 
            +
                            _this.area_order_button.css('display', 'none');
         | 
| 126 | 
            +
             | 
| 127 | 
            +
                            // актуально, когда входим в это состояние
         | 
| 128 | 
            +
                            // из здания\площади, нажав кнопку "обратно на карту"
         | 
| 129 | 
            +
                            _map.edit_button_klass.setState('viewing', true); // [a1x7]
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                            if (_map.save_button_klass) {
         | 
| 132 | 
            +
                                _map.save_button_klass.hide();
         | 
| 133 | 
            +
                            }
         | 
| 134 | 
            +
             | 
| 135 | 
            +
                            break;
         | 
| 136 | 
            +
             | 
| 137 | 
            +
                        // перешли в состояние рисования полигона
         | 
| 138 | 
            +
                        case "creating":
         | 
| 139 | 
            +
                            //_this.mzoom_buttons.css('opacity', '0');
         | 
| 140 | 
            +
                            _this.map_creating.css('display', 'block');
         | 
| 141 | 
            +
                            _this.map_editing.css('display', 'none');
         | 
| 142 | 
            +
             | 
| 143 | 
            +
                            _this.main_map.css('opacity', '1');
         | 
| 144 | 
            +
             | 
| 145 | 
            +
                            break;
         | 
| 146 | 
            +
             | 
| 147 | 
            +
                        // вошли в здание
         | 
| 148 | 
            +
                        case "view_building":
         | 
| 149 | 
            +
                            // спрячем надписи "цена за метр" и адрес с телефоном
         | 
| 150 | 
            +
                            _this.left_side.css("top", -300);
         | 
| 151 | 
            +
                            _this.right_side.css("top", -300);
         | 
| 152 | 
            +
             | 
| 153 | 
            +
                            //_this.main_map.css('opacity','0.7');
         | 
| 154 | 
            +
                            _this.svg_overlay.css('display', 'block');
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                            _this.building_info.css("top", _this.building_info.data("init"));
         | 
| 157 | 
            +
                            _map.back_to_map_button_klass.show();
         | 
| 158 | 
            +
                            _this.masked.addClass('hiddn');
         | 
| 159 | 
            +
             | 
| 160 | 
            +
                            _this.area_order_button.css('display', 'none');
         | 
| 161 | 
            +
                            _map.edit_button_klass.setState('view_building', true); // [a1x7]
         | 
| 162 | 
            +
                            _map.current_building.resetOverlayZindex();
         | 
| 163 | 
            +
                            _map.save_button_klass.hide();
         | 
| 164 | 
            +
             | 
| 165 | 
            +
                            break;
         | 
| 166 | 
            +
             | 
| 167 | 
            +
                        // вошли в площадь
         | 
| 168 | 
            +
                        case "view_area":
         | 
| 169 | 
            +
                            _map.back_to_map_button_klass.show();
         | 
| 170 | 
            +
                            _this.masked.removeClass('hiddn');
         | 
| 171 | 
            +
                            var t = _this.building_info.height() + _this.building_info.offset().top;
         | 
| 172 | 
            +
                            var tt = _this.building_info.css("left");
         | 
| 173 | 
            +
                            var tq = (_this.building_info.width() + 40) + "px";
         | 
| 174 | 
            +
                            _this.area_order_button.css("top", t + "px");
         | 
| 175 | 
            +
                            // _this.area_order_button.css("bottom","400px");
         | 
| 176 | 
            +
                            _this.area_order_button.css("left", tt);
         | 
| 177 | 
            +
                            _this.area_order_button.css("width", tq);
         | 
| 178 | 
            +
                            _this.area_order_button.css('display', 'block');
         | 
| 179 | 
            +
                            _map.edit_button_klass.setState('view_area', true); // [a1x7]
         | 
| 180 | 
            +
                        break;
         | 
| 181 | 
            +
             | 
| 182 | 
            +
                        // редактируем, находясь в здании
         | 
| 183 | 
            +
                        case "edit_building":
         | 
| 184 | 
            +
                            _map.back_to_map_button_klass.hide();
         | 
| 185 | 
            +
             | 
| 186 | 
            +
                            // т.к. этот слой используется испключительно в помощь при рисовании обводки площадей
         | 
| 187 | 
            +
                            // и перехватывает клики при dnd, то тут он нам не нужен
         | 
| 188 | 
            +
                            _this.svg_overlay.css('display', 'none');
         | 
| 189 | 
            +
             | 
| 190 | 
            +
                            // заодно поменяем z-index слоёв с колоннами и слоя с svg
         | 
| 191 | 
            +
                            // полигонами площадей, чтобы можно было добраться мышкой
         | 
| 192 | 
            +
                            // до этих полигонов и редактировать их
         | 
| 193 | 
            +
                            _map.current_building.changeOverlayZindex();
         | 
| 194 | 
            +
             | 
| 195 | 
            +
                            // покажем кнопку "добавить фигуру"
         | 
| 196 | 
            +
                            _this.new_button.css('opacity', '1');
         | 
| 197 | 
            +
                            _this.new_button.removeClass('mapplic-disabled');
         | 
| 198 | 
            +
                            _map.new_button_klass.resetState();
         | 
| 199 | 
            +
             | 
| 200 | 
            +
                            // спрячем инфу о здании
         | 
| 201 | 
            +
                            _this.building_info.css("top", -300);
         | 
| 202 | 
            +
             | 
| 203 | 
            +
                            // спрячем статус строку "вы создаёте полигон"
         | 
| 204 | 
            +
                            _this.map_creating.css('display', 'none');
         | 
| 205 | 
            +
             | 
| 206 | 
            +
                            // покажем, возможно спрятанные, zoom кнопки
         | 
| 207 | 
            +
                            _this.mzoom_buttons.css('opacity', '1');
         | 
| 208 | 
            +
             | 
| 209 | 
            +
                            _map.save_button_klass.show();
         | 
| 210 | 
            +
                            _map.save_button_klass.check_and_enable();
         | 
| 211 | 
            +
             | 
| 212 | 
            +
                        break;
         | 
| 213 | 
            +
                    }
         | 
| 214 | 
            +
                };
         | 
| 215 | 
            +
             | 
| 216 | 
            +
                _this.init = function (link_to_map) {
         | 
| 217 | 
            +
                    _map = link_to_map;
         | 
| 218 | 
            +
                }
         | 
| 219 | 
            +
                
         | 
| 220 | 
            +
            }
         | 
| @@ -0,0 +1,127 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            var utils = {
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                offsetX: function (node) {
         | 
| 5 | 
            +
                    var box = node.getBoundingClientRect(),
         | 
| 6 | 
            +
                        scroll = window.pageXOffset;
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                    return Math.round(box.left + scroll);
         | 
| 9 | 
            +
                },
         | 
| 10 | 
            +
                offsetY: function (node) {
         | 
| 11 | 
            +
                    var box = node.getBoundingClientRect(),
         | 
| 12 | 
            +
                        scroll = window.pageYOffset;
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                    return Math.round(box.top + scroll);
         | 
| 15 | 
            +
                },
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                trim: function (str) {
         | 
| 18 | 
            +
                    return str.replace(/^\s+|\s+$/g, '');
         | 
| 19 | 
            +
                },
         | 
| 20 | 
            +
                id: function (str) {
         | 
| 21 | 
            +
                    return document.getElementById(str);
         | 
| 22 | 
            +
                },
         | 
| 23 | 
            +
                hide: function (node) {
         | 
| 24 | 
            +
                    node.style.display = 'none';
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    return this;
         | 
| 27 | 
            +
                },
         | 
| 28 | 
            +
                show: function (node) {
         | 
| 29 | 
            +
                    node.style.display = 'block';
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                    return this;
         | 
| 32 | 
            +
                },
         | 
| 33 | 
            +
                encode: function (str) {
         | 
| 34 | 
            +
                    return str.replace(/</g, '<').replace(/>/g, '>');
         | 
| 35 | 
            +
                },
         | 
| 36 | 
            +
                decode: function (str) {
         | 
| 37 | 
            +
                    return str.replace(/</g, '<').replace(/>/g, '>');
         | 
| 38 | 
            +
                },
         | 
| 39 | 
            +
                foreach: function (arr, func) {
         | 
| 40 | 
            +
                    for (var i = 0, count = arr.length; i < count; i++) {
         | 
| 41 | 
            +
                        func(arr[i], i);
         | 
| 42 | 
            +
                    }
         | 
| 43 | 
            +
                },
         | 
| 44 | 
            +
                foreachReverse: function (arr, func) {
         | 
| 45 | 
            +
                    for (var i = arr.length - 1; i >= 0; i--) {
         | 
| 46 | 
            +
                        func(arr[i], i);
         | 
| 47 | 
            +
                    }
         | 
| 48 | 
            +
                },
         | 
| 49 | 
            +
                debug: (function () {
         | 
| 50 | 
            +
                    var output = document.getElementById('debug');
         | 
| 51 | 
            +
                    return function () {
         | 
| 52 | 
            +
                        output.innerHTML = [].join.call(arguments, ' ');
         | 
| 53 | 
            +
                    }
         | 
| 54 | 
            +
                })(),
         | 
| 55 | 
            +
                stopEvent: function (e) {
         | 
| 56 | 
            +
                    e.stopPropagation();
         | 
| 57 | 
            +
                    e.preventDefault();
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                    return this;
         | 
| 60 | 
            +
                },
         | 
| 61 | 
            +
                addClass: function (node, str) {
         | 
| 62 | 
            +
                    // node.className.baseVal for SVG-elements
         | 
| 63 | 
            +
                    // or
         | 
| 64 | 
            +
                    // node.className for HTML-elements
         | 
| 65 | 
            +
                    var is_svg = node.className.baseVal !== undefined ? true : false,
         | 
| 66 | 
            +
                        arr = is_svg ? node.className.baseVal.split(' ') : node.className.split(' '),
         | 
| 67 | 
            +
                        isset = false;
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                    utils.foreach(arr, function (x) {
         | 
| 70 | 
            +
                        if (x === str) {
         | 
| 71 | 
            +
                            isset = true;
         | 
| 72 | 
            +
                        }
         | 
| 73 | 
            +
                    });
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                    if (!isset) {
         | 
| 76 | 
            +
                        arr.push(str);
         | 
| 77 | 
            +
                        is_svg ? node.className.baseVal = arr.join(' ') : node.className = arr.join(' ');
         | 
| 78 | 
            +
                    }
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                    return this;
         | 
| 81 | 
            +
                },
         | 
| 82 | 
            +
                removeClass: function (node, str) {
         | 
| 83 | 
            +
                    var is_svg = node.className.baseVal !== undefined ? true : false,
         | 
| 84 | 
            +
                        arr = is_svg ? node.className.baseVal.split(' ') : node.className.split(' '),
         | 
| 85 | 
            +
                        isset = false;
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                    utils.foreach(arr, function (x, i) {
         | 
| 88 | 
            +
                        if (x === str) {
         | 
| 89 | 
            +
                            isset = true;
         | 
| 90 | 
            +
                            arr.splice(i--, 1);
         | 
| 91 | 
            +
                        }
         | 
| 92 | 
            +
                    });
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                    if (isset) {
         | 
| 95 | 
            +
                        is_svg ? node.className.baseVal = arr.join(' ') : node.className = arr.join(' ');
         | 
| 96 | 
            +
                    }
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                    return this;
         | 
| 99 | 
            +
                },
         | 
| 100 | 
            +
                hasClass: function (node, str) {
         | 
| 101 | 
            +
                    var is_svg = node.className.baseVal !== undefined ? true : false,
         | 
| 102 | 
            +
                        arr = is_svg ? node.className.baseVal.split(' ') : node.className.split(' '),
         | 
| 103 | 
            +
                        isset = false;
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                    utils.foreach(arr, function (x) {
         | 
| 106 | 
            +
                        if (x === str) {
         | 
| 107 | 
            +
                            isset = true;
         | 
| 108 | 
            +
                        }
         | 
| 109 | 
            +
                    });
         | 
| 110 | 
            +
             | 
| 111 | 
            +
                    return isset;
         | 
| 112 | 
            +
                },
         | 
| 113 | 
            +
                extend: function (obj, options) {
         | 
| 114 | 
            +
                    var target = {};
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                    for (var name in obj) {
         | 
| 117 | 
            +
                        if (obj.hasOwnProperty(name)) {
         | 
| 118 | 
            +
                            target[name] = options[name] ? options[name] : obj[name];
         | 
| 119 | 
            +
                        }
         | 
| 120 | 
            +
                    }
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                    return target;
         | 
| 123 | 
            +
                },
         | 
| 124 | 
            +
                supportFileReader: (function () {
         | 
| 125 | 
            +
                    return (typeof FileReader !== 'undefined');
         | 
| 126 | 
            +
                })()
         | 
| 127 | 
            +
            };
         | 
| @@ -0,0 +1,36 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            /* Helper constructor */
         | 
| 3 | 
            +
            function Helper(node, x, y) {
         | 
| 4 | 
            +
                this.helper = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
         | 
| 5 | 
            +
                this.helper.setAttribute('class', 'helper');
         | 
| 6 | 
            +
                this.helper.setAttribute('height', 5);
         | 
| 7 | 
            +
                this.helper.setAttribute('width', 5);
         | 
| 8 | 
            +
                this.helper.setAttribute('x', x - 3);
         | 
| 9 | 
            +
                this.helper.setAttribute('y', y - 3);
         | 
| 10 | 
            +
                node.appendChild(this.helper);
         | 
| 11 | 
            +
            }
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            Helper.prototype.setCoords = function (x, y) {
         | 
| 14 | 
            +
                this.helper.setAttribute('x', x - 3);
         | 
| 15 | 
            +
                this.helper.setAttribute('y', y - 3);
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                return this;
         | 
| 18 | 
            +
            };
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            Helper.prototype.setAction = function (action) {
         | 
| 21 | 
            +
                this.helper.action = action;
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                return this;
         | 
| 24 | 
            +
            };
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            Helper.prototype.setCursor = function (cursor) {
         | 
| 27 | 
            +
                utils.addClass(this.helper, cursor);
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                return this;
         | 
| 30 | 
            +
            };
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            Helper.prototype.setId = function (id) {
         | 
| 33 | 
            +
                this.helper.n = id;
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                return this;
         | 
| 36 | 
            +
            };
         | 
| @@ -0,0 +1,192 @@ | |
| 1 | 
            +
            /* Polygon constructor */
         | 
| 2 | 
            +
            var Polygon = function (x, y, is_overlay, self) {
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                this._map = self;
         | 
| 5 | 
            +
                this._map.is_draw = true;
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                this.params = [x, y]; //array of coordinates of polygon points
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                this.g = document.createElementNS('http://www.w3.org/2000/svg', 'g');
         | 
| 10 | 
            +
                this.polygon = document.createElementNS('http://www.w3.org/2000/svg', 'polyline');
         | 
| 11 | 
            +
                this._map.addNodeToSvg(this.g, is_overlay);
         | 
| 12 | 
            +
                this.g.appendChild(this.polygon);
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                this.g.obj = this;
         | 
| 15 | 
            +
                /* Link to parent object */
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                this.helpers = [ //array of all helpers-rectangles
         | 
| 18 | 
            +
                    new Helper(this.g, this.params[0], this.params[1])
         | 
| 19 | 
            +
                ];
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                this.helpers[0].setAction('pointMove').setCursor('pointer').setId(0);
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                this.selected_point = -1;
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                this.select().redraw();
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                // app.addObject(this); //add this object to array of all objects
         | 
| 28 | 
            +
            };
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            Polygon.prototype.setCoords = function (params) {
         | 
| 31 | 
            +
                //console.log(params);
         | 
| 32 | 
            +
                var coords_values = params.join(' ');
         | 
| 33 | 
            +
                this.polygon.setAttribute('points', coords_values);
         | 
| 34 | 
            +
                utils.foreach(this.helpers, function (x, i) {
         | 
| 35 | 
            +
                    x.setCoords(params[2 * i], params[2 * i + 1]);
         | 
| 36 | 
            +
                });
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                return this;
         | 
| 39 | 
            +
            };
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            Polygon.prototype.setParams = function (arr) {
         | 
| 42 | 
            +
                this.params = Array.prototype.slice.call(arr);
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                return this;
         | 
| 45 | 
            +
            };
         | 
| 46 | 
            +
             | 
| 47 | 
            +
            Polygon.prototype.addPoint = function (x, y) {
         | 
| 48 | 
            +
                var helper = new Helper(this.g, x, y);
         | 
| 49 | 
            +
                helper.setAction('pointMove').setCursor('pointer').setId(this.helpers.length);
         | 
| 50 | 
            +
                this.helpers.push(helper);
         | 
| 51 | 
            +
                this.params.push(x, y);
         | 
| 52 | 
            +
                this.redraw();
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                return this;
         | 
| 55 | 
            +
            };
         | 
| 56 | 
            +
             | 
| 57 | 
            +
            Polygon.prototype.redraw = function () {
         | 
| 58 | 
            +
                this.setCoords(this.params);
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                return this;
         | 
| 61 | 
            +
            };
         | 
| 62 | 
            +
             | 
| 63 | 
            +
            Polygon.prototype.right_angle = function (x, y) {
         | 
| 64 | 
            +
                var old_x = this.params[this.params.length - 2],
         | 
| 65 | 
            +
                    old_y = this.params[this.params.length - 1],
         | 
| 66 | 
            +
                    dx = x - old_x,
         | 
| 67 | 
            +
                    dy = -(y - old_y),
         | 
| 68 | 
            +
                    tan = dy / dx; //tangens
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                if (dx > 0 && dy > 0) {
         | 
| 71 | 
            +
                    if (tan > 2.414) {
         | 
| 72 | 
            +
                        x = old_x;
         | 
| 73 | 
            +
                    } else if (tan < 0.414) {
         | 
| 74 | 
            +
                        y = old_y;
         | 
| 75 | 
            +
                    } else {
         | 
| 76 | 
            +
                        Math.abs(dx) > Math.abs(dy) ? x = old_x + dy : y = old_y - dx;
         | 
| 77 | 
            +
                    }
         | 
| 78 | 
            +
                } else if (dx < 0 && dy > 0) {
         | 
| 79 | 
            +
                    if (tan < -2.414) {
         | 
| 80 | 
            +
                        x = old_x;
         | 
| 81 | 
            +
                    } else if (tan > -0.414) {
         | 
| 82 | 
            +
                        y = old_y;
         | 
| 83 | 
            +
                    } else {
         | 
| 84 | 
            +
                        Math.abs(dx) > Math.abs(dy) ? x = old_x - dy : y = old_y + dx;
         | 
| 85 | 
            +
                    }
         | 
| 86 | 
            +
                } else if (dx < 0 && dy < 0) {
         | 
| 87 | 
            +
                    if (tan > 2.414) {
         | 
| 88 | 
            +
                        x = old_x;
         | 
| 89 | 
            +
                    } else if (tan < 0.414) {
         | 
| 90 | 
            +
                        y = old_y;
         | 
| 91 | 
            +
                    } else {
         | 
| 92 | 
            +
                        Math.abs(dx) > Math.abs(dy) ? x = old_x + dy : y = old_y - dx;
         | 
| 93 | 
            +
                    }
         | 
| 94 | 
            +
                } else if (dx > 0 && dy < 0) {
         | 
| 95 | 
            +
                    if (tan < -2.414) {
         | 
| 96 | 
            +
                        x = old_x;
         | 
| 97 | 
            +
                    } else if (tan > -0.414) {
         | 
| 98 | 
            +
                        y = old_y;
         | 
| 99 | 
            +
                    } else {
         | 
| 100 | 
            +
                        Math.abs(dx) > Math.abs(dy) ? x = old_x - dy : y = old_y + dx;
         | 
| 101 | 
            +
                    }
         | 
| 102 | 
            +
                }
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                return {
         | 
| 105 | 
            +
                    x: x,
         | 
| 106 | 
            +
                    y: y
         | 
| 107 | 
            +
                };
         | 
| 108 | 
            +
            };
         | 
| 109 | 
            +
             | 
| 110 | 
            +
            Polygon.prototype.dynamicDraw = function (x, y, right_angle) {
         | 
| 111 | 
            +
                var temp_params = [].concat(this.params);
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                if (right_angle) {
         | 
| 114 | 
            +
                    var right_coords = this.right_angle(x, y);
         | 
| 115 | 
            +
                    x = right_coords.x;
         | 
| 116 | 
            +
                    y = right_coords.y;
         | 
| 117 | 
            +
                }
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                temp_params.push(x, y);
         | 
| 120 | 
            +
             | 
| 121 | 
            +
                this.setCoords(temp_params);
         | 
| 122 | 
            +
             | 
| 123 | 
            +
                return temp_params;
         | 
| 124 | 
            +
            };
         | 
| 125 | 
            +
             | 
| 126 | 
            +
            Polygon.prototype.move = function (x, y) { //offset x and y
         | 
| 127 | 
            +
                var temp_params = Object.create(this.params);
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                for (var i = 0, count = this.params.length; i < count; i++) {
         | 
| 130 | 
            +
                    //i % 2 ? this.params[i] += y : this.params[i] += x;
         | 
| 131 | 
            +
                    if (i % 2) {
         | 
| 132 | 
            +
                        this.params[i] = Number(this.params[i]) + y;
         | 
| 133 | 
            +
                    } else {
         | 
| 134 | 
            +
                        this.params[i] = Number(this.params[i]) + x;
         | 
| 135 | 
            +
                    }
         | 
| 136 | 
            +
                }
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                return temp_params;
         | 
| 139 | 
            +
            };
         | 
| 140 | 
            +
             | 
| 141 | 
            +
            Polygon.prototype.pointMove = function (x, y) { //offset x and y
         | 
| 142 | 
            +
                this.params[2 * this.selected_point] += x;
         | 
| 143 | 
            +
                this.params[2 * this.selected_point + 1] += y;
         | 
| 144 | 
            +
             | 
| 145 | 
            +
                return this.params;
         | 
| 146 | 
            +
            };
         | 
| 147 | 
            +
             | 
| 148 | 
            +
            Polygon.prototype.dynamicEdit = function (temp_params) {
         | 
| 149 | 
            +
                this.setCoords(temp_params);
         | 
| 150 | 
            +
             | 
| 151 | 
            +
                return temp_params;
         | 
| 152 | 
            +
            };
         | 
| 153 | 
            +
             | 
| 154 | 
            +
            Polygon.prototype.remove = function () {
         | 
| 155 | 
            +
                this._map.removeNodeFromSvg(this.g);
         | 
| 156 | 
            +
            };
         | 
| 157 | 
            +
             | 
| 158 | 
            +
            Polygon.prototype.select = function () {
         | 
| 159 | 
            +
                utils.addClass(this.polygon, 'selected');
         | 
| 160 | 
            +
             | 
| 161 | 
            +
                return this;
         | 
| 162 | 
            +
            };
         | 
| 163 | 
            +
             | 
| 164 | 
            +
            Polygon.prototype.deselect = function () {
         | 
| 165 | 
            +
                utils.removeClass(this.polygon, 'selected');
         | 
| 166 | 
            +
             | 
| 167 | 
            +
                return this;
         | 
| 168 | 
            +
            };
         | 
| 169 | 
            +
             | 
| 170 | 
            +
            Polygon.createFromSaved = function (params, is_overlay, self) {
         | 
| 171 | 
            +
                //console.log("<Polygon.createFromSaved>");
         | 
| 172 | 
            +
                console.log("<Polygon.createFromSaved> is_overlay = " + is_overlay);
         | 
| 173 | 
            +
             | 
| 174 | 
            +
                var coords = params.coords,
         | 
| 175 | 
            +
                    area = new Polygon(coords[0], coords[1], is_overlay, self);
         | 
| 176 | 
            +
             | 
| 177 | 
            +
                for (var i = 2, c = coords.length; i < c; i += 2) {
         | 
| 178 | 
            +
                    area.addPoint(coords[i], coords[i + 1]);
         | 
| 179 | 
            +
                }
         | 
| 180 | 
            +
             | 
| 181 | 
            +
                area.polyline = area.polygon;
         | 
| 182 | 
            +
                area.polygon = document.createElementNS('http://www.w3.org/2000/svg', 'polygon');
         | 
| 183 | 
            +
                area.g.replaceChild(area.polygon, area.polyline);
         | 
| 184 | 
            +
                area.setCoords(area.params).deselect();
         | 
| 185 | 
            +
                delete(area.polyline);
         | 
| 186 | 
            +
             | 
| 187 | 
            +
                self.is_draw = false;
         | 
| 188 | 
            +
                self.drawing_poligon = null;
         | 
| 189 | 
            +
             | 
| 190 | 
            +
                return area;
         | 
| 191 | 
            +
             | 
| 192 | 
            +
            };
         | 
| @@ -0,0 +1,30 @@ | |
| 1 | 
            +
            function SavePreloader() {
         | 
| 2 | 
            +
             | 
| 3 | 
            +
                var _this = this;
         | 
| 4 | 
            +
                var $el;
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                _this.init = function () {
         | 
| 7 | 
            +
                    $el = $("#savePreloader");
         | 
| 8 | 
            +
                };
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                _this.show = function () {
         | 
| 11 | 
            +
                    $el.css("display","block");
         | 
| 12 | 
            +
                    $el.addClass('shown');
         | 
| 13 | 
            +
                };
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                _this.hide = function () {
         | 
| 16 | 
            +
                    $el.removeClass('shown');
         | 
| 17 | 
            +
                    setTimeout(function () {
         | 
| 18 | 
            +
                        $el.css("display","none");
         | 
| 19 | 
            +
                    },500);
         | 
| 20 | 
            +
                };
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                _this.toggle = function () {
         | 
| 23 | 
            +
                    if ($el.hasClass('shown')) {
         | 
| 24 | 
            +
                        _this.hide();
         | 
| 25 | 
            +
                    } else {
         | 
| 26 | 
            +
                        _this.show();
         | 
| 27 | 
            +
                    }
         | 
| 28 | 
            +
                };
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            }
         |