Map

1

5/26/2019 4:09:33 PM

Details

diff --git a/ModelData/BusinessModel/BusinessDataManager.cs b/ModelData/BusinessModel/BusinessDataManager.cs
index 8bd7991..3a117f8 100644
--- a/ModelData/BusinessModel/BusinessDataManager.cs
+++ b/ModelData/BusinessModel/BusinessDataManager.cs
@@ -6,6 +6,7 @@ using System.Threading.Tasks;
 
 using ModelData.BusinessModel.RDF;
 using ModelData.BusinessModel.MainEntities;
+using ModelData.BusinessModel.ExtraEntities;
 using ModelData.BusinessModel.UnitOfWork;
 
 namespace ModelData.BusinessModel
@@ -94,13 +95,41 @@ namespace ModelData.BusinessModel
         public (int min, int max) GetYears()
         {
             var query_result = RDFQuery.GetData(RDFQuery.QueryType.Years, new string[] { });
-            string u = query_result[0]["min"].ToString().Split('^')[0];
-            string k = query_result[0]["min"].ToString();
             return (
                     min: int.Parse(query_result[0]["min"].ToString().Split('^')[0]),
                     max: int.Parse(query_result[0]["max"].ToString().Split('^')[0])
                     );
-        }       
+        }
+
+        public Region[] AllRegions()
+        {
+            var query_result = RDFQuery.GetData(RDFQuery.QueryType.AllRegions, new string[] { });
+            List<Region> result = new List<Region>();
+            foreach (var elem in query_result)
+            {
+                result.Add(new Region()
+                {
+                    URL = elem["region"].ToString().Split('^')[0],
+                    Title = elem["regionName"].ToString().Split('^')[0]
+                });
+            }
+            return result.ToArray();
+        }
+
+        public SettlementType[] AllSettlementTypes()
+        {
+            var query_result = RDFQuery.GetData(RDFQuery.QueryType.AllSettlementTypes, new string[] { });
+            List<SettlementType> result = new List<SettlementType>();
+            foreach (var elem in query_result)
+            {
+                result.Add(new SettlementType()
+                    {
+                        URL = elem["settlementType"].ToString().Split('^')[0],
+                        Title = elem["typeName"].ToString().Split('^')[0]
+                    });
+            }                   
+            return result.ToArray();
+        }
 
         #endregion
 
diff --git a/ModelData/BusinessModel/ClassDiagram1.cd b/ModelData/BusinessModel/ClassDiagram1.cd
new file mode 100644
index 0000000..75b3259
--- /dev/null
+++ b/ModelData/BusinessModel/ClassDiagram1.cd
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ClassDiagram MajorVersion="1" MinorVersion="1">
+  <Class Name="ModelData.BusinessModel.BaseAndInterface.BaseOntologyEntity" Collapsed="true">
+    <Position X="7.25" Y="0.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>EAAAAAAAAAAAAEAAAAAAAAAAACAAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>BusinessModel\BaseAndInterface\BaseOntologyEntity.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="ModelData.BusinessModel.BusinessDataManager">
+    <Position X="6" Y="5" Width="2" />
+    <TypeIdentifier>
+      <HashCode>AAQEIABAAAAAAQBAAAIAAAAAAABAIAAAAAACACAAhAA=</HashCode>
+      <FileName>BusinessModel\BusinessDataManager.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="ModelData.BusinessModel.ExtraEntities.Founder">
+    <Position X="8.5" Y="1.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAACAAAAAAAQAACAAAAAAAAAAAAAACAA=</HashCode>
+      <FileName>BusinessModel\ExtraEntities\Founder.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="ModelData.BusinessModel.ExtraEntities.Region">
+    <Position X="13.75" Y="1.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAgAAAAAAAAA=</HashCode>
+      <FileName>BusinessModel\ExtraEntities\Region.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="ModelData.BusinessModel.ExtraEntities.SettlementType">
+    <Position X="0.5" Y="1.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAgAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQ=</HashCode>
+      <FileName>BusinessModel\ExtraEntities\SettlementType.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="ModelData.BusinessModel.MainEntities.EditedSettlement">
+    <Position X="2.75" Y="1.75" Width="2.75" />
+    <TypeIdentifier>
+      <HashCode>BAAAAAAAggAAAAAAABAAAAAAACCAAAAAEQACAAAAAAY=</HashCode>
+      <FileName>BusinessModel\MainEntities\EditedSettlement.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="ModelData.BusinessModel.MainEntities.MapPoint">
+    <Position X="6.25" Y="1.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAgAAAAAQoAAAAAAAAACAAAAAAAQAAAAAAAAA=</HashCode>
+      <FileName>BusinessModel\MainEntities\MapPoint.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Orientation="Bottom" Position="0.142" />
+  </Class>
+  <Class Name="ModelData.BusinessModel.MainEntities.Settlement">
+    <Position X="10.75" Y="1.75" Width="2.25" />
+    <TypeIdentifier>
+      <HashCode>BAAAACAAAAAABAAAABAAAAAAACAAAAAAAAACAADAAAA=</HashCode>
+      <FileName>BusinessModel\MainEntities\Settlement.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="ModelData.BusinessModel.RDF.Queries">
+    <Position X="3.75" Y="5.75" Width="2" />
+    <TypeIdentifier>
+      <HashCode>IAAEAAAAACAEAgAAAAAAMAAAAAAAIAAAAIAAACAAAAA=</HashCode>
+      <FileName>BusinessModel\RDF\Queries.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="ModelData.BusinessModel.RDF.RDFQuery" Collapsed="true">
+    <Position X="21.5" Y="2.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>BusinessModel\RDF\RDFQuery.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="ModelData.BusinessModel.Tools.Coordinate" Collapsed="true">
+    <Position X="21.5" Y="0.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAEAACAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>BusinessModel\Tools\Coordinate.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="ModelData.BusinessModel.Tools.InstantTime" Collapsed="true">
+    <Position X="21.5" Y="1.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAEAAAABAAAAAAEAAAAAAAAAAAAAAAAAAACAAAAAAA=</HashCode>
+      <FileName>BusinessModel\Tools\InstantTime.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="ModelData.BusinessModel.Tools.Period">
+    <Position X="15.5" Y="0.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAIAAAAAAAAAAAAEAAAAAAAAAAAAEAAAAAAAAAAAAAA=</HashCode>
+      <FileName>BusinessModel\Tools\Period.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="ModelData.BusinessModel.UnitOfWork.Context">
+    <Position X="15.75" Y="4.5" Width="2" />
+    <TypeIdentifier>
+      <HashCode>AAAAAQAAIAAAAAAAAIAAIACAAAAAAAAAACAAAAAAABA=</HashCode>
+      <FileName>BusinessModel\UnitOfWork\Context.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="ModelData.WebModel.Model">
+    <Position X="10.75" Y="6.75" Width="2" />
+    <TypeIdentifier>
+      <HashCode>AAAAIAAAAABAAAAAAAAAAAAACACEAAAAAAACAAAAAAA=</HashCode>
+      <FileName>WebModel\Model.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="ModelData.WebModel.WebDataManager" Collapsed="true">
+    <Position X="21.5" Y="3.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAEAAAQAAAAAAQBAAAAAAAAAAABAIAAAAAAKAAAAgAA=</HashCode>
+      <FileName>WebModel\WebDataManager.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="Tools.Config.ConfigManager">
+    <Position X="8.25" Y="5" Width="2.25" />
+    <TypeIdentifier />
+  </Class>
+  <Class Name="Tools.Extensions">
+    <Position X="13.5" Y="4" Width="1.75" />
+    <TypeIdentifier />
+  </Class>
+  <Class Name="Tools.IndexAttrib">
+    <Position X="17.25" Y="0.5" Width="1.5" />
+    <TypeIdentifier />
+  </Class>
+  <Class Name="Tools.SerializeService">
+    <Position X="13.25" Y="5.75" Width="2.25" />
+    <TypeIdentifier />
+  </Class>
+  <Class Name="Tools.Users.User">
+    <Position X="13.25" Y="7.5" Width="1.5" />
+    <TypeIdentifier />
+  </Class>
+  <Class Name="Tools.Users.UserContext">
+    <Position X="17.25" Y="2.5" Width="1.5" />
+    <TypeIdentifier />
+  </Class>
+  <Class Name="Tools.Word.DocXWrite">
+    <Position X="10.75" Y="5" Width="2.25" />
+    <TypeIdentifier />
+  </Class>
+  <Interface Name="ModelData.BusinessModel.BaseAndInterface.I_URLcs">
+    <Position X="15.5" Y="2.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAEAAAAAAAAAAACAAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>BusinessModel\BaseAndInterface\I_URLcs.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="Tools.I_MySerializable">
+    <Position X="15" Y="7.5" Width="1.5" />
+    <TypeIdentifier />
+  </Interface>
+  <Font Name="Segoe UI" Size="9" />
+</ClassDiagram>
\ No newline at end of file
diff --git a/ModelData/BusinessModel/RDF/Queries.cs b/ModelData/BusinessModel/RDF/Queries.cs
index f8ae1b8..dcea28e 100644
--- a/ModelData/BusinessModel/RDF/Queries.cs
+++ b/ModelData/BusinessModel/RDF/Queries.cs
@@ -299,7 +299,59 @@ WHERE
     BIND (IF (?minSetYear < ?minEditedYear, ?minSetYear, ?minEditedYear) as ?min)
 	BIND (IF (?maxSetYear > ?maxEditedYear, ?maxSetYear, ?maxEditedYear) as ?max)
 }
