From 630ddee84173f9194d54f026c2a52bc7d61905ec Mon Sep 17 00:00:00 2001 From: Paul Schneider Date: Sun, 8 Feb 2015 01:01:08 +0100 Subject: [PATCH] * styles.json: * map-load.gif: * mapstyle.css: * fit-bounds.png: * mapstyle-ie.css: * jquery.googlemaps.js: * pin-pink.png: * mapstyle.min.css: * pin-green.png: * pin-azure.png: * flag-azure.png: * flag-green.png: * needle-pink.png: * jquery.googlemaps.min.js: * current-location.png: * niddle-green.png: * popup-template-marker.html: * popup-template-circle.html: * popup-template-polygon.html: * popup-template-polyline.html: * popup-template-rectangle.html: GoogleMaps related add * AccountController.cs: Fixes the conflict between external and custom avatar * BasketController.cs: (Revert to revision 93c18633b98b66feb90f6883e2d05a6aa1334134) * BlogsController.cs: Removes unused statment * style.css: * UserPost.aspx: * UserPosts.aspx: an Avatar * Web.csproj: Google Maps references and resources * packages.config: Adds GoogleMapsHelpers, JQuery.GoogleMaps and MVC.GoogleMaps references * NpgsqlWorkflow.csproj: The project now references Newtonsoft.Json * NpgsqlContentProvider.cs: Saves the command parameters --- WorkFlowProvider/NpgsqlContentProvider.cs | 5 +- WorkFlowProvider/NpgsqlWorkflow.csproj | 4 + web/Controllers/AccountController.cs | 5 +- web/Controllers/BasketController.cs | 13 +- web/Controllers/BlogsController.cs | 5 +- web/Scripts/css/mapstyle-ie.css | 3 + web/Scripts/css/mapstyle.css | 207 +++ web/Scripts/css/mapstyle.min.css | 1 + web/Scripts/html/popup-template-circle.html | 40 + web/Scripts/html/popup-template-marker.html | 32 + web/Scripts/html/popup-template-polygon.html | 32 + web/Scripts/html/popup-template-polyline.html | 24 + .../html/popup-template-rectangle.html | 31 + web/Scripts/img/current-location.png | Bin 0 -> 430 bytes web/Scripts/img/fit-bounds.png | Bin 0 -> 352 bytes web/Scripts/img/map-load.gif | Bin 0 -> 20488 bytes web/Scripts/img/pin/flag-azure.png | Bin 0 -> 824 bytes web/Scripts/img/pin/flag-green.png | Bin 0 -> 836 bytes web/Scripts/img/pin/needle-pink.png | Bin 0 -> 1025 bytes web/Scripts/img/pin/niddle-green.png | Bin 0 -> 1026 bytes web/Scripts/img/pin/pin-azure.png | Bin 0 -> 1563 bytes web/Scripts/img/pin/pin-green.png | Bin 0 -> 1561 bytes web/Scripts/img/pin/pin-pink.png | Bin 0 -> 1561 bytes web/Scripts/jquery.googlemaps.js | 1167 +++++++++++++++++ web/Scripts/jquery.googlemaps.min.js | 1 + web/Scripts/styles.json | 1 + web/Theme/style.css | 27 +- web/Views/Blogs/UserPost.aspx | 2 +- web/Views/Blogs/UserPosts.aspx | 2 +- web/Web.csproj | 30 +- web/packages.config | 3 + 31 files changed, 1602 insertions(+), 33 deletions(-) create mode 100644 web/Scripts/css/mapstyle-ie.css create mode 100644 web/Scripts/css/mapstyle.css create mode 100644 web/Scripts/css/mapstyle.min.css create mode 100644 web/Scripts/html/popup-template-circle.html create mode 100644 web/Scripts/html/popup-template-marker.html create mode 100644 web/Scripts/html/popup-template-polygon.html create mode 100644 web/Scripts/html/popup-template-polyline.html create mode 100644 web/Scripts/html/popup-template-rectangle.html create mode 100644 web/Scripts/img/current-location.png create mode 100644 web/Scripts/img/fit-bounds.png create mode 100644 web/Scripts/img/map-load.gif create mode 100644 web/Scripts/img/pin/flag-azure.png create mode 100644 web/Scripts/img/pin/flag-green.png create mode 100644 web/Scripts/img/pin/needle-pink.png create mode 100644 web/Scripts/img/pin/niddle-green.png create mode 100644 web/Scripts/img/pin/pin-azure.png create mode 100644 web/Scripts/img/pin/pin-green.png create mode 100644 web/Scripts/img/pin/pin-pink.png create mode 100644 web/Scripts/jquery.googlemaps.js create mode 100644 web/Scripts/jquery.googlemaps.min.js create mode 100644 web/Scripts/styles.json diff --git a/WorkFlowProvider/NpgsqlContentProvider.cs b/WorkFlowProvider/NpgsqlContentProvider.cs index 789b9cf1..c2fb3f0f 100644 --- a/WorkFlowProvider/NpgsqlContentProvider.cs +++ b/WorkFlowProvider/NpgsqlContentProvider.cs @@ -4,10 +4,10 @@ using NpgsqlTypes; using System.Configuration; using System.Collections.Specialized; using Yavsc.Model.WorkFlow; -using System.Web.Mvc; using System.Configuration.Provider; using System.Collections.Generic; using Yavsc.Model.FrontOffice; +using Newtonsoft.Json; namespace WorkFlowProvider { @@ -19,9 +19,10 @@ namespace WorkFlowProvider using (NpgsqlConnection cnx = CreateConnection ()) { using (NpgsqlCommand cmd = cnx.CreateCommand ()) { cmd.CommandText = - "insert into commandes (prdref,creation) values (@pref,@creat) returning id"; + "insert into commandes (prdref,creation,params) values (@pref,@creat,@prs) returning id"; cmd.Parameters.Add ("@pref", com.ProdRef); cmd.Parameters.Add ("@creat", com.CreationDate); + cmd.Parameters.Add ("@prs", JsonConvert.SerializeObject(com.Parameters)); cnx.Open (); com.Id = id = (long)cmd.ExecuteScalar (); } diff --git a/WorkFlowProvider/NpgsqlWorkflow.csproj b/WorkFlowProvider/NpgsqlWorkflow.csproj index 7b7f6eaf..e6f2c27e 100644 --- a/WorkFlowProvider/NpgsqlWorkflow.csproj +++ b/WorkFlowProvider/NpgsqlWorkflow.csproj @@ -36,6 +36,10 @@ + + ..\..\..\..\..\usr\lib\mono\4.5\System.Net.Http.Formatting.dll + False + diff --git a/web/Controllers/AccountController.cs b/web/Controllers/AccountController.cs index 70b0ae3f..7a8ab175 100644 --- a/web/Controllers/AccountController.cs +++ b/web/Controllers/AccountController.cs @@ -271,6 +271,7 @@ namespace Yavsc.Controllers /// Avatar file. [Authorize] [HttpPost] + // ASSERT("Membership.GetUser ().UserName is made of simple characters, no slash nor backslash" public ActionResult Profile (Profile model, HttpPostedFileBase AvatarFile) { string username = Membership.GetUser ().UserName; @@ -282,9 +283,7 @@ namespace Yavsc.Controllers string avdir = Server.MapPath (AvatarDir); string avpath = Path.Combine (avdir, username + ".png"); AvatarFile.SaveAs (avpath); - model.avatar = - Path.Combine(AvatarDir.Substring(1),username)+".png"; - + model.avatar = Request.Url.Scheme+ "://"+ Request.Url.Authority + AvatarDir.Substring (1)+ "/" + username + ".png"; } else ModelState.AddModelError ("Avatar", string.Format ("Image type {0} is not supported (suported formats : {1})", diff --git a/web/Controllers/BasketController.cs b/web/Controllers/BasketController.cs index 53a5c1a6..be5050ad 100644 --- a/web/Controllers/BasketController.cs +++ b/web/Controllers/BasketController.cs @@ -26,6 +26,7 @@ namespace Yavsc.ApiControllers base.Initialize (controllerContext); wfmgr = new WorkFlowManager (); } + /// /// Validates the order. /// @@ -52,17 +53,5 @@ namespace Yavsc.ApiControllers //return WFManager.Write(estid << from the basket, desc, ucost, count, productid); throw new NotImplementedException (); } - - /// - /// Yours the estimates. - /// - /// The estimates. - [HttpGet] - [Authorize] - public Estimate[] YourEstimates() - { - return wfmgr.GetEstimates ( - Membership.GetUser().UserName); - } } } \ No newline at end of file diff --git a/web/Controllers/BlogsController.cs b/web/Controllers/BlogsController.cs index 415838bc..db7c3e17 100644 --- a/web/Controllers/BlogsController.cs +++ b/web/Controllers/BlogsController.cs @@ -155,7 +155,7 @@ namespace Yavsc.Controllers return View ("TitleNotFound"); ViewData ["BlogUserProfile"] = pr; ViewData ["BlogTitle"] = pr.BlogTitle; - ViewData ["HasAvatar"] = pr.avatar != null; + ViewData ["Avatar"] = pr.avatar; MembershipUser u = Membership.GetUser (); if (u != null) ViewData ["UserName"] = u.UserName; @@ -302,6 +302,9 @@ namespace Yavsc.Controllers if (avpath==null) { FileInfo fia = new FileInfo (Server.MapPath (defaultAvatar)); return File (fia.OpenRead (), defaultAvatarMimetype); + } + if (avpath.StartsWith ("~/")) { + } WebRequest wr = WebRequest.Create(avpath); FileContentResult res; diff --git a/web/Scripts/css/mapstyle-ie.css b/web/Scripts/css/mapstyle-ie.css new file mode 100644 index 00000000..1624a7ec --- /dev/null +++ b/web/Scripts/css/mapstyle-ie.css @@ -0,0 +1,3 @@ +.popup-content input[type=color] { + display:none; +} \ No newline at end of file diff --git a/web/Scripts/css/mapstyle.css b/web/Scripts/css/mapstyle.css new file mode 100644 index 00000000..2c1ee57d --- /dev/null +++ b/web/Scripts/css/mapstyle.css @@ -0,0 +1,207 @@ +.google-map, .map-overlay +{ + background-color: #DBDBDB; + background-image: url('../../src/img/map-load.gif'); + background-position: center center; + background-repeat: no-repeat; +} + +.map-overlay +{ + background-color: rgba(219,219,219,0.5); + position: absolute; + display: none; +} + + .map-overlay .btn-close + { + top: 50%; + margin-top: 80px; + margin-left: calc(50% - 40px); + position: absolute; + + } + +.popup-content input[type=color] +{ + -webkit-appearance: none; + -moz-appearance: none; + /*border: 1px solid #ccc;*/ + border: none; + border-radius: 3px; + display: inline-block; + height: 25px; + padding: 0px !important; + vertical-align: middle; + width: 25px; +} + +.popup-content .btn-popup-delete, .popup-content .btn-popup-save, .popup-content .btn-popup-cancel, .map-overlay .btn-close +{ + border: 1px solid #df0909; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + font-size: 12px; + font-family: arial, helvetica, sans-serif; + padding: 5px 5px 5px 5px; + text-decoration: none; + display: inline-block; + text-shadow: -1px -1px 0 rgba(0,0,0,0.3); + font-weight: bold; + color: #FFFFFF; + background-color: #f62b2b; + min-width: 85px; + background-image: linear-gradient(to bottom, #f62b2b, #d20202); +} + + .popup-content .btn-popup-delete:hover, .map-overlay .btn-close:hover + { + border: 1px solid #b30808; + background-color: #e40a0a; + background-image: linear-gradient(to bottom, #e40a0a, #9f0202); + } + +.popup-content .btn-popup-cancel +{ + color: #fef4e9; + border: solid 1px #da7c0c; + background: #f78d1d; + background: -webkit-gradient(linear, left top, left bottom, from(#faa51a), to(#f47a20)); + background: -moz-linear-gradient(top, #faa51a, #f47a20); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#faa51a', endColorstr='#f47a20'); + margin-right: 30px; +} + + .popup-content .btn-popup-cancel:hover + { + background: #f47c20; + background: -webkit-gradient(linear, left top, left bottom, from(#f88e11), to(#f06015)); + background: -moz-linear-gradient(top, #f88e11, #f06015); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f88e11', endColorstr='#f06015'); + } + +.popup-content .btn-popup-save +{ + color: #e8f0de; + border: solid 1px #538312; + background: #64991e; + background: -webkit-gradient(linear, left top, left bottom, from(#7db72f), to(#4e7d0e)); + background: -moz-linear-gradient(top, #7db72f, #4e7d0e); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#7db72f', endColorstr='#4e7d0e'); +} + + .popup-content .btn-popup-save:hover + { + background: #538018; + background: -webkit-gradient(linear, left top, left bottom, from(#6b9d28), to(#436b0c)); + background: -moz-linear-gradient(top, #6b9d28, #436b0c); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#6b9d28', endColorstr='#436b0c'); + } + +.popup-content input[type=text], .popup-content input[type=number], .popup-content select, .popup-content textarea +{ + border: 1px solid #CCCCCC; + border-radius: 3px; + padding: 3px; +} + +.popup-content textarea +{ + height: 100px; + width: 530px; +} + + .popup-content textarea.richtext-fix + { + margin-bottom: 35px; + } + +.popup-content input[type=text], .popup-content input[type=number], .popup-content select +{ + width: 150px; +} + +.popup-content table tr +{ + padding-top: 6px; + padding-bottom: 6px; +} + +.error-icon +{ + margin-left: 4px; + vertical-align: middle; +} + + +.fit-bound, .current-location, .map-style +{ + margin-left: -4px; + margin-top: 5px; + background-color: #ffffff; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 2px; + box-shadow: 0 1px 4px -1px rgba(0, 0, 0, 0.3); + width: 26px; + height: 26px; + z-index: 999; + background-image: url(../img/fit-bounds.png); + background-position: center center; + background-repeat: no-repeat; + cursor: pointer; +} + +.map-style +{ + min-width:100px; + background-image:none; + width:auto !important; +} + +.current-location +{ + background-image: url(../img/current-location.png); + margin-left: 0px; +} + + .fit-bound:hover, .current-location:hover + { + background-color: #EBEBEB; + } + +/*JQuery simple color picker*/ +html, body +{ + height: 100%; +} + +div.color-picker +{ + border-left: 1px solid #000; + border-top: 1px solid #000; + position: absolute; + left: 0px; + top: 0px; + padding: 0px; +} + + div.color-picker ul + { + list-style: none; + padding: 0px; + margin: 0px; + float: left; + } + + div.color-picker ul li + { + display: block; + width: 15px; + height: 15px; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + margin: 0px; + float: left; + cursor: pointer; + } diff --git a/web/Scripts/css/mapstyle.min.css b/web/Scripts/css/mapstyle.min.css new file mode 100644 index 00000000..77635372 --- /dev/null +++ b/web/Scripts/css/mapstyle.min.css @@ -0,0 +1 @@ +.google-map,.map-overlay{background-color:#DBDBDB;background-image:url(../../src/img/map-load.gif);background-position:center center;background-repeat:no-repeat}.map-overlay{background-color:rgba(219,219,219,.5);position:absolute;display:none}.map-overlay .btn-close{top:50%;margin-top:80px;margin-left:calc(50% - 40px);position:absolute}.popup-content input[type=color]{-webkit-appearance:none;-moz-appearance:none;border:none;border-radius:3px;display:inline-block;height:25px;padding:0!important;vertical-align:middle;width:25px}.map-overlay .btn-close,.popup-content .btn-popup-cancel,.popup-content .btn-popup-delete,.popup-content .btn-popup-save{border:1px solid #df0909;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;font-size:12px;font-family:arial,helvetica,sans-serif;padding:5px;text-decoration:none;display:inline-block;text-shadow:-1px -1px 0 rgba(0,0,0,.3);font-weight:700;color:#FFF;background-color:#f62b2b;min-width:85px;background-image:linear-gradient(to bottom,#f62b2b,#d20202)}.map-overlay .btn-close:hover,.popup-content .btn-popup-delete:hover{border:1px solid #b30808;background-color:#e40a0a;background-image:linear-gradient(to bottom,#e40a0a,#9f0202)}.popup-content .btn-popup-cancel{color:#fef4e9;border:1px solid #da7c0c;background:#f78d1d;background:-webkit-gradient(linear,left top,left bottom,from(#faa51a),to(#f47a20));background:-moz-linear-gradient(top,#faa51a,#f47a20);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#faa51a', endColorstr='#f47a20');margin-right:30px}.popup-content .btn-popup-cancel:hover{background:#f47c20;background:-webkit-gradient(linear,left top,left bottom,from(#f88e11),to(#f06015));background:-moz-linear-gradient(top,#f88e11,#f06015);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f88e11', endColorstr='#f06015')}.popup-content .btn-popup-save{color:#e8f0de;border:1px solid #538312;background:#64991e;background:-webkit-gradient(linear,left top,left bottom,from(#7db72f),to(#4e7d0e));background:-moz-linear-gradient(top,#7db72f,#4e7d0e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7db72f', endColorstr='#4e7d0e')}.popup-content .btn-popup-save:hover{background:#538018;background:-webkit-gradient(linear,left top,left bottom,from(#6b9d28),to(#436b0c));background:-moz-linear-gradient(top,#6b9d28,#436b0c);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#6b9d28', endColorstr='#436b0c')}.popup-content input[type=number],.popup-content input[type=text],.popup-content select,.popup-content textarea{border:1px solid #CCC;border-radius:3px;padding:3px}.popup-content textarea{height:100px;width:530px}.popup-content textarea.richtext-fix{margin-bottom:35px}.popup-content input[type=number],.popup-content input[type=text],.popup-content select{width:150px}.popup-content table tr{padding-top:6px;padding-bottom:6px}.error-icon{margin-left:4px;vertical-align:middle}.current-location,.fit-bound,.map-style{margin-left:-4px;margin-top:5px;background-color:#fff;border:1px solid rgba(0,0,0,.15);border-radius:2px;box-shadow:0 1px 4px -1px rgba(0,0,0,.3);width:26px;height:26px;z-index:999;background-image:url(../img/fit-bounds.png);background-position:center center;background-repeat:no-repeat;cursor:pointer}.map-style{min-width:100px;background-image:none;width:auto!important}.current-location{background-image:url(../img/current-location.png);margin-left:0}.current-location:hover,.fit-bound:hover{background-color:#EBEBEB}body,html{height:100%}div.color-picker{border-left:1px solid #000;border-top:1px solid #000;position:absolute;left:0;top:0;padding:0}div.color-picker ul{list-style:none;padding:0;margin:0;float:left}div.color-picker ul li{display:block;width:15px;height:15px;border-right:1px solid #000;border-bottom:1px solid #000;margin:0;float:left;cursor:pointer} \ No newline at end of file diff --git a/web/Scripts/html/popup-template-circle.html b/web/Scripts/html/popup-template-circle.html new file mode 100644 index 00000000..8f2529c3 --- /dev/null +++ b/web/Scripts/html/popup-template-circle.html @@ -0,0 +1,40 @@ + \ No newline at end of file diff --git a/web/Scripts/html/popup-template-marker.html b/web/Scripts/html/popup-template-marker.html new file mode 100644 index 00000000..d5beec89 --- /dev/null +++ b/web/Scripts/html/popup-template-marker.html @@ -0,0 +1,32 @@ + diff --git a/web/Scripts/html/popup-template-polygon.html b/web/Scripts/html/popup-template-polygon.html new file mode 100644 index 00000000..8810243a --- /dev/null +++ b/web/Scripts/html/popup-template-polygon.html @@ -0,0 +1,32 @@ + diff --git a/web/Scripts/html/popup-template-polyline.html b/web/Scripts/html/popup-template-polyline.html new file mode 100644 index 00000000..777a809d --- /dev/null +++ b/web/Scripts/html/popup-template-polyline.html @@ -0,0 +1,24 @@ + \ No newline at end of file diff --git a/web/Scripts/html/popup-template-rectangle.html b/web/Scripts/html/popup-template-rectangle.html new file mode 100644 index 00000000..07b55f0e --- /dev/null +++ b/web/Scripts/html/popup-template-rectangle.html @@ -0,0 +1,31 @@ + \ No newline at end of file diff --git a/web/Scripts/img/current-location.png b/web/Scripts/img/current-location.png new file mode 100644 index 0000000000000000000000000000000000000000..92e11d397590d80eb2dd1b3c3ac1686a8eff0bad GIT binary patch literal 430 zcmV;f0a5;mP)jhngG`0&}-v*8*^VYzyF)p+m~00TH& z%E>%RB@6FW38%=1$P8^T3T^c4N1o6vlIl(B=9=;78G(V}Lw%?hY2wYPz$v;QD*z@K z5FwDn2;*!s&>y((O$@Ai9RT1$qFk^+MhLJ1V4MLR3h0!k7N!ejkj^vJbmhcS4M%_k zs2l{dH2|>DEiXyPQ-0^%R8pq&e*-X(f=iB;f>OGhb*`QB68GCcy#qF7%`6}99^N*) z)R1U&GSO0_I)1hQ=BqF2@}FwWbJCn}ZTX+pd~j=%-_JzUh6%60oNd|Tqa&k7wW6)? Y2^X=ZXd(yO4gdfE07*qoM6N<$g68nV3;+NC literal 0 HcmV?d00001 diff --git a/web/Scripts/img/fit-bounds.png b/web/Scripts/img/fit-bounds.png new file mode 100644 index 0000000000000000000000000000000000000000..62fa0e6003cbde951b841addc4643c9d16912af5 GIT binary patch literal 352 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL9r6oh?3y^w370~qEv>0#LT=By}Z;C1rt33 z>la@$fhsP0x;Tbd_%EI4$kl8h;Ofk6+vELJE^iCB|3%+}OH1y)E_t}=LUQP($_bKg z97{KLyQ}4Y>h*N$`KZ5XQ_C8iMB~g^YEH4&^ChjH|9-p5)n)%^-`W05D t-8XZ+Z69q}FSq7~ci6NEQ}+uWW|wO1Ej7_vSpxJPgQu&X%Q~loCIFPaj8p&s literal 0 HcmV?d00001 diff --git a/web/Scripts/img/map-load.gif b/web/Scripts/img/map-load.gif new file mode 100644 index 0000000000000000000000000000000000000000..623e2300989726eaa9e50eead218d33974934481 GIT binary patch literal 20488 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 Ci1g0@ literal 0 HcmV?d00001 diff --git a/web/Scripts/img/pin/flag-azure.png b/web/Scripts/img/pin/flag-azure.png new file mode 100644 index 0000000000000000000000000000000000000000..e959687bbfa07a3b5572439dfffb485e247e1d6c GIT binary patch literal 824 zcmV-81IPS{P)A#EKj!S+jbRnst%THeR#~mA3;~JSMH>YXEw$Fp|3Oluun`nVp;f9NMv^iJ zVhV*#6x^8oxGQ`2-o58z#^T&-E)oODEG!PZoSAbtzxSEnJ2U6N|GB+(^=@_Us~?w2 zG(ySCZ~t)b^FQxwUQCl_f9dqo43-BBqOly6!7P?sa8pbLGeJWLn|tHicXlV|uADzJ zwGx1VYYtEetOrxF3Y`i`mE=l}2GOue8APKIVQW-x)j{66a{kN|pa|fU1wsgj8*YZE zLVyO)Ab1coK$C^-Hqh41!Du*s<kGll?FISfx{GV1aG@` zw14>erL${4Eou}2tXLq0z!V|mK-FbTGZBa)hy^@49$>hA@XqCp^=tpuC<5>h2qL&e z+!Zs!q7b7IU5U{#6NbB^8<#iMzj&C2lmJY+jEdk@#7t2SL^sq0cgJ1G8BVV*zx3YC zd!HUVz^F^T16A)ptQ0rJUGYi@A&_&XZ8IyYE1!ILbL)fS1!yy((p&A)FGLrjJ0gLU zGO0_Xlo;2Eb}4@L?zP`892>y6%ZLbGdGCNLKC64qnUpeJmuS00*L4h!x-b#_`qgiK zd2y~$b`Tv78yz3qogP%Ty0)U3DzzzLKKqpE+C-QC?sJzfHq zc`(U&(hjJP1>iqg09Iz<3(52BIv=-CSb~Q%oh7bj<7OfGJQ52l_c#Fzcxnc5NN+Pd zs5=Yef9@6Sf~IK!cy?{gfmM3T4}meg#Vvi!7h`cTmO9Xvbo>7OXXtJH3z$5PLfLP* z&vzIB*asf_P|y;9x^7;$e*OEsy}i9}bI#Kz(fAwVgAEz0aY?HH0000_i~qef|X5zT1PukEEFp{Z4MGEL2Y80Mi8{Mu~Hi$T@W-7 zv`S+TiKqcDhRfZ{yL<26?c1H5vDkg)Au*85gTsN3nb~Fk-*5ik%q;w$+lQAoit}Hs zl{p$F=i`f4pZa|3kG(gV+KmS5j+NDtQU{d&7^Myl2sPl+(h!dQ#=Fhvo{Jb@~ z@zRB}w`YmWUx5sM;}8CWI!ANBh-_o2Reenrq|%$OegkaTXCpoT4I# z7@|F-iWMR3;0wjIWf+aCS2j;y|7lSp(}5Et6A5Wd6)RHfiPn*lP@q`xcr6g)xij2< z>)e?e-~L-83&7bDYYko;DuQ$USOqU0FN%m`ING~&>TF`#Odtj)K}L+Q&VfCl7KN4DR!%GV@n7vO$an0 zP}hyA>-hHO*K+NX*Fu#AaPscEPfl+B{_Fd%pMUjHHL^-@Oe{j1BasJSttIn+mIvUR z!{p`91Q16qLB0b=Spso##3gVJbCe|z5svf}tgNmyvssk|kaZJUYuVY^d5{GP_4LO`p|{ssqg3W0GTDYPjh|ZqMtVl$>$MS z*tyFD5MZr`IH0o`?$w=z`9IIHPC?TI08XAdrN9X~%MXAloyCE!=8Lho8FL-zN_uB| z`!PCO_khEPQOE*Nou4oaFajR>QgAr{b=^FB<;wTN;c)m(N@?~e8h-=ZwjoU00l&%s O0000BY| literal 0 HcmV?d00001 diff --git a/web/Scripts/img/pin/needle-pink.png b/web/Scripts/img/pin/needle-pink.png new file mode 100644 index 0000000000000000000000000000000000000000..c4ddb75fc5a63427f2a3ff312e21f04f82944461 GIT binary patch literal 1025 zcmV+c1pfPpP) zir&m!5TiLrHee(nf&@1tuItWgXLfqJ>*-;7lf?)0&W@(wM^RnB{{B9{Up*+n7_IZv zd#8frq_y^NzS1XM?q1H)^vfexKloy!T4E#4y_4_n4%5{$@%?*`iS1MP#TCqAhrzWa zI+qvdcf0e(m?w`nKU*xTDa$%`9)G9dtMS>&WA`3Qo;X5uWG`xNmS|gpc&1Ku*EWGDvgK7GXU?2vnpHZ~){R69rg!;N^;y;dzDz zztF^8Uc~+K2ky5nZg~~kAL7y+=RJXdki78SuBR(yw4*Xkd6pj)M%PTU2N$m+5=9tj zd}|fm?x8z<^vWt$n^9JAT$Mr|1HPXOK%VXJtsbh;B3T`xPy}PJ{fxY~%CNgao~CH4 zK?r25kY4O4qg@gpUoy^u5+qYKlvD)ca9Kv4X|i-kIvnD?N2&-F#|Yz>CI(=%p10cf zoV7D?5+jv@0N#1D$;t8@>ny5TK}v;GvWE@l%V?`IPM@R~!!wn`b#2UXtu;n#vOFit zGjgr*!4oy6XzaU_D2efd{H=!$ykLndn))z53!H9kMl-A8i?mPanE^`rJmf#sUC%_oY{68~5D3{KNTq z_W0V)S5Lp)97m_rDfp*WJ+w#c-@l)QYu8bg>ez{t-UEMal_Vij5duLHkDbT(00N1W z^5*FO2M_|K#{PXW0Jkb|TL1!5mbys)8vukLif&^Cq!1IS!1(6}2w~K>TdnnaF{8u; zP&zCW3!4CdA3a8YzH%i2sz9Al){egi zj{sB5ul1V&7(GY;8q?Ej*@i+>6+zZ+sP#}cgTp2^p*A^MYn-zjJa|Y0EnuaXcEAAW z1HIyVw;1d7I%8L0wLhTK>5!%=tyWV238N)&KojV2t1ABAbjAkg^?P*MZHB`k7v|4z z1$GvCON^>v%jk@~1pQuLbh{nW!GJ8w=YT2TkHSg?hfP$V*=mZZdYv>K5Q2|^8ygM2 vDS&pn9r+NxU0z;R^?LnAmSw+hG&sPY$aTc}7V8D~00000NkvXXu0mjfUa{bC literal 0 HcmV?d00001 diff --git a/web/Scripts/img/pin/niddle-green.png b/web/Scripts/img/pin/niddle-green.png new file mode 100644 index 0000000000000000000000000000000000000000..a7591aee2a3f0675cacf51559c1cebc75e12a8e6 GIT binary patch literal 1026 zcmV+d1pWJoP)lyC&ukjcbH>(XhGbK`@H9pa|;4gD7|s1o7fQB*{S!xd>kL zCJ26jB0<567lR72y96~75n_n0$!0!xKKi4oy2``!CW{}?J3BEC9!+(<{=eUQ^+5~9 zuupzF`ZTDgjJ5X+;x3(G^gIxe(cC%{RtK-hpCtLQ!U-XRC$Kk z>RyzTOEz<7Ui_5$!~u*kZ|*K1TAU8=#1Iqvs~FcOBgJD8LZD;-uqcImW1;|WpS`2( zGWDEsF+FpEcKQPw`d0>ajmR`fZ4YfDoO9qkQmW@)`J!Adq8$_oijsJ#M7nFJ8#KgO zqzEu>Kw?`A(l-61#USmXt;PdN1{Edb5lFw82tbmUxt?oN3D-zWAEgADPf5&xLENPq zb&2C4+8Cr1gepV^ey)giA%Hkd*Nw4&VyZHQl9J48Qk#;dF~cZfm?UJ*5e5N)3IV%5 zF@RL-mDtfUc73`Ol?VfgbKrc2HijrkG1gKEcM$}NK&f6PvgIP$sz}gxA2`4Cq^oLU zAJj&ZYE7b3q9i5J8s|Mz%>2`AGMxBHD$Ip;GdMl5)j4hqe}NEzUba z6*5=b$Nt^-F<-kK>yuR_U+$>sT1!s$I&Tt3jWP*tsW8w?mEE5KYpiNu8dts;Z68=E0s$GDnK9z!?EiaA3z|H zQeGSV{{TXu)YzX-2H<)JZVG@$%0d_EjR8Oig5V~0KngLD4vc?(0Pjc7cB{2jFJx4h z0P+YdkO40DodbC9$+FSE;JI@@2Ea5>%K^v}Wn0|lu5+INfO7~T_~rch5>NrEjH=G~ zXYv3r`TXW{Cjj8GQ8#P#`ewC0*Hn3u%^PYf)V1WWgH5PSiq@Jevm88lw+33kMn0VZ zL!b}z^7q|*thefn-GM=WNT<^wiXvLArT|KemLLO~K!@vHasQ<=HbAf6qtk8^$1$rb z%d@~juD8yp8@7nf*h|pw^+mVaAsP-zl5{^X1zgR&P;%Ho2b!&>n5tHZq9NY95Lnx8 w@*M%R+wH)4|8=9$P}OR6ElH9q+f5Ge7bI22JVtll=l}o!07*qoM6N<$g5bU4vH$=8 literal 0 HcmV?d00001 diff --git a/web/Scripts/img/pin/pin-azure.png b/web/Scripts/img/pin/pin-azure.png new file mode 100644 index 0000000000000000000000000000000000000000..ea0475ea2d10112e5ea580e77b1e6ca682d96728 GIT binary patch literal 1563 zcmV+$2ITpPP)cqhqt%o&q}Y%c8%!`j(8vc38fysJ zsKFX+e2Xc*Bw%6_K&VKp2E|G%K`_!*3T+ol3$5*T*)83jx%Zsohk16pkbUG?swX*_ znR{o>|98(l_s$h&Y2SOXzOW@+HLnQo?*z_q@CoDaiEK|~lY4I(EQe+jPx^gvjwSIcW0Jk5kzx=L_+`g}J0?>|uR&YuQ1OanMZqz1B zm{F?`#aPk~>>sxqzqY9T{WlEo)qhnh7qsNT7iy=FKqorw5a zgqHZ`|2D{?S4UD^SA{T`913ZIH!hqS8|BaU+{M8s|B6ds;j-micFj6ycW}S}5vbG& zE*IUr`{dPkUUJr!nRI$i!7Y1V`J)9{5z9y^LW$6d@bYte*mB*~RHH8wV+24|>74ym zR^N3W1LrO#xs%;V+0Z&8=J(%u>07Sq8{mdLCndO5MNyPRD-saO0MV3Re&TY{$ZON>a2#ImHE1~K;hKFmSY@N8r=+!QtM%%nAA5vutZ4vHcwh&xD0?97=;dl4fc zMnVWpn+WbsIcEUPiY7zNP*t)5V&i>hVDtOtzND(7$&8$hoSmF93qJTEz=O}X zWhBH%5ew$OcR4vJ*^H!yB|}wD{`>=HpX?i;nFfEvl9RHMRmn-2vt%ikd~7wqR1wB5 zNLdtIv}!Ffe*rlwDJzz{S;+oGFP+{1>USs2Xq~BZCe_MBmALqGw{iJ3pCZJ7yF&=H z+Z~pDavg79b3JvHsI#JVCg)759e4Y6FP)zIz}mkY4W9L2QO3a-0}>&Ihy-Dvh%Dk1 z_0V1jfw1V^3~5P~40pp+Q3cILO1VPf;Fc>E49^MxV9g_kuLpiul#wU`1w;g*ARe0h zIXI51;W(PX)ydjjL2euFz4E+UXPtpbTfObz(;>u5i$Wj>F$f}ph)=!a-mCyM2Xk_E z+>M;|fP}d8z7H>~dd2VgFPJnlKI57mbB};vu@QF*c4S>0l6%+j0`#;iK zysr!Zto+T;rik1~6e5mDfY3mQ7?|L0D9r&uRRPv-{rHmGUN3fE03Y2tG~hWu6QV3c znoTD-5FAV}p;-}bxPiIve0bFb%lnDla~V#zhgL2=rRq1-RkI)DDv`31Dr@$MDv?w3 zTqmtg9Y1<)KXLm80QlYN3m-_yep^?Gl#QxNq@21}qplK3jTg5+^o_r*|MUa7^E+?4VwvYuHLYmZGtD_=x~9_);dJ}c+NJ+2VzD`f zNRZPWL!>C%?El3#*LzL^w1IM(w`f*em=vD0SpfjVP<*9TloMr9(kepzM09Z1c>|zW(iLBCqv=(>3v`X`eL!z>ysf zZwRJiWh`jLlHpyCJvzK=$J1S*>4HKt_Zg_Vp3WHHA3ylga5{cuV>9{|d+)yEC!8L= z&=lSTFb0eQCxM#Ng?MHF0KrA|XP+AB3XRZ=c!DMa|9?AcaLL<3(K-is6K^n^{{irn8q|*sRcQbK N002ovPDHLkV1oVE<$3@B literal 0 HcmV?d00001 diff --git a/web/Scripts/img/pin/pin-green.png b/web/Scripts/img/pin/pin-green.png new file mode 100644 index 0000000000000000000000000000000000000000..86c74636cae084e69fed5771a88f36fda56bb4ce GIT binary patch literal 1561 zcmV+!2Il#RP)Y zf2iGc8OLAG^ZA}1+r2ZVZp>LOEElp6riKb(A;TGiGSVa#K_nE3M(dwQVI_(Ezy>)+ zKbWi_DUt>$R))^g;Oa%*m@xwWm0?VdaD?vHcM_wzhYe|*oGH@RotJAF702fja^ z_v`ufIY*eIZ9D#jYm+wa8ZMUJP}AWhfk)}%Cnm}hFIkjZS6}tZ*XI&XX8YhDj@|R& zq2kI7mp86o72-_f6LjMo;XyqOGn|$Z5u9$n@@(5i)~$Kp(+A%*fMmPcy)!m0` zoth3&6hjq68X`#@i!RwFC~cga$H~#Av`Gl(()tP?Z6CPpb06HbbC8A(y7AP%ZmbnD z{IikHt2mCJpn`}Xq9iS-74s-k4OK-%K@&uPC?1*7&OcR|_vD3=EC$`kR(>(dtJuMJt`AzTP_m@`eeR@s+ z;c4wuZc!8ocSj^ZGDlt;htGs$1K!T~VMMU~M zFeAW>E%^DqYo(i~ZnZEXf)Inqlx3HV4;;ih17x)~n0wCy zbHm-5Gil8@18#mU5G*?)22@$s8&XZYDn&|YN~mgY3j`0L-gHVU$>x}4EISsCL`==P z0uQV_deX9uWi$F-=FIY&8-S8T(3D6ioo|JvM3D;KzY=opy_W+E!?KO9`^bs$SpxvL z$Dc|!a%tpT(#@GGuIX~iCl&!!#;RIDq(rT#bL*#un0MI}Ip^v{$VPbKB5-&;FVud2i}xukvOKJP>g#0t_5~@rP^Lx6CH?z%`t1-&;K~ znccsdyP0ljWXp8ACAr(JzO8q?G`f~MVv#W#M@NnV)q?niV!rJVPPgp-^>FS0*NWWEtBAnV8@#Y>1DiZEzjxVso~MEI zlMa|=3;MR{Gwe?)PbTSw>3I@Jg|KrAPk2Uv22h*k^a?o$Ilh+zJ)!A>Le={Wbb4OCV}KVnd28Yf8#F1YrtJJx{vB^- zFI0oq2F?Lvz&OxlhK;x=0Dxor{PD0%D_N8ZmHg9tY&dkFR#00000 LNkvXXu0mjf;&Sww literal 0 HcmV?d00001 diff --git a/web/Scripts/img/pin/pin-pink.png b/web/Scripts/img/pin/pin-pink.png new file mode 100644 index 0000000000000000000000000000000000000000..91661629d42f2d448195bab0cb44a5aaeffb5089 GIT binary patch literal 1561 zcmV+!2Il#RP)Y zYm8l06~}*T?{n_G)6P&q=@U!R3iW{%3Dg=4!RQAQHGUyzD27Nttr#@=g{ZNHXfTRm z4AjPy0wxkPCM2c_Bt`*&5RsaewxrfJeMuiv+nLVup1b#2%Ma&HJCeC|rgSAMC)xY# z_5ba)_S)wNbF|TK{Pt>E<>%s}1=q>E=3?C3$E%}yVq}|F`RPl3x$fXx;>m1Z9Q*PU z*T|wv9*XZ@@<{+69K|LoFel7wA`1s_HFW2{xBBVvZw)+p=f5r*z?nNX-&A>UPkBjBlleP^t~G|7-0A_zxZ@~&%&*`ZxHD# zi35FbNgr`RA7P+{v`W04u#q-8G6^G-=tvtT+E_BeszsLe58m{yXTJS%FOAS^V(1e; zDVg8+b>4FfF^3Q!2q6f>fHX^De~Zv;ATieCA`k=!h#I!{c%W5mIo~FWUK6VMOK~zS zl`2E41a&aS)fgKaoI86CiH0W!!80hb(T{`Pue-clMTX&rU zSA<&>gR%}LQ?jR4HBgmmKc#3iDgMS1yMFQ&>6yXO58Bdm@1~$ znn`QMGhk+;E=D#%wC+^N(4xM4Bm{~W2{95vsK-Pwpf8rFYVBFc=C~Q=OwKw3%Xj?v zcvc;$10__IteG48ufzjH5kic_7|)g>#7I#T+)ykb=ZtD1yW*;3)v*=39~_%C0D!qY zZ<GT9}wI?+h zmNUsRS(Q%J=Dv9!;kMN`BQaut7m;SO#qBF@FmR_^(k<)Vm z0N8!i*S|uLO)(Tm2!sGpV!cQN0UW>`cSot)&Mjl+#BoO@EQWMABK*3PV95X|6J`g3mZ}q`VRj>Fxui|sj?XG0@N{kUii5d~f zXbAY!4$N>D6a}XiS2f_a4ymrN14+r5Mi4jByBDh1qF$57X_qr6SC;RVCIWL?2GfKEZL~s#8aOx&9%mnG41H*B*zpXv?#M;@!?%9UZ?fN&j zOsMJCQtptngK8orC3WhjY9eVpmvX93cE;DuCN9k3rxf6Y%f9f8hwv$JClIC*fMNCJ zE(`h1a^#X`pz5gluoB;s- zS{->Hi;W8PSMeX|#EaYW$z5Hc>4HLC`wUcFPj4IG!Le6Q58C8IAqL72d31coX3p(i zs1IHn7zIXvF`&Z?9dSVb06Ws)&yx7?8~N1s9cl25?r<9z2L1z_?g}T~a`2{GyikCb zsw35c*zA9yefZV=d1yCqs_P@vsXlN2Uldyw2QDuNi-GxEU^f2?NV78#n6|NU00000 LNkvXXu0mjfz#;TV literal 0 HcmV?d00001 diff --git a/web/Scripts/jquery.googlemaps.js b/web/Scripts/jquery.googlemaps.js new file mode 100644 index 00000000..760bd93a --- /dev/null +++ b/web/Scripts/jquery.googlemaps.js @@ -0,0 +1,1167 @@ +/* + * jQuery Plugin: JQuery GoogleMaps + * https://github.com/dejanstojanovic/JQuery-GoogleMaps + * Version 2.2.4 + * + * Copyright (c) 2014 Dejan Stojanovic (http://dejanstojanovic.net) + * + * Released under the MIT license + */ + +$.fn.GoogleMapEditor = function (options) { + var defaults = { + editMode: true, /* Allow editiong on the map */ + editTemplatesPath: "../src/html/", /* Editor layouts html files location */ + markerPinsPath: "../src/img/pin/", /* Custom marker icons path */ + markerPinFiles: ["flag-azure.png", /* List of files to be available from custom marker icons path */ + "flag-green.png", + "needle-pink.png", + "niddle-green.png", + "pin-azure.png", + "pin-green.png", + "pin-pink.png"], + drawingBorderColor: "#ff0000", /* Default border drawing color when drawing is initiated */ + drawingBorderWidth: 2, /* Default border drawing width when drawing is initiated */ + drawingFillColor: "#ffff00", /* Default fill drawing color when drawing is initiated */ + zoom: 13, /* Default map zoom if not defined when initiating */ + center: { /* Default map center */ + latitude: 25.0417, + longitude: 55.2194 + }, + width: 800, /* Map width. If not set then container width will be used*/ + height: 400, /* Map height. If not set then container height will be used*/ + language: "en", /* List of supported languages https://spreadsheets.google.com/spreadsheet/pub?key=0Ah0xU81penP1cDlwZHdzYWkyaERNc0xrWHNvTTA1S1E&gid=1 */ + singleLocation: false, /* Allow only one location present on the map */ + searchBox: true, /* Add search box to the map */ + richtextEditor: true, /* Use TinyMce editor for location messages */ + drawingTools: ["marker", /* Tools to be availale for editing */ + "polyline", + "polygon", + "circle", + "rectangle"], + zoomControl: true, /* Show zoom control */ + panControl: true, /* Show pan control */ + scaleControl: true, /* Show scale on the map */ + streetViewControl: true, /* Show street view control */ + scrollWheel: false, /* Use mouse wheel to zoom in and zoom out*/ + style: null, /* Build custom syles at http://gmaps-samples-v3.googlecode.com/svn/trunk/styledmaps/wizard/index.html */ + stylesPath: "../src/styles.json", /* Url of JSON file with map styles definitions. Enpowered by snazzymaps.com */ + locations: [], /* Locations to be loaded with the map */ + dataChange: null, /* Event raised when anything on the map changed */ + locationClick: null, /* Event raised when a location on the map is clicked */ + locationNew: null, /* Event raised when new location is added on the map */ + locationDelete: null, /* Event raised when location is deleted from the map */ + locationMove: null /* Event reaised when location is moved on the map to a different position */ + } + var settings = $.extend({}, defaults, options); + var tinyMceUrl = "//tinymce.cachefly.net/4.0/tinymce.min.js"; + var mapApiUrl = "//maps.googleapis.com/maps/api/js?sensor=false&callback=mapApiLoaded&libraries=drawing,places"; + + if (settings.language != "") { + mapApiUrl += "&language=" + settings.language; + } + + var popupTemplateCircle = null; + var popupTemplateRectangle = null; + var popupTemplateMarker = null; + var popupTemplatePolyline = null; + var popupTemplatePolygon = null; + var selector = $(this); + + if ((typeof google !== "undefined" && google !== null ? google.maps : void 0) == null) { + $.getScript(mapApiUrl); + window.mapApiLoaded = function () { + selector.each(function (index) { + var container = selector.get(index); + + if (settings.width == defaults.width) { + if ($(container).width() <= 0) { + $(container).width(defaults.width); + } + } + else { + $(container).width(settings.width); + } + + if (settings.height == defaults.height) { + if ($(container).height() <= 0) { + $(container).height(defaults.height); + } + } + else { + $(container).height(settings.height); + } + + initializeGoogleMapEditor(container); + }); + }; + } + else { + selector.each(function (index) { + var container = selector.get(index); + initializeGoogleMapEditor(container); + }); + } + + function addSearchBox(map) { + var inputId = "q" + map.id; + $(map.container).parent().prepend(""); + var input = document.getElementById(inputId); + if (input != null) { + map.controls[google.maps.ControlPosition.TOP_RIGHT].push(input); + var searchBox = new google.maps.places.SearchBox(input); + google.maps.event.addListener(searchBox, 'places_changed', function () { + var places = searchBox.getPlaces(); + var bounds = new google.maps.LatLngBounds(); + for (var i = 0, place; place = places[i]; i++) { + bounds.extend(place.geometry.location); + } + map.fitBounds(bounds); + map.setZoom(15); + }); + google.maps.event.addListener(map, 'bounds_changed', function () { + var bounds = map.getBounds(); + searchBox.setBounds(bounds); + }); + } + } + + function addStylesList(map) { + if (settings.editMode) { + var selectId = "s" + map.id; + $(map.container).parent().prepend(""); + var input = document.getElementById(inputId); + if (input != null) { + map.controls[google.maps.ControlPosition.TOP_CENTER].push(input); + $(input).click(function () { + var bounds = getMapLocationsBounds(map); + if (bounds != null) { + map.fitBounds(bounds); + saveToJson(map); + } + }); + } + } + + function addCurrentLocationButton(map) { + var inputId = "l" + map.id; + $(map.container).parent().prepend(""); + var input = document.getElementById(inputId); + if (input != null) { + map.controls[google.maps.ControlPosition.TOP_CENTER].push(input); + $(input).click(function () { + if (navigator.geolocation) { + var mapOverlay = $(map.container).next(); + mapOverlay.width($(map.container).width()); + mapOverlay.height($(map.container).height()); + mapOverlay.offset({ top: $(map.container).offset().top, left: $(map.container).offset().left }) + mapOverlay.fadeIn("slow"); + navigator.geolocation.getCurrentPosition(function (position) { + mapOverlay.fadeOut("fast"); + + if (settings.editMode) { + var myLocation = new Location([new Coordinate(position.coords.latitude, position.coords.longitude)], google.maps.drawing.OverlayType.MARKER, "", "", "", "", "", ""); + initMapObject(map, myLocation); + map.locations.push(myLocation); + var locationBounds = new google.maps.LatLngBounds( + new google.maps.LatLng(myLocation.Coordinates[0].Latitude, myLocation.Coordinates[0].Longitude)); + map.fitBounds(locationBounds); + map.setZoom(15); + new google.maps.event.trigger(myLocation.Overlay, 'click'); + saveToJson(map); + } + else { + var locationBounds = new google.maps.LatLngBounds( + new google.maps.LatLng(position.coords.latitude, position.coords.longitude)); + map.fitBounds(locationBounds); + map.setZoom(15); + } + + }, function (errmsg) { + alert("Unable to fetch your current location!\n" + errmsg); + mapOverlay.fadeOut("fast"); + }); + } + }); + } + } + + + function arePopupTemplatesLoaded() { + if ( + popupTemplateCircle != null && + popupTemplateRectangle != null && + popupTemplateMarker != null && + popupTemplatePolyline != null && + popupTemplatePolygon != null) { + return true; + } + else { + return false; + } + } + + function loadPopupTemplates() { + + $.ajax({ + url: settings.editTemplatesPath + "popup-template-circle.html", + method: "GET", + dataType: "text html", + success: function (data) { + popupTemplateCircle = data; + } + }); + + + $.ajax({ + url: settings.editTemplatesPath + "popup-template-rectangle.html", + method: "GET", + dataType: "text html", + success: function (data) { + popupTemplateRectangle = data; + } + }); + + $.ajax({ + url: settings.editTemplatesPath + "popup-template-marker.html", + method: "GET", + dataType: "text html", + success: function (data) { + popupTemplateMarker = data; + } + }); + + $.ajax({ + url: settings.editTemplatesPath + "popup-template-polyline.html", + method: "GET", + dataType: "text html", + success: function (data) { + popupTemplatePolyline = data; + } + }); + + $.ajax({ + url: settings.editTemplatesPath + "popup-template-polygon.html", + method: "GET", + dataType: "text html", + success: function (data) { + popupTemplatePolygon = data; + } + }); + + } + + function initializeGoogleMapEditor(container) { + var map = null; + if (settings.editMode) { + loadPopupTemplates(); + } + map = new google.maps.Map(container, { + center: new google.maps.LatLng(settings.center.latitude, settings.center.longitude), + zoom: settings.zoom, + zoomControl: settings.zoomControl, + panControl: settings.panControl, + scaleControl: settings.scaleControl, + streetViewControl: settings.streetViewControl, + infoWindow: null, + styles: settings.style + }); + + map.setOptions({ scrollwheel: settings.scrollWheel }); + map.container = container; + map.locations = settings.locations.slice(0); + map.id = createUUID(); + + $("
", { class: "map-overlay" }).append($("", { type: "button", value: "Close", class: "btn-close" })).insertAfter($(map.container)); + $(".map-overlay input.btn-close").click(function () { + $(this).parent().fadeOut("slow"); + }); + + google.maps.event.addListenerOnce(map, 'idle', function () { + addStylesList(map); + addFitBoundsButton(map); + addCurrentLocationButton(map); + if (settings.searchBox) { + addSearchBox(map); + } + + if (map.locations != null && map.locations.length > 0) { + for (i = 0; i < map.locations.length; i++) { + initMapObject(map, map.locations[i]); + } + } + + saveToJson(map); + }); + + google.maps.event.addListenerOnce(map, 'center_changed', function () { + saveToJson(map); + }); + + google.maps.event.addListenerOnce(map, 'zoom_changed', function () { + saveToJson(map); + }); + + google.maps.event.addListenerOnce(map, 'maptypeid_changed', function () { + saveToJson(map); + }); + + google.maps.event.addListenerOnce(map, 'dragend', function () { + saveToJson(map); + }); + + google.maps.event.addListener(map, 'click', function () { + if (map.infoWindow != null) { + map.infoWindow.close(); + map.activeLocation = null; + } + for (i = 0; i < map.locations.length; i++) { + map.locations[i].Overlay.set("editable", false); + } + }); + + if (settings.editMode) { + + var drawingManager = new google.maps.drawing.DrawingManager({ + drawingMode: google.maps.drawing.OverlayType.MARKER, + drawingControl: true, + polygonOptions: { + draggable: settings.editMode, + strokeWeight: settings.drawingBorderWidth, + strokeColor: settings.drawingBorderColor, + fillColor: settings.drawingFillColor + }, + markerOptions: { + draggable: settings.editMode + }, + polylineOptions: { + draggable: settings.editMode, + strokeWeight: settings.drawingBorderWidth, + strokeColor: settings.drawingBorderColor, + fillColor: settings.drawingFillColor + }, + circleOptions: { + draggable: settings.editMode, + strokeWeight: settings.drawingBorderWidth, + strokeColor: settings.drawingBorderColor, + fillColor: settings.drawingFillColor + }, + rectangleOptions: { + draggable: settings.editMode, + strokeWeight: settings.drawingBorderWidth, + strokeColor: settings.drawingBorderColor, + fillColor: settings.drawingFillColor + }, + drawingControlOptions: { + position: google.maps.ControlPosition.TOP_CENTER, + drawingModes: settings.drawingTools + } + }); + + google.maps.event.addListener(drawingManager, 'overlaycomplete', function (e) { + var location = null; + if (settings.singleLocation) { + clearLocations(map); + } + e.overlay.set("draggable", settings.editMode); + location = initLocationObject(map, e.overlay, e.type); + attachLocationHandlers(map, location, e.type); + e.overlay.setOptions({ suppressUndo: true }); + attachTransformHandlers(map, e.overlay, e.type); + + if (settings.locationNew != null && typeof (settings.locationNew) == "function") { + settings.locationNew(map, location); + } + }); + drawingManager.setMap(map); + } + } + + function attachTransformHandlers(map, overlay, type) { + + switch (type) { + case google.maps.drawing.OverlayType.POLYLINE: + case google.maps.drawing.OverlayType.POLYGON: + google.maps.event.addListener(overlay.getPath(), 'set_at', function (index, obj) { + updateLocationObject(map, overlay.Location, type, true); + }); + google.maps.event.addListener(overlay.getPath(), 'insert_at', function (index, obj) { + updateLocationObject(map, overlay.Location, type, true); + }); + google.maps.event.addListener(overlay.getPath(), 'remove_at', function (index, obj) { + updateLocationObject(map, overlay.Location, type, true); + }); + break; + case google.maps.drawing.OverlayType.CIRCLE: + google.maps.event.addListener(overlay, 'radius_changed', function (index, obj) { + updateLocationObject(map, overlay.Location, type, true); + }); + google.maps.event.addListener(overlay, 'center_changed', function (index, obj) { + updateLocationObject(map, overlay.Location, type, true); + }); + break; + case google.maps.drawing.OverlayType.RECTANGLE: + google.maps.event.addListener(overlay, 'bounds_changed', function (index, obj) { + updateLocationObject(map, overlay.Location, type, true); + }); + break; + } + } + + function clearLocations(map) { + if (map.locations != null && map.locations.length > 0) { + for (i = 0; i < map.locations.length; i++) { + map.locations[i].Overlay.setMap(null); + } + map.locations.length = 0; + map.locations = []; + } + } + + function initLocationObject(map, overlay, type) { + var maplocation; + var coordinates = []; + + switch (type) { + case google.maps.drawing.OverlayType.MARKER: + maplocation = new Location([new Coordinate(overlay.getPosition().lat(), overlay.getPosition().lng())], google.maps.drawing.OverlayType.MARKER, "", "", "", "", "", ""); + break; + case google.maps.drawing.OverlayType.CIRCLE: + maplocation = new Location([new Coordinate(overlay.getCenter().lat(), overlay.getCenter().lng())], google.maps.drawing.OverlayType.CIRCLE, ""); + maplocation.Radius = overlay.getRadius(); + break; + case google.maps.drawing.OverlayType.POLYLINE: + for (i = 0; i < overlay.getPath().length; i++) { + coordinates.push(new Coordinate(overlay.getPath().getAt(i).lat(), overlay.getPath().getAt(i).lng())) + } + maplocation = new Location(coordinates, google.maps.drawing.OverlayType.POLYLINE, ""); + break; + case google.maps.drawing.OverlayType.POLYGON: + for (i = 0; i < overlay.getPath().length; i++) { + coordinates.push(new Coordinate(overlay.getPath().getAt(i).lat(), overlay.getPath().getAt(i).lng())) + } + maplocation = new Location(coordinates, google.maps.drawing.OverlayType.POLYGON, ""); + break; + case google.maps.drawing.OverlayType.RECTANGLE: + coordinates.push(new Coordinate(overlay.getBounds().getNorthEast().lat(), overlay.getBounds().getNorthEast().lng())); + coordinates.push(new Coordinate(overlay.getBounds().getSouthWest().lat(), overlay.getBounds().getSouthWest().lng())); + maplocation = new Location(coordinates, google.maps.drawing.OverlayType.RECTANGLE, ""); + break; + } + + maplocation.Overlay = overlay; + overlay.Location = maplocation; + if (map.locations == null) { + map.locations = []; + } + map.locations.push(maplocation); + saveToJson(map); + return maplocation; + } + + function initMapObject(map, location) { + + switch (location.LocationType) { + case google.maps.drawing.OverlayType.MARKER: + + var marker = new google.maps.Marker({ + draggable: settings.editMode, + map: map, + position: new google.maps.LatLng(location.Coordinates[0].Latitude, location.Coordinates[0].Longitude), + Location: location + }); + if (location.Icon != null && location.Icon != "") { + marker.setIcon(new google.maps.MarkerImage(settings.markerPinsPath + location.Icon)); + } + + location.Overlay = marker; + attachLocationHandlers(map, location, google.maps.drawing.OverlayType.MARKER); + break; + case google.maps.drawing.OverlayType.CIRCLE: + var circle = new google.maps.Circle({ + draggable: settings.editMode, + map: map, + strokeWeight: location.BorderWeight, + strokeColor: location.BorderColor, + fillColor: location.FillColor, + map: map, + radius: location.Radius, + center: new google.maps.LatLng(location.Coordinates[0].Latitude, location.Coordinates[0].Longitude), + Location: location + }); + location.Overlay = circle; + attachLocationHandlers(map, location, google.maps.drawing.OverlayType.CIRCLE); + break; + case google.maps.drawing.OverlayType.POLYLINE: + var polylineCorners = []; + for (c = 0; c < location.Coordinates.length; c++) { + var polylineCorner = new google.maps.LatLng(location.Coordinates[c].Latitude, location.Coordinates[c].Longitude) + polylineCorners.push(polylineCorner); + } + + polyline = new google.maps.Polyline({ + path: polylineCorners, + strokeWeight: location.BorderWeight, + strokeColor: location.BorderColor, + draggable: settings.editMode, + Location: location + }); + polyline.setMap(map); + location.Overlay = polyline; + attachLocationHandlers(map, location, google.maps.drawing.OverlayType.POLYLINE); + break; + case google.maps.drawing.OverlayType.POLYGON: + var poligonCorners = []; + for (c = 0; c < location.Coordinates.length; c++) { + var polygonCorner = new google.maps.LatLng(location.Coordinates[c].Latitude, location.Coordinates[c].Longitude) + poligonCorners.push(polygonCorner); + } + polygon = new google.maps.Polygon({ + path: poligonCorners, + strokeWeight: location.BorderWeight, + strokeColor: location.BorderColor, + fillColor: location.FillColor, + draggable: settings.editMode, + Location: location + }); + polygon.setMap(map); + location.Overlay = polygon; + attachLocationHandlers(map, location, google.maps.drawing.OverlayType.POLYGON); + break; + case google.maps.drawing.OverlayType.RECTANGLE: + var rectangle = new google.maps.Rectangle({ + draggable: settings.editMode, + map: map, + strokeWeight: location.BorderWeight, + strokeColor: location.BorderColor, + fillColor: location.FillColor, + map: map, + bounds: new google.maps.LatLngBounds( + new google.maps.LatLng(location.Coordinates[1].Latitude, location.Coordinates[1].Longitude), + new google.maps.LatLng(location.Coordinates[0].Latitude, location.Coordinates[0].Longitude)), + Location: location + }); + location.Overlay = rectangle; + attachLocationHandlers(map, location, google.maps.drawing.OverlayType.RECTANGLE); + break; + } + attachTransformHandlers(map, location.Overlay, location.LocationType); + } + + function saveToJson(map) { + var result = null; + if (settings.editMode) { + var mapBounds = getMapLocationsBounds(map); + if (mapBounds != null) { + var mapCenter = getMapLocationsBounds(map).getCenter(); + settings.center = new Coordinate(mapCenter.lat(), mapCenter.lng()); + } + var properties = ["editMode", "editTemplatesPath", "markerPinsPath", "markerPinFiles", "drawingBorderColor", "drawingBorderWidth", "drawingFillColor", "zoom", "width", "height", "singleLocation", "center", "language", "searchBox", "richtextEditor", "drawingTools", "zoomControl", "panControl", "scaleControl", "streetViewControl", "scrollWheel", "stylesPath", "style", "locations"]; + properties = properties.concat(["latitude", "longitude", "Coordinates", "Latitude", "Longitude", "Radius", "LocationType", "Icon", "HoverIcon", "Message", "BorderColor", "BorderWeight", "FillColor", "Tag"]); + properties = properties.concat(["featureType", "elementType", "stylers", "color", "hue", "weight", "visibility", "lightness", "saturation"]); + + result = JSON.stringify($.extend({}, settings, { locations: map.locations }), properties); + if (settings.dataChange != null && typeof (settings.dataChange) == "function") { + settings.dataChange(map, result); + } + } + return result; + } + + + function handleMapCloseClick(map, type) { + if (typeof map.activeLocation != 'undefined' && map.activeLocation != null) { + $(".color-picker").remove(); + } + updateLocationObject(map, map.activeLocation, type, false); + } + + function attachLocationHandlers(map, location, type) { + google.maps.event.addListener(location.Overlay, 'dragend', function (event) { + updateLocationObject(map, this.Location, type, true); + if (settings.locationMove != null && typeof (settings.locationMove) == "function") { + settings.locationMove(map, location); + } + }); + + google.maps.event.addListener(location.Overlay, 'mouseover', function () { + if (type == google.maps.drawing.OverlayType.MARKER) { + if (location.HoverIcon && location.HoverIcon != 'none' && location.HoverIcon != null && location.HoverIcon != "") { + location.Overlay.setIcon(settings.markerPinsPath + location.HoverIcon); + } + } + }); + + google.maps.event.addListener(location.Overlay, 'mouseout', function () { + if (type == google.maps.drawing.OverlayType.MARKER) { + if (location.Icon != "default" && location.Icon != null && location.Icon != "") { + location.Overlay.setIcon(settings.markerPinsPath + location.Icon); + } + else { + location.Overlay.setIcon(null); + } + } + }); + + google.maps.event.addListener(location.Overlay, 'click', function () { + if (!arePopupTemplatesLoaded() && settings.editMode) { + return; + } + if (map.infoWindow != null) { + map.infoWindow.close(); + map.activeLocation = null; + } + for (i = 0; i < map.locations.length; i++) { + map.locations[i].Overlay.set("editable", false); + } + location.Overlay.set("editable", settings.editMode); + map.infoWindow = new google.maps.InfoWindow(); + map.activeLocation = location; + google.maps.event.addListener(map.infoWindow, 'closeclick', function () { + handleMapCloseClick(map, type); + }); + + var position = null; + var contentObj = null; + switch (type) { + case google.maps.drawing.OverlayType.MARKER: + position = location.Overlay.position; + contentObj = $('
').append(popupTemplateMarker); + if (!settings.richtextEditor) { + contentObj.find("textarea").removeClass("richtext-fix"); + } + break; + case google.maps.drawing.OverlayType.CIRCLE: + position = location.Overlay.getCenter(); + contentObj = $('
').append(popupTemplateCircle); + if (!settings.richtextEditor) { + contentObj.find("textarea").removeClass("richtext-fix"); + } + break; + case google.maps.drawing.OverlayType.POLYLINE: + position = getPolyLineCenter(location.Overlay); + contentObj = $('
').append(popupTemplatePolyline); + if (!settings.richtextEditor) { + contentObj.find("textarea").removeClass("richtext-fix"); + } + + break; + case google.maps.drawing.OverlayType.POLYGON: + position = getPolygonCenter(location.Overlay); + contentObj = $('
').append(popupTemplatePolygon); + if (!settings.richtextEditor) { + contentObj.find("textarea").removeClass("richtext-fix"); + } + + break; + case google.maps.drawing.OverlayType.RECTANGLE: + position = location.Overlay.getBounds().getCenter(); + contentObj = $('
').append(popupTemplateRectangle); + if (!settings.richtextEditor) { + contentObj.find("textarea").removeClass("richtext-fix"); + } + break; + } + if (contentObj != null && settings.editMode) { + map.infoWindow.setContent(contentObj.html()); + } + else { + map.infoWindow.setContent($("
").append($("
", { class: "popup-message" }).html(location.Message)).html()); + } + + google.maps.event.addListener(map.infoWindow, 'domready', function () { + $(map.container).find('.popup-content textarea').val(map.activeLocation.Message); + $(map.container).find('.popup-content input[name="locationLat"]').val(position.lat()); + $(map.container).find('.popup-content input[name="locationLng"]').val(position.lng()); + $(map.container).find('.popup-content input[name="centerLat"]').val(position.lat()); + $(map.container).find('.popup-content input[name="centerLng"]').val(position.lng()); + $(map.container).find('.popup-content input[name="borderWidth"]').val(location.BorderWeight); + $(map.container).find('.popup-content input[name="radius"]').val(location.Radius); + var markerIconsList = $(map.container).find('.popup-content select[name="icon"]'); + if (markerIconsList.length > 0 && settings.markerPinFiles.length > 0) { + for (i = 0; i < settings.markerPinFiles.length; i++) { + markerIconsList.append($('