-";// @;
+";
+        }
+
+
+
+        /// \fn public static string AllSettlementTypes()
+        ///
+        /// \brief  Запрос всех возможных типов поселений за все периоды
+        /// \code       
+        /// SELECT ?settlementType ?typeName  WHERE
+        /// {
+        ///   ?settlementType a map:SettlementTypes; geonames:name ?typeName.
+        /// }                                                                                                                                                                                       
+        /// \endcode
+        /// \author Denis
+        /// \date   17.05.2019
+        ///
+        /// \returns    A string.
+
+        public static string AllSettlementTypes()
+        {
+            return GetAllPrefixes() +
+@"SELECT ?settlementType ?typeName  WHERE
+{
+    ?settlementType a map:SettlementTypes; geonames:name ?typeName.
+}
+";
+        }
+
+
+
+        /// \fn public static string AllRegions()
+        ///
+        /// \brief  Запрос всех возможных административных единиц (регионов) за все периоды
+        /// \code       
+        /// SELECT ?region ?regionName  WHERE
+        /// {
+        ///   ?region a map:Region; geonames:name ?regionName.
+        /// }                                                                                                                                                                               
+        /// \endcode
+        /// \author Denis
+        /// \date   17.05.2019
+        ///
+        /// \returns    A string.
+
+        public static string AllRegions()
+        {
+            return GetAllPrefixes() +
+@"SELECT ?region ?regionName  WHERE
+{
+    ?region a map:Region; geonames:name ?regionName.
+}
+";
         }
 
 
diff --git a/ModelData/BusinessModel/RDF/RDFQuery.cs b/ModelData/BusinessModel/RDF/RDFQuery.cs
index 42ea13e..9936117 100644
--- a/ModelData/BusinessModel/RDF/RDFQuery.cs
+++ b/ModelData/BusinessModel/RDF/RDFQuery.cs
@@ -39,7 +39,9 @@ namespace ModelData.BusinessModel.RDF
             Years,              ///< Запрос максимального и минимального годов. Параметры не требуются. Вернет одну строку.
             AllSettlements,     ///< Запрос всех поселений. Нужен для создания точек карты. Два параметра: требуемые года. Вернет большой список.
             SettlementInfo,     ///< Запрос все информации об одном поселении. Один параметр: URL поселения. Вернет список, где одна строка про поселение и все остальные строки про измененные поселения.
-            SubName             ///< Запрос всех имен поселений, часть названия которых совпадает с параметром. Один параметр: подстрока для поиска. Вернет большой список.
+            SubName,            ///< Запрос всех имен поселений, часть названия которых совпадает с параметром. Один параметр: подстрока для поиска. Вернет большой список.
+            AllSettlementTypes, ///< Запрос всех возможных типов поселений за все периоды. Вернет большой список.
+            AllRegions          ///< Запрос всех возможных административных единиц (регионов) за все периоды. Вернет большой список.
         };
 
         /// \fn public static List<SparqlResult> GetData(QueryType queryType, string[] args = null)
@@ -86,6 +88,18 @@ namespace ModelData.BusinessModel.RDF
                             exQuery = Queries.AllSettlementsName(args[0]);
                             endpointURI = Config.SPARQL_Query_Endpoint;
                         } break;
+                    case QueryType.AllSettlementTypes:
+                        {
+                            exQuery = Queries.AllSettlementTypes();
+                            endpointURI = Config.SPARQL_Query_Endpoint;
+                        }
+                        break;
+                    case QueryType.AllRegions:
+                        {
+                            exQuery = Queries.AllRegions();
+                            endpointURI = Config.SPARQL_Query_Endpoint;
+                        }
+                        break;
                     default: throw new Exception("Invalid argument: queryType = " + queryType.ToString());
                 }
             }
diff --git a/ModelData/ModelData.csproj b/ModelData/ModelData.csproj
index 731b441..7f3d64e 100644
--- a/ModelData/ModelData.csproj
+++ b/ModelData/ModelData.csproj
@@ -77,7 +77,7 @@
   </ItemGroup>
   <ItemGroup>
     <None Include="app.config" />
-    <None Include="BusinessModel\ClassDiagram.cd" />
+    <None Include="BusinessModel\ClassDiagram1.cd" />
     <None Include="packages.config" />
   </ItemGroup>
   <ItemGroup>
diff --git a/ModelData/WebModel/WebDataManager.cs b/ModelData/WebModel/WebDataManager.cs
index c10e633..c0fb68f 100644
--- a/ModelData/WebModel/WebDataManager.cs
+++ b/ModelData/WebModel/WebDataManager.cs
@@ -6,6 +6,7 @@ using System.Threading.Tasks;
 
 using ModelData.BusinessModel;
 using ModelData.BusinessModel.MainEntities;
+using ModelData.BusinessModel.ExtraEntities;
 
 namespace ModelData.WebModel
 {
@@ -104,6 +105,18 @@ namespace ModelData.WebModel
             return businessData.GetYears();
         }
 
+        public Region[] GetAllRegions()
+        {
+            BusinessDataManager businessData = BusinessDataManager.Get();
+            return businessData.AllRegions();
+        }
+
+        public SettlementType[] GetAllSettlementTypes()
+        {
+            BusinessDataManager businessData = BusinessDataManager.Get();
+            return businessData.AllSettlementTypes();
+        }
+
         #region Tools
 
         private void Init(int Count = 5)
diff --git a/Tools/Word/DocXWrite.cs b/Tools/Word/DocXWrite.cs
index a9b53e2..26e74d1 100644
--- a/Tools/Word/DocXWrite.cs
+++ b/Tools/Word/DocXWrite.cs
@@ -16,23 +16,48 @@ namespace Tools.Word
             return new System.IO.MemoryStream();
         }
 
-        public static void Test(List<I_MySerializable> list, out System.IO.Stream wr, string path = "")
+        //public static DocX GetDocX(List<I_MySerializable> list, out System.IO.MemoryStream wr)
+        //{
+        //    wr = new System.IO.MemoryStream();
+        //    DocX doc = DocX.Create(wr);
+        //    foreach (var elem in list)
+        //        Serialize(elem, doc);
+        //    return doc;           
+        //}
+
+        //public static DocX GetDocX(I_MySerializable elem, out System.IO.MemoryStream wr)
+        //{
+        //    wr = new System.IO.MemoryStream();
+        //    DocX doc = DocX.Create(wr);
+        //    Serialize(elem, doc);
+
+        //    return doc;
+        //}
+
+        public static void PrintDocX(IEnumerable<I_MySerializable> list, out System.IO.MemoryStream wr, string path = null)
         {
             wr = new System.IO.MemoryStream();
             DocX doc = DocX.Create(wr);
             foreach (var elem in list)
                 Serialize(elem, doc);
-            if (path != "")
-                doc.SaveAs(path);           
+
+            doc.Save();
+            wr.Position = 0;
+            if (path != null && path != "")
+                doc.SaveAs(path);
+            wr.Position = 0;
         }
 
-        public static void Test(I_MySerializable elem, out System.IO.Stream wr, string path = "")
+        public static void PrintDocX(I_MySerializable elem, out System.IO.MemoryStream wr, string path = null)
         {
             wr = new System.IO.MemoryStream();
             DocX doc = DocX.Create(wr);
             Serialize(elem, doc);
-            if (path != "")
+            doc.Save();
+            wr.Position = 0;
+            if (path != null && path != "")
                 doc.SaveAs(path);
+            wr.Position = 0;
         }
 
         private static void Serialize(I_MySerializable obj, DocX doc)
diff --git a/web-map/Content/Site.css b/web-map/Content/Site.css
index 0b7f1c2..28baf59 100644
--- a/web-map/Content/Site.css
+++ b/web-map/Content/Site.css
@@ -192,21 +192,6 @@ a.article, a.article:hover {
     padding: 0.2rem 0.2rem;
 }
 
-.yandexMapsFilterElement {
-    box-sizing: border-box !important;
-    overflow: hidden;
-    padding-right: 13px;
-    padding-left: 30px;
-    max-width: 250px;
-    width: 200px;
-    max-height: 250px;
-    text-overflow: ellipsis;
-    font-size: 13px;
-    line-height: 28px;
-    -webkit-user-select: none;
-    -moz-user-select: none;
-    -ms-user-select: none;
-    user-select: none;
-    position: relative;
-    border-bottom: 1px solid #eee;
+#sidebar-right-text .sidebar-right-text-element {
+    padding: 0.5rem 0.5rem;
 }
diff --git a/web-map/Controllers/MapController.cs b/web-map/Controllers/MapController.cs
index b398a78..d97cd34 100644
--- a/web-map/Controllers/MapController.cs
+++ b/web-map/Controllers/MapController.cs
@@ -4,6 +4,10 @@ using System.Linq;
 using System.Web;
 using System.Web.Mvc;
 
+using System.IO;
+
+using ModelData.WebModel;
+using Tools.Word;
 
 namespace web_map.Controllers
 {
@@ -13,6 +17,59 @@ namespace web_map.Controllers
         public ActionResult Map()
         {
             return View();
-        }        
+        }
+
+        public FileResult ExportInfo(string data, string type)
+        {
+            //WebDataManager webData = WebDataManager.Get();
+            var inputList = data.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries).ToList<string>();
+            var infoList = new List<ModelData.BusinessModel.MainEntities.Settlement>(inputList.Count);
+
+            WebDataManager webData = WebDataManager.Get();
+            foreach (var item in inputList)
+                infoList.Add(webData.GetSettlement(item));
+
+            DocXWrite.PrintDocX(infoList, out MemoryStream mr);
+
+            string file_name = "info.docx";
+
+            return File(mr, System.Net.Mime.MediaTypeNames.Application.Octet, file_name);
+        }
+
+        [HttpPost]
+        public JsonResult ImportForm(string formData, string type)
+        {
+            WebDataManager webData = WebDataManager.Get();
+
+            var inputArray = formData.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
+            Dictionary<string, string> form = new Dictionary<string, string>();
+            string key, value;
+            foreach (var elem in inputArray)
+            {
+                key = elem.Split('~')[0];
+                value = elem.Split('~')[1];
+                if (value == "null" || value == null)
+                    value = "";
+                form.Add(key, value);
+            }
+
+            return Json("Import success", JsonRequestBehavior.AllowGet);
+        }
+
+        [HttpGet]
+        public JsonResult GetAllOfType(string type)
+        {
+            WebDataManager webData = WebDataManager.Get();
+            if (type == "type")
+            {
+                return Json(webData.GetAllSettlementTypes(), JsonRequestBehavior.AllowGet);
+            }
+            else if (type == "region")
+            {
+                return Json(webData.GetAllRegions(), JsonRequestBehavior.AllowGet);
+            }
+            else
+                return Json(""/*webData.GetSettlementsNames(type)*/, JsonRequestBehavior.AllowGet);
+        }
     }
 }
\ No newline at end of file
diff --git a/web-map/Scripts/SiteScripts/AjaxQuery.js b/web-map/Scripts/SiteScripts/AjaxQuery.js
index d191d04..d6579cb 100644
--- a/web-map/Scripts/SiteScripts/AjaxQuery.js
+++ b/web-map/Scripts/SiteScripts/AjaxQuery.js
@@ -36,16 +36,8 @@ function GetAllPoints(YearMin, YearMax) {
             YearMax: YearMax
         },
         success: function (data) {
-            //  Заполнить массивы из полученного результата
-            //  Заполнить коллекцию геообъектами
-            //  
-            //  Затем: 
             //  Нужно ли делать выборку
             //                     |
-            //                     |
-            //                     |
-            //                     |
-            //                     |
             FillDataArrays(data, true);            
         },
 
@@ -56,6 +48,28 @@ function GetAllPoints(YearMin, YearMax) {
     });
 }
 
+function GetAllOfType(type) {
+    return $.ajax({
+        url: '/Map/GetAllOfType',
+        type: 'GET',
+        contentType: "application/json; charset=utf-8",
+        dataType: 'json',
+        cache: false,
+        //Параметр контроллеру
+        data: {
+            type: type
+        },
+        success: function (data) {
+        },
+
+        error: function (response) {
+            console.log(response.responseText);
+            alert('Ошибка. Не удалось получить данные от сервера');
+        }
+    });
+
+}
+
 //Получить все имена поселений, подходящие по маске subName
 function GetNames(subName, functionWhatNeedToDoWithInfo) {
     $.ajax({
@@ -111,6 +125,42 @@ function GetDate(load = false) {
     });
 }
 
+//  Функция получения файла экспорта
+function ExportData(type) {
+
+    //  Сериализация данных в строку
+    var collectionString = '';
+    Collections.Export.forEach(function (element) {
+        collectionString += '|' + element.url;
+    });
+    collectionString += '|';
+
+    console.log('/Map/ExportInfo?data=' + encodeURIComponent(collectionString) + '&type=' + type);
+    document.getElementById('my_iframe').src = '/Map/ExportInfo?data=' + encodeURIComponent(collectionString) + '&type=' + type;   
+}
+
+function ImportForm(formData, type) {
+    $.ajax({
+        url: '/Map/ImportForm',
+        type: 'POST',
+        // из-за этой строки была ошибка 500//contentType: "application/json; charset=utf-8",
+        dataType: 'json',
+        cache: false,
+        data: {
+            formData: formData,
+            type: type
+        },
+        success: function (data) {
+            console.log(data);
+        },
+
+        error: function (response) {
+            console.log(response.responseText);
+            alert('Ошибка. Не удалось получить данные от сервера');
+        }
+    });
+}
+
 
 
 //function apiConnect(apiKey) {
diff --git a/web-map/Scripts/SiteScripts/Events.js b/web-map/Scripts/SiteScripts/Events.js
index 713ea30..c719795 100644
--- a/web-map/Scripts/SiteScripts/Events.js
+++ b/web-map/Scripts/SiteScripts/Events.js
@@ -85,35 +85,11 @@ function SelectDataFromArrays() {
             }
         }
         afterFilters = typeFilters.intersect(regionFilters).sort('options.Population desc');
-    }
-    
-
-//filterTypes = all.search('options.Regions regExp "*|gorod|*"') 
-// .add(all.search('options.Regions regExp "*|selo|*"')) 
-// .add(all.search('options.Regions regExp "*|poselok|*"'))
-
-    //for (e in Collections.Filters.Type) {
-    //    if (Collections.Filters.Type[e])
-    //    {
-    //        for 
-    //    }
-    //        afterFilters = afterFilters.search('options.Name = "' + name + '"');
-    //}
-    //for (e in Collections.Filters.Region) {
-    //    Collections.Filters.Region[e] = true;
-    //}
+    } 
 
     var CollectionVisible = afterFilters.slice(0, Collections.VisibleCount).addToMap(Map);
     // Оставшиеся объекты будем удалять с карты.
     Collections.AllGeoObjects.remove(CollectionVisible).removeFromMap(Map).getLength();
-
-    //for (var i = 0; i < Collections.All.length && i < Collections.VisibleCount; i++) {
-    //    ResultDataArray.push(Collections.All[i]);
-    //}
-
-    //if (isNeedPlaceCollection)
-    //    PlaceFromCollection(geo_query);
-    //  return ResultDataArray;
 }
 
 
@@ -228,8 +204,8 @@ function exportSidebarButton() {
             $('#sidebar-right, #content').addClass('export');
         }
         //  был открыт экспорт, при повторном нажатии нужно скрыть панель
-        else
-            CloseRightPanel();
+        //else
+        //    CloseRightPanel();
     }
 }
 
@@ -247,8 +223,8 @@ function importSidebarButton() {
             $('#sidebar-right, #content').addClass('import');
         }
         //  был открыт импорт, при повторном нажатии нужно скрыть панель
-        else
-            CloseRightPanel();
+        //else
+        //    CloseRightPanel();
     }    
 }
 
@@ -340,3 +316,207 @@ function activeFilters() {
     Collections.isNeedFilters = true;
     SelectDataFromArrays();
 }
+
+function checkOriginImportForm() {
+    //  выставить значения по дефолту
+    //$('input').removeClass('is-valid');
+    $('input').removeClass('is-invalid');
+    $("#lat-error")[0].innerHTML = 'Неверное значение.';
+    $("#long-error")[0].innerHTML = 'Неверное значение.';
+    $("#hasBeginning-error")[0].innerHTML = 'Не верный год.';
+
+    var form_data = new Array();
+
+    form_data["url"] = $("input#import-url");
+    form_data["title"] = $("input#import-title");
+    form_data["lat"] = $("input#import-lat");
+    form_data["long"] = $("input#import-long");
+    form_data["founder"] = $("input#import-founder");
+    form_data["hasBeginning"] = $("input#import-hasBeginning");
+    form_data["legend"] = $("textarea#import-legend");
+
+    var valid = true;
+
+    //  регулярное выражение:
+    //  ^ - с начала строки
+    //  \d\d - две цифры
+    //  [.] - разделитель точка
+    //  \d+ - после разделителя 1 и более цифр
+    //  $ - окончание строки
+    //  гарантирует, что введенное значение является координатой
+    var coordValidate = /^\d\d[.]\d+$/;
+    var lat = form_data["lat"].val();
+    var long = form_data["long"].val();
+
+    if (!coordValidate.test(lat)) {
+        //  значение не соответствует шаблону
+        //  вывод ошибки
+        $('#import-lat, #content').addClass('is-invalid');
+        valid = false;
+    }
+    else if (Number(lat) < Collections.MapArea[0][0] || Number(lat) > Collections.MapArea[1][0]) {
+        //  значение не попадает в пределы карты
+        $("#lat-error")[0].innerHTML = 'Значение не попадает в пределы карты.';
+        valid = false;
+        $('#import-lat, #content').addClass('is-invalid');
+    }
+
+    if (!coordValidate.test(long)) {
+        //  значение не соответствует шаблону
+        //  вывод ошибки
+        $('#import-long, #content').addClass('is-invalid');
+        valid = false;
+    }
+    else if (Number(long) < Collections.MapArea[0][1] || Number(long) > Collections.MapArea[1][1]) {
+        //  значение не попадает в пределы карты
+        $("#long-error")[0].innerHTML = 'Значение не попадает в пределы карты.';
+        valid = false;
+        $('#import-long, #content').addClass('is-invalid');
+    }
+
+    var year = form_data["hasBeginning"].val();
+    if (year != '') {
+        var yearValidate = /^\d{1,4}$/;
+        if (!yearValidate.test(year)) {
+            //  значение не соответствует шаблону
+            //  вывод ошибки
+            $('#import-hasBeginning, #content').addClass('is-invalid');
+            valid = false;
+        }
+        else if (Number(year) > MaxYear) {
+            //  значение больше текущего года
+            $("#hasBeginning-error")[0].innerHTML = 'Значение больше текущего года';
+            valid = false;
+            $('#import-hasBeginning, #content').addClass('is-invalid');
+        }
+    }
+
+    //  если поля формы верны, составляем строку и возвращаем её для отправки на сервер
+    if (valid) {
+        var y = '';
+        for (key in form_data) {
+            //  если поле это url
+            //  ему нужна доп проверка
+            if (key == 'url') {
+                y += '|' + key + '~';
+                //  если НЕ установлен флаг "только чтение", т.е. пользователь ВВЕЛ СВОЙ url
+                if (!form_data[key][0].readOnly)
+                    y += form_data[key].val();
+                //  иначе url считается пустым и будет создан на сервере
+            }
+            else
+                y += '|' + key + '~' + form_data[key].val();
+        }
+        y += '|';
+        return y;        
+    }
+    //  если поля не верны, пользователь увидит ошибку, а вместо строки вернем null
+    else
+        return null;
+}
+
+function checkEditedImportForm() {
+    //  выставить значения по дефолту
+    //$('input').removeClass('is-valid');
+    $('input').removeClass('is-invalid');
+    $("#edited-hasBeginning-error")[0].innerHTML = 'Не верный год.';
+
+    var form_data = new Array();
+
+    form_data["url"] = $("input#import-edited-url");
+    form_data["beforeTitle"] = $("input#import-before-title");
+    form_data["beforeUrl"] = $("input#import-before-url");
+    form_data["hasBeginning"] = $("input#import-edited-hasBeginning");
+    form_data["source"] = $("input#import-edited-source");
+    form_data["title"] = $("input#import-edited-title");
+    form_data["populationAll"] = $("input#import-edited-populationAll");
+    form_data["populationFemale"] = $("input#import-edited-populationFemale");
+    form_data["populationMale"] = $("input#import-edited-populationMale");
+    form_data["region"] = $("#import-edited-region");
+    form_data["type"] = $("#import-edited-type"); 
+
+    //Вот так можно получить значение атрибута value, выбранной опции:
+    //console.log($("#test_228").val());
+    //А вот так можно получить текст выбранной опции:
+    //console.log($("#test_228 option:selected").text());
+
+    var valid = true;
+
+    
+
+    var year = form_data["hasBeginning"].val();
+    if (year != '') {
+        var yearValidate = /^\d{1,4}$/;
+        if (!yearValidate.test(year)) {
+            //  значение не соответствует шаблону
+            //  вывод ошибки
+            $('#import-edited-hasBeginning, #content').addClass('is-invalid');
+            valid = false;
+        }
+        else if (Number(year) > MaxYear) {
+            //  значение больще текущего года
+            $("#edited-hasBeginning-error")[0].innerHTML = 'Значение больше текущего года';
+            valid = false;
+            $('#import-edited-hasBeginning, #content').addClass('is-invalid');
+        }
+    }
+
+    var digitValidate = /^\d+$/;
+    var popAll = form_data["populationAll"].val();
+    var popMale = form_data["populationMale"].val();
+    var popFemale = form_data["populationFemale"].val();
+
+    if (popAll != '') {
+        if (!digitValidate.test(popAll)) {
+            //  значение не соответствует шаблону
+            //  вывод ошибки
+            $('#import-edited-populationAll, #content').addClass('is-invalid');
+            valid = false;
+        }
+    }
+
+    if (popMale != '') {
+        if (!digitValidate.test(popMale)) {
+            //  значение не соответствует шаблону
+            //  вывод ошибки
+            $('#import-edited-populationMale, #content').addClass('is-invalid');
+            valid = false;
+        }
+    }
+
+    if (popFemale != '') {
+        if (!digitValidate.test(popFemale)) {
+            //  значение не соответствует шаблону
+            //  вывод ошибки
+            $('#import-edited-populationFemale, #content').addClass('is-invalid');
+            valid = false;
+        }
+    }
+
+    //  если поля формы верны, составляем строку и возвращаем её для отправки на сервер
+    if (valid) {
+        var y = '';
+        for (key in form_data) {
+            y += '|' + key + '~' + form_data[key].val();
+        }
+        y += '|';
+        return y;
+    }
+    //  если поля не верны, пользователь увидит ошибку, а вместо строки вернем null
+    else
+        return null;
+}
+
+function importFormSubmit(contentType) {
+    var data = '';
+    if (contentType == 'origin-import') {
+        data = checkOriginImportForm();
+    }
+    else if (contentType == 'edited-import') {       
+        data = checkEditedImportForm();
+    }
+    if (data != null)
+        ImportForm(data, contentType);    
+}
+
+
diff --git a/web-map/Scripts/SiteScripts/Init.js b/web-map/Scripts/SiteScripts/Init.js
index 8d96cfb..0341071 100644
--- a/web-map/Scripts/SiteScripts/Init.js
+++ b/web-map/Scripts/SiteScripts/Init.js
@@ -16,7 +16,6 @@ var MinYear;
 var MaxYear;
 var CurrentMinYear;
 var CurrentMaxYear;
-//var clusterer;
 
 //  Функция загрузки Яндекс карты
 function YandexMapInit()
@@ -30,7 +29,10 @@ function YandexMapInit()
         },
         {
             // Ограничим область карты.
-            restrictMapArea: [[48.795, 41.484], [53.823, 51.856]]
+            restrictMapArea: Collections.MapArea
+            // !!! используется значение [[48.795, 41.484], [53.823, 51.856]]
+
+            //  это старые, уже не помню зачем их сохраняю
             //restrictMapArea: [[49.795, 42.484], [52.823, 50.856]]
         }
     );
@@ -41,20 +43,7 @@ function YandexMapInit()
     // Будем отслеживать зум карты при смене видимых границ (движение карты и смена zoom)
     Map.events.add('boundschange', function (event)
     {
-        // фильтрация поселений в принципе при движении по карте
-
-        //                 Выгрузить коллекцию на карту
-        //                     |
-        //                     |
         SelectDataFromArrays();
-
-        //  фильтрация поселений при зуммировании
-        //CurrentZoom = event.get('newZoom');       
-        //if (CurrentZoom != event.get('oldZoom'))
-        //{
-        //    //console.log(event.get('oldZoom') + " " + CurrentZoom);
-        //    SelectDataFromArrays(true, true);
-        //}
     });
 
     // Загрузим регионы.
@@ -90,36 +79,7 @@ function YandexMapInit()
             masks.forEach(function (mask) { background.geometry.insert(1, mask); });
             // Добавим многоугольник на карту.
             Map.geoObjects.add(background);
-        });    
-
-    // центрирование карты
-    //myMap.setCenter(coord, 13);
-
-    //Создание кластера
-    //clusterer = new ymaps.Clusterer({
-    //    /**
-    //     * Через кластеризатор можно указать только стили кластеров,
-    //     * стили для меток нужно назначать каждой метке отдельно.
-    //     * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/option.presetStorage.xml
-    //     */
-    //    preset: 'islands#invertedVioletClusterIcons',
-    //    /**
-    //     * Ставим true, если хотим кластеризовать только точки с одинаковыми координатами.
-    //     */
-    //    groupByCoordinates: false,
-    //    /**
-    //     * Опции кластеров указываем в кластеризаторе с префиксом "cluster".
-    //     * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/ClusterPlacemark.xml
-    //     */
-    //    clusterDisableClickZoom: true,
-    //    clusterHideIconOnBalloonOpen: false,
-    //    geoObjectHideIconOnBalloonOpen: false
-    //});
-    //clusterer.options.set({
-    //    gridSize: 500,
-    //    clusterDisableClickZoom: true
-    //});
-
+        });
 }
 
 //  Функция создания слайдера дат и обработчик поля ввода дат
@@ -177,7 +137,49 @@ function SliderInit() {
     $('#sidebar-right-export').bind('click', exportSidebarButton);
 
     // Кнопка открытия правой боковой панели для импорта
-    $('#sidebar-right-import').bind('click', importSidebarButton);
+    $('#sidebar-right-import').bind('click', function () {
+        //  вызов отрисовки формы создания нового поселения
+        printImportAddingForm();
+        //  вызов появления панели
+        importSidebarButton();
+    });
+
+    // Кнопка открытия правой боковой панели для импорта
+    $('#addEditInfo').bind('click', function () {
+        //  вызов отрисовки формы создания нового ИЗМЕНЕННОГО поселения
+        printImportEditingForm();
+        //  вызов появления панели
+        importSidebarButton();
+    });   
+    
+    // Кнопка экспорта в word
+    $('#export-to-word').bind('click', function () {
+        if (Collections.Export != null && Collections.Export.length > 0) {            
+            ExportData('word');
+        }
+            
+    });
+
+    // Кнопка экспорта в excel
+    $('#export-to-excel').bind('click', function () {
+        if (Collections.Export != null && Collections.Export.length > 0) {
+            ExportData('excel');
+        }
+    });   
+
+    //  Отправка формы импорта данных
+    $("#import-form").submit(function (e) {
+        e.preventDefault();
+        var content = '';
+        var form = $('#import-form, #content');
+        if (form.hasClass('edited-import')) {
+            content = 'edited-import';
+        }
+        else if (form.hasClass('origin-import')) {
+            content = 'origin-import';
+        }
+        importFormSubmit(content);
+    });
 }
 
 function AutoCompleteInit(data) {
@@ -196,7 +198,6 @@ function AutoCompleteInit(data) {
         minLength: 2,
         delay: 300,
         select: function(event, ui) {
-            //$('#sku').val(skus[ui.item.value]);
             OnFindNameUsing(ui.item.value)
         }
     });}
@@ -237,4 +238,9 @@ function CollectionsInit() {
     Collections.Filters.Type = new Object();
     Collections.Filters.Region = new Object();
     Collections.isNeedFilters = false;
+    Collections.MapArea = [[48.795, 41.484], [53.823, 51.856]];
+
+    //  Эти коллекции нужно обнулять, но т.к. нет внесения новых данных о них, то пусть будут статичными
+    Collections.AllSettlementTypes = new Array();
+    Collections.AllRegions = new Array();
 }
\ No newline at end of file
diff --git a/web-map/Scripts/SiteScripts/Output.js b/web-map/Scripts/SiteScripts/Output.js
index cccf7c3..04c1740 100644
--- a/web-map/Scripts/SiteScripts/Output.js
+++ b/web-map/Scripts/SiteScripts/Output.js
@@ -16,19 +16,12 @@ function PrintInfoAboutSettlement(info)
     Collections.CurrentSettlement.constInfo.Founder = info.Founder;
     Collections.CurrentSettlement.constInfo.hasBeginning = info.hasBeginning;
     Collections.CurrentSettlement.constInfo.Legend = info.Legend;
-    Collections.CurrentSettlement.constInfo.URL = info.URL;
 
     Collections.CurrentSettlement.editInfo = new Array();
 
     document.getElementById('settlement-title').innerHTML = info.Title;
     document.getElementById('settlement-url').innerHTML = info.URL;
 
-    //jumbotron
-
-    /// здесь сохранить в глобал
-    /// потом использовать при редактировании
-    /// присвоить id каждому элементу и по нему вытаскивать в форму редактирования
-    /// сделать 2 класса для осн инф и для редактирования
     var text = '<div class="sidebar-left-text-element">';
     text += makeButton(editButtonText, 'constInfo', 'editConstInfoButton');
     text += '<p>' + 'Координаты: ' + info.Coordinate.Lat + ' ' + info.Coordinate.Long + '</p>';
@@ -67,8 +60,8 @@ function PrintInfoAboutSettlement(info)
                 text += '<p>' + 'Название поселения: ' + element.Title + '</p>';
 
             text += '<p>' + 'Год: ' + element.hasBeginning.Year + '</p>';
-            if (element.Source.includes("www") || element.Source.includes("http"))
-                text += '<p>Источник: <a href="' + element.Source + '">ссылка</a></p>';
+            if (element.Source.includes("www.") || element.Source.includes("http"))
+                text += '<p>Источник: <a href="' + element.Source + '" target="_blank">ссылка</a></p>';
             else 
                 text += '<p>Источник: ' + element.Source + '</p>';
 
@@ -95,30 +88,148 @@ function printExportCollection() {
 }
 
 function printEditImportForm(what, id) {
-    var text = '';
+    var element;
     if (what == 'constInfo') {
-        console.log(Collections.CurrentSettlement[what]);
-    }       
+        element = Collections.CurrentSettlement[what];  
+        //  вызов создания формы
+        printImportAddingForm();
+        //  после создания формы, записываем готовые значения в нужные поля
+
+        $("input#import-url").val(element.URL);
+        $("input#import-title").val(element.Title);
+        $("input#import-lat").val(element.Lat);
+        $("input#import-long").val(element.Long);
+        $("input#import-founder").val(element.Founder);
+        $("input#import-hasBeginning").val(element.hasBeginning);
+        $("textarea#import-legend").val(element.Legend);
+
+        importSidebarButton();
+    }
     else if (what == 'editInfo') {
-        var i = id.split('_')[1];
-        console.log(Collections.CurrentSettlement.editInfo[i]);
+        importSidebarButton();
+        element = Collections.CurrentSettlement.editInfo[id.split('_')[1]];
+        //  вызов создания формы
+        printImportEditingForm();
+        //  после создания формы, записываем готовые значения в нужные поля
+
+        $("input#import-edited-url").val(element.URL);
+        $("input#import-edited-hasBeginning").val(element.hasBeginning.Year);
+        $("input#import-edited-source").val(element.Source);
+
+        if (element.PopulationAll != null)
+            $("input#import-edited-populationAll").val(element.PopulationAll);
+        if (element.PopulationFemales != null)
+            $("input#import-edited-populationFemale").val(element.PopulationFemales);
+        if (element.PopulationMales != null)
+            $("input#import-edited-populationMale").val(element.PopulationMales);
+        if (element.Region != null) {
+            //  костыль из-за того, что пытаемся выделить элемент списка, хотя список еще не был наполнен из-за асинхронности работы
+            //  ставлю задержку, чтобы при первой загрузке списка выделение произошло чуть позже. при повторных нажатиях список уже загружен и работает мгновенно
+            if (Collections.AllRegions.length == 0)
+                setTimeout(function () { $("#import-edited-region option[value='" + element.Region.URL + "']").attr("selected", "selected"); }, 1000);
+            $("#import-edited-region option[value='" + element.Region.URL + "']").attr("selected", "selected");
+        }
+        if (element.Type != null) {
+            if (Collections.AllSettlementTypes.length == 0)
+                setTimeout(function () { $("#import-edited-type option[value='" + element.Type.URL + "']").attr("selected", "selected"); }, 1000);
+            $("#import-edited-type option[value='" + element.Type.URL + "']").attr("selected", "selected");
+        }
+        if (element.Title != null)
+            $("input#import-edited-title").val(element.Title);       
+    }
+    else { console.log('printEditImportForm(' + what + ',' + id + ')'); return; }
+    //importSidebarButton();
+}
+
+function printImportAddingForm() {
+    //  здесь создание формы для добавления нового поселения
+    //  вызывается при нажатии на кнопку "редактировать" у осн инф или при нажатии на кнопку на веб-странице (Импорт)
+    
+    var text = '';
+    text += '<div class="form-group"><div class="form-row"><div class="col"><label for="import-url">Url</label></div><div class="col"><div class="form-check"><input class="form-check-input position-static" type="checkbox" id="checkBoxEditUrl" value="">';
+    text += '</div></div></div><input type="text" class="form-control" id="import-url" placeholder="Идентификатор поселения" readonly value=""><div class="invalid-feedback">Ошибка в наименовании URL поселения.</div></div>';
+    text += '<div class="form-group"><label for="import-title">Название поселения</label><input type="text" class="form-control" id="import-title" placeholder="Отображается на карте" required value=""><div class="invalid-feedback">';
+    text += 'Ошибка в названии поселения.</div></div><div class="form-row"><div class="col"><label for="import-lat">Широта</label><input type="text" class="form-control" id="import-lat" placeholder="51.000000" required value="">';
+    text += '<div id="lat-error" class="invalid-feedback">Неверное значение.</div></div><div class="col"><label for="import-long">Долгота</label><input type="text" class="form-control" id="import-long" placeholder="45.000000" required value="">';
+    text += '<div id="long-error" class="invalid-feedback">Неверное значение.</div></div></div><div class="form-group mt-3"><label for="import-founder">Основатель поселения</label><input type="text" class="form-control" id="import-founder" placeholder="Имя или URL">';
+    text += '</div><div class="form-group"><label for="import-hasBeginning">Дата основания</label><div class="input-group"><input type="text" class="form-control" id="import-hasBeginning" placeholder="Год основания"><div class="input-group-append"><span class="input-group-text">н. э.</span></div>';
+    text += '<div id="hasBeginning-error" class="invalid-feedback">Не верный год.</div></div></div><div class="form-group"><label for="exampleFormControlTextarea1">История основания</label><textarea class="form-control" id="import-legend" rows="2"></textarea></div>';
+
+    //  т.к. форма общая и submit тоже, нужно знать, какой тип поселений изменяется
+    $('#import-form, #content').addClass('origin-import');
+    $('#import-form, #content').removeClass('edited-import');
+
+    //  записать html
+    $("#import-form")[0].innerHTML = text;
+
+    // чек-бокс выделения url-поля
+    $('#checkBoxEditUrl').change(function () {
+        $('#import-url').prop('required', ($(this)[0].checked));
+        $('#import-url')[0].readOnly = !($(this)[0].checked);
+    });    
+}
+
+function printImportEditingForm() {
+    //  здесь создание формы для добавления нового ИЗМЕНЕННОГО поселения
+    //  вызывается при нажатии на кнопку "редактировать" у измененной инф или при нажатии на кнопку на левой бок панели для добавления новой информации      
+
+    var text = '';
+    text += '<input type="text" class="form-control" id="import-edited-url" required="" hidden value="default"><div class="form-group"><label for="import-before-url">Основное поселение</label><input type="text" class="form-control" id="import-before-title"';
+    text += ' placeholder="Название поселения" readonly="" value=""><input type="text" class="form-control" id="import-before-url" placeholder="Идентификатор поселения" hidden required="" value=""></div><div class="form-group">';
+    text += '<label for="import-edited-hasBeginning">Дата сведений</label><div class="input-group"><input type="text" class="form-control" id="import-edited-hasBeginning" placeholder="Год относящейся информации" required=""><div class="input-group-append">';
+    text += '<span class="input-group-text">н. э.</span></div><div id="edited-hasBeginning-error" class="invalid-feedback">Не верный год.</div></div></div><div class="form-group"><label for="import-edited-source">Источник сведений</label>';
+    text += '<input type="text" class="form-control" id="import-edited-source" placeholder="URL или другой идентификатор" value="" required=""><div class="invalid-feedback">Ошибка в источнике сведений.</div></div><div class="form-group">';
+    text += '<label for="import-edited-title">Название поселения</label><input type="text" class="form-control" id="import-edited-title" placeholder="Дополнительное название" value=""><div class="invalid-feedback">Ошибка в названии поселения.</div></div>';
+    text += '<div class="form-group"><label for="import-edited-type">Тип поселения</label><select id="import-edited-type" class="form-control form-control-sm" size="3"></select><button id="btn-type-off" type="button" class="mt-2 btn btn-outline-light';
+    text += ' btn-sm">Снять выделение</button></div><div class="form-group"><label for="import-edited-region">В составе административной единицы</label><select id="import-edited-region" class="form-control form-control-sm" size="3"></select><button';
+    text += ' id="btn-region-off" type="button" class="mt-2 btn btn-outline-light btn-sm">Снять выделение</button></div><div class="form-group"><label for="import-edited-populationAll">Общее количество населения</label><input type="text" class="form-control" ';
+    text += 'id="import-edited-populationAll" placeholder="0" value=""><div class="invalid-feedback">Неверное число.</div></div><div class="form-group"><label for="import-edited-populationFemale">Количество женского населения</label><input type="text" ';
+    text += 'class="form-control" id="import-edited-populationFemale" placeholder="0" value=""><div class="invalid-feedback">Неверное число.</div></div><div class="form-group"><label for="import-edited-populationMale">Количество мужского населения</label>';
+    text += '<input type="text" class="form-control" id="import-edited-populationMale" placeholder="0" value=""><div class="invalid-feedback">Неверное число.</div></div>';
+
+    //  т.к. форма общая и submit тоже, нужно знать, какой тип поселений изменяется
+    $('#import-form, #content').addClass('edited-import');
+    $('#import-form, #content').removeClass('origin-import');
+
+    $("#import-form")[0].innerHTML = text;  
+    $("#import-before-url").val(Collections.CurrentSettlement.constInfo.URL);
+    $("#import-before-title").val(Collections.CurrentSettlement.constInfo.Title);
+
+    $('#btn-type-off').click(function () {
+        $('#import-edited-type option').prop('selected', false);
+    });
+
+    $('#btn-region-off').click(function () {
+        $('#import-edited-region option').prop('selected', false);
+    });  
+
+    function loadSelect(from, what) {
+        var text = '';
+        from.forEach(function (e) {
+            text += '<option value="' + e.URL + '">' + e.Title + '</option>';
+        });
+        $('#' + what)[0].innerHTML = text;
     }
 
+    //  нужно выполнить загрузку ВСЕХ тиов поселений за все периоды и ВСЕХ регионов
+    if (Collections.AllSettlementTypes.length == 0) {
+        $.when(GetAllOfType('type')).done(function (data) {
+            Collections.AllSettlementTypes = data;   
+            loadSelect(Collections.AllSettlementTypes, 'import-edited-type');
+        });
+    }
+    else {
+        loadSelect(Collections.AllSettlementTypes, 'import-edited-type');
+    }
+
+    if (Collections.AllRegions.length == 0) {
+        $.when(GetAllOfType('region')).done(function (data) {
+            Collections.AllRegions = data;
+            loadSelect(Collections.AllRegions, 'import-edited-region');
+        });
+    }
+    else {
+        loadSelect(Collections.AllRegions, 'import-edited-region');
+    }
 }
 
-//  Функция выгружает все гео-объекты из данной коллекции на карту
-function PlaceFromCollection() {
-    CollectionVisible.addToMap(Map);
-    //Map.geoObjects.add(CollectionVisible);
-
-    //var arr = [];
-    //var i = 0;
-    //var iterator = CollectionVisible.getIterator(),
-    //    object;
-    //while ((object = iterator.getNext()) != iterator.STOP_ITERATION) {
-    //    arr[i] = object;
-    //    i++;
-    //}
-    //clusterer.add(arr);
-    //Map.geoObjects.add(clusterer);
-}
\ No newline at end of file
diff --git a/web-map/Views/Map/Map.cshtml b/web-map/Views/Map/Map.cshtml
index 7e1bfe7..fb0ac19 100644
--- a/web-map/Views/Map/Map.cshtml
+++ b/web-map/Views/Map/Map.cshtml
@@ -30,13 +30,74 @@
                 <button id="sidebar-right-close" class="btn btn-secondary" type="button">Скрыть<br>панель</button>
                 <button hidden id="export-to-word" class="btn btn-secondary" type="button">Экспорт<br>в Word</button>
                 <button hidden id="export-to-excel" class="btn btn-secondary" type="button">Экспорт<br>в Excel</button>
-                <button hidden id="import-button" class="btn btn-secondary" type="button">Отправить<br>данные</button>
+                <button hidden id="import-button" class="btn btn-secondary" type="submit" form="import-form">Отправить<br>данные</button>
             </div>
         </div>
         <div id="sidebar-right-text" class="sidebar-right-text">
             <div hidden id="sidebar-right-text-export"></div>
             <div hidden id="sidebar-right-text-import">
-                <p>тут импорт</p>
+                <form id="import-form" class="sidebar-right-text-element">
+                    <!--начало формы-->
+                    <div class="form-group">
+                        <label for="import-before-url">Основное поселение</label>
+                        <input type="text" class="form-control" id="import-before-url" placeholder="Идентификатор поселения" required="" readonly="" value="">
+                    </div>
+                    <div class="form-group">
+                        <label for="import-edited-hasBeginning">Дата сведений</label>
+                        <div class="input-group">
+                            <input type="text" class="form-control" id="import-edited-hasBeginning" placeholder="Год относящейся информации" required="">
+                            <div class="input-group-append">
+                                <span class="input-group-text">н. э.</span>
+                            </div>
+                            <div id="edited-hasBeginning-error" class="invalid-feedback">Не верный год.</div>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label for="import-edited-source">Источник сведений</label>
+                        <input type="text" class="form-control" id="import-edited-source" placeholder="URL или другой идентификатор" value="" required="">
+                        <div class="invalid-feedback">Ошибка в источнике сведений.</div>
+                    </div>
+                    <!--необязательные поля-->
+                    <div class="form-group">
+                        <label for="import-edited-title">Название поселения</label>
+                        <input type="text" class="form-control" id="import-edited-title" placeholder="Дополнительное название" value="">
+                        <div class="invalid-feedback">Ошибка в названии поселения.</div>
+                    </div>
+                    <div class="form-group">
+                        <label for="import-edited-type">Тип поселения</label>                       
+                        <select id="import-edited-type" class="form-control form-control-sm" size="3">
+                            <option value="url_t_1">село</option>
+                            <option value="url_t_2">город</option>
+                            <option value="url_t_3">станция</option>
+                            <option value="url_t_1">разъезд</option>
+                        </select>
+                    </div>
+                    <div class="form-group">
+                        <label for="import-edited-region">В составе административной единицы</label>
+                        <select id="import-edited-region" class="form-control form-control-sm" size="3">
+                            <option value="url_r_1">саратовский регион</option>
+                            <option value="url_r_2">энгельсский регион</option>
+                            <option value="url_r_3">ершовский регион</option>
+                            <option value="url_r_1">аткарский регион</option>
+                        </select>
+                    </div>
+                    <div class="form-group">
+                        <label for="import-edited-populationAll">Общее количество населения</label>
+                        <input type="text" class="form-control" id="import-edited-populationAll" placeholder="0" value="">
+                        <div class="invalid-feedback">Неверное число.</div>
+                    </div>
+                    <div class="form-group">
+                        <label for="import-edited-populationFemale">Количество женского населения</label>
+                        <input type="text" class="form-control" id="import-edited-populationFemale" placeholder="0" value="">
+                        <div class="invalid-feedback">Неверное число.</div>
+                    </div>
+                    <div class="form-group">
+                        <label for="import-edited-populationMale">Количество мужского населения</label>
+                        <input type="text" class="form-control" id="import-edited-populationMale" placeholder="0" value="">
+                        <div class="invalid-feedback">Неверное число.</div>
+                    </div>
+                    <!--конец формы-->
+                </form>
             </div>
         </div>
     </nav>
@@ -73,10 +134,10 @@
 <div id="map" style="width: 100%; height: 1000px; padding-left: 0px; "></div>
 
 @*<p>
-    <a class="btn btn-primary" data-toggle="collapse" href="#multiCollapseExample1" role="button" aria-expanded="false" aria-controls="multiCollapseExample1">Переключить 1-ый элемент</a>
-    <button class="btn btn-primary" type="button" data-toggle="collapse" data-target="#multiCollapseExample2" aria-expanded="false" aria-controls="multiCollapseExample2">Переключить 2-ой элемент</button>
-    <button class="btn btn-primary" type="button" data-toggle="collapse" data-target=".multi-collapse" aria-expanded="false" aria-controls="multiCollapseExample1 multiCollapseExample2">Переключить оба элемента</button>
-</p>*@
+        <a class="btn btn-primary" data-toggle="collapse" href="#multiCollapseExample1" role="button" aria-expanded="false" aria-controls="multiCollapseExample1">Переключить 1-ый элемент</a>
+        <button class="btn btn-primary" type="button" data-toggle="collapse" data-target="#multiCollapseExample2" aria-expanded="false" aria-controls="multiCollapseExample2">Переключить 2-ой элемент</button>
+        <button class="btn btn-primary" type="button" data-toggle="collapse" data-target=".multi-collapse" aria-expanded="false" aria-controls="multiCollapseExample1 multiCollapseExample2">Переключить оба элемента</button>
+    </p>*@
 
 <div class="container mt-4">
     <div class="row">
@@ -99,18 +160,14 @@
     <div class="col-3">
         <div class="collapse multi-collapse" id="multiCollapseExample1">
             <div class="card border-light" style="max-height: 300px; overflow-y: auto;">
-                <ul class="list-group list-group-flush" id="filterGroupTypes">
-                    
-                </ul>
+                <ul class="list-group list-group-flush" id="filterGroupTypes"></ul>
             </div>
         </div>
     </div>
     <div class="col">
         <div class="collapse multi-collapse" id="multiCollapseExample2">
             <div class="card border-light" style="max-height: 300px; overflow-y: auto; overflow-x: auto">
-                <ul class="list-group bg-transparent list-group-flush" id="filterGroupRegions">
-                    
-                </ul>
+                <ul class="list-group bg-transparent list-group-flush" id="filterGroupRegions"></ul>
             </div>
         </div>
     </div>
@@ -127,6 +184,9 @@
     </script>
 }
 
+<!--этот компонент позволяет скачивать файлы (функция экспорта в word, excel)-->
+<iframe id="my_iframe" style="display:none;"></iframe>
+
 <script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU&amp;apikey=0ea4f7d6-01f0-471d-b717-ada9d94faa49&lang=ru_RU" type="text/javascript"></script>
 @section Scripts {@Scripts.Render("~/Scripts/SiteScripts/AjaxQuery.js",
 "~/Scripts/SiteScripts/Events.js",
diff --git a/web-map/Views/Shared/_Layout.cshtml b/web-map/Views/Shared/_Layout.cshtml
index a1afbee..79ae6d8 100644
--- a/web-map/Views/Shared/_Layout.cshtml
+++ b/web-map/Views/Shared/_Layout.cshtml
@@ -26,7 +26,7 @@
                         <a class="nav-link" href="/Home/FAQ">Инструкция</a>
                     </li>
                     <li class="nav-item dropdown">
-                        <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown1" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Аккаунт</a>
+                        <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown1" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Модерация</a>
                         <div class="dropdown-menu" aria-labelledby="navbarDropdown1">
 
                             @if ((bool)ViewBag.isAuth)
@@ -40,6 +40,9 @@
                                 <form class="px-3 py-3" action="/Account/Login" method="post">
                                     @Html.AntiForgeryToken()
                                     @Html.ValidationSummary(true)
+                                    <small class="form-text">
+                                        Авторизация необходима для изменения данных о поселениях.
+                                    </small>
                                     <div class="form-group">
                                         <label for="Login"><b>Login</b></label>
                                         <input type="text" class="form-control" id="Login" name="Login" placeholder="Ваш логин" value="">
@@ -49,6 +52,9 @@
                                         <input type="password" class="form-control" id="Password" name="Password" placeholder="Ваш пароль" value="">
                                     </div>
                                     <button type="submit" class="btn btn-secondary">Вход</button>
+                                    <small class="form-text">
+                                        Для получения доступа обратитесь к <span><a href="mailto:salin.dv@protonmail.com" target="_blank">ответственному лицу</a></span>.
+                                    </small>
                                 </form>
                             }
                         </div>
diff --git a/web-map/web-map.csproj b/web-map/web-map.csproj
index b986cad..0091248 100644
--- a/web-map/web-map.csproj
+++ b/web-map/web-map.csproj
@@ -180,6 +180,7 @@
     <Content Include="Content\bootstrap-reboot.min.css" />
     <Content Include="Content\bootstrap.css" />
     <Content Include="Content\bootstrap.min.css" />
+    <Content Include="Content\icon.png" />
     <Content Include="Content\jQRangeSlider-iThing.css" />
     <Content Include="Content\jquery-ui\jquery-ui.css" />
     <Content Include="Content\jquery-ui\jquery-ui.min.css" />