From b241e8f22dd5807b3e4c23bc315a3cae66c0a341 Mon Sep 17 00:00:00 2001
From: Armand Bahi <armand.bahi@veremes.com>
Date: Wed, 28 Nov 2018 17:14:16 +0100
Subject: [PATCH] Squashed 'src/module_vmap/' changes from 467dfde..80ac33f
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

80ac33f Merge commit 'fd56b08b8c950792b890153c9cbb0c52ff283156'
b22d59b Merge commit 'ec0e1587c956e5208a1cd8362faa7178b3239d35'
ccc6bad Merge commit '1ec099860736b22d950437bf3b2392b94c419399'
4337084 pull module_cadastre app_vmap
81d0990 Squashed 'src/module_cadastre/' changes from 0c12f3e..a93f105
1906a37 pull module_cadastreV2 app_vmap
3885f26 Squashed 'src/module_cadastreV2/' changes from 5719ef4..fd56b08
9321087 pull module_anc app_vmap
7ed582e Squashed 'src/module_anc/' changes from 5ef8a76..ec0e158
b10f89f pull module_vm4ms app_vmap
9f5589a Squashed 'src/module_vm4ms/' changes from f42f310..2584bed
c051af2 pull module_vmap app_vmap
1ec0998 pull module_cadastre app_vmap
da832bf pull module_cadastre app_vmap
354c254 Squashed 'src/module_cadastre/' changes from 0c12f3e..a93f105
3b55bb7 pull module_cadastreV2 app_vmap
9859fc5 pull module_cadastreV2 app_vmap
9980c4b Squashed 'src/module_cadastreV2/' changes from 5719ef4..fd56b08
d0709ee pull module_anc app_vmap
b60f114 pull module_anc app_vmap
7ea9ae5 Squashed 'src/module_anc/' changes from 5ef8a76..ec0e158
4572afd pull module_vm4ms app_vmap
8919d3a pull module_vm4ms app_vmap
c73d204 Squashed 'src/module_vm4ms/' changes from f42f310..2584bed
bb37cbd pull module_vmap app_vmap
6de6c80 pull module_vmap app_vmap
1629e86 Squashed 'src/module_vmap/' changes from 467dfde..83c6b67
f14cfe3 Merge branch 'next_version' Conflicts: 	src/module_vmap/module/css/vmap.less 	src/module_vmap/module/template/layers/mapmodal/maplistlitle.html
d8339ea Merge branch 'next_version' Conflicts: 	src/module_vmap/module/css/vmap.less 	src/module_vmap/module/template/layers/mapmodal/maplistlitle.html
579f292 Fenêtres comparaison et choix de la carte en cours de même largeur
a1a294c Fenêtres comparaison et choix de la carte en cours de même largeur
fd56b08 Merge commit 'a93f105b814cad44ec1deb72ffc1d192bd2d3720'
ec0e158 Merge commit 'a93f105b814cad44ec1deb72ffc1d192bd2d3720'
bc6b534 Merge commit 'a93f105b814cad44ec1deb72ffc1d192bd2d3720'
83c6b67 Merge commit 'a93f105b814cad44ec1deb72ffc1d192bd2d3720'
c9af259 Merge commit 'a93f105b814cad44ec1deb72ffc1d192bd2d3720'
aed57e2 Merge commit '28ac2839fb933147caffe3294df25cc077e41f09'
7ef2ebb Merge commit '28ac2839fb933147caffe3294df25cc077e41f09'
1a0869b Merge commit '28ac2839fb933147caffe3294df25cc077e41f09'
5f38bc7 Merge commit '28ac2839fb933147caffe3294df25cc077e41f09'
13db2f0 Merge commit 'a77c66ec67579160da021bc5521dbc54b5154855'
409c646 Merge commit 'a77c66ec67579160da021bc5521dbc54b5154855'
1e6f02d Merge commit 'a77c66ec67579160da021bc5521dbc54b5154855'
2285d70 Merge commit '9ec6a9125359a496524c3105307946a63760da3c'
749ee86 Merge commit '9ec6a9125359a496524c3105307946a63760da3c'
88027f6 Merge commit '9ec6a9125359a496524c3105307946a63760da3c'
bd5282c Merge commit '95760f8e8037d121ac0f9f2b0538fae428a775cb'
1b5b20c Merge commit '95760f8e8037d121ac0f9f2b0538fae428a775cb'
cff3af6 Merge commit 'da1ad0ef3177ff6f6fad5bb9265e11bff6f24cfd'
28ac283 Merge branch 'next_version'
a93f105 Merge branch 'next_version'
a77c66e Merge branch 'next_version'
9ec6a91 Merge branch 'next_version'
95760f8 Merge branch 'next_version'
da1ad0e Merge branch 'next_version'
1d29955 Merge branch 'next_version'
55872db Merge branch 'master' into next_version
66eb03a Merge branch 'next_version'
de931bc Merge branch 'next_version'
38a75ca Merge branch 'master'
2f9770d Merge branch 'master'
9281372 Merge branch 'master'
78a6c62 Merge branch 'master'
0d5dda2 Merge branch 'master'
642ae49 Merge branch 'master'
bf88027 Merge branch 'master' into 'app_vmap'
17aa49c Merge module_cadastreV2
4188d1e Merge module_cadastreV2
3112a2e Merge module_cadastreV2
f6ff85d Merge module_cadastreV2
4dabc71 Merge module_cadastreV2
58a1439 Merge module_cadastreV2
778f28d Merge module_cadastreV2
050f823 Merge commit '1c340f7e20dcc41486d29c6812d09e057081a836'
f7b6381 Merge commit '1c340f7e20dcc41486d29c6812d09e057081a836'
64e0916 Merge commit '1c340f7e20dcc41486d29c6812d09e057081a836'
755fd34 Merge commit '1c340f7e20dcc41486d29c6812d09e057081a836'
6db663e Merge commit '1c340f7e20dcc41486d29c6812d09e057081a836'
a2957b7 Merge commit '1c340f7e20dcc41486d29c6812d09e057081a836'
1044e68 Merge commit '68cd71305b96656d4b4fc2e3d2ca08654e5302d2'
19df232 Merge commit '68cd71305b96656d4b4fc2e3d2ca08654e5302d2'
7100bf0 Merge commit '68cd71305b96656d4b4fc2e3d2ca08654e5302d2'
86cfabb Merge commit '68cd71305b96656d4b4fc2e3d2ca08654e5302d2'
a1d7358 Merge commit '68cd71305b96656d4b4fc2e3d2ca08654e5302d2'
26e216c Merge commit 'af1a2e367201c4fb79711aa447459366b1075d68'
a86b0f3 Merge commit 'af1a2e367201c4fb79711aa447459366b1075d68'
fccff4b Merge commit 'af1a2e367201c4fb79711aa447459366b1075d68'
041b403 Merge commit 'af1a2e367201c4fb79711aa447459366b1075d68'
749f5d1 Merge commit '348d59b718cb686ea85648f78376400ae15ccbdb'
a17c1f4 Merge commit '348d59b718cb686ea85648f78376400ae15ccbdb'
fb5f021 Merge commit '348d59b718cb686ea85648f78376400ae15ccbdb'
52b157e Merge commit '4398b26d4ab4082f226a08bea5e3d581bb18e730'
0f812bb Merge commit '4398b26d4ab4082f226a08bea5e3d581bb18e730'
a207eb3 Merge branch 'master' into next_version
34a7be7 Rename changelog files
4495e50 Add changelogs from 2017.03.00
7305e1c Merge branch 'ArmandBahi-master-patch-41794' into 'master'
c23b994 Update README.md
12d49b7 Merge branch 'patch-1' into 'master'
7841a8f Add license
f1cb96c Merge branch 'evolution/27-affiner-l-interface-quand-on-utilise-le-mode-public' into 'next_version'
389330a Ne pas afficher la barre de gauche si le seul outil est vMap
2e6f335 Affichage des outils en fonction des properties
63c138d Affichage des outils en fonction des properties
eead76d Merge commit 'a029100abdec58c0e3d867d8f05e12684fc3559f' into next_version
a1c50ec Merge commit 'a029100abdec58c0e3d867d8f05e12684fc3559f' into next_version
598c1c3 Merge commit 'c16511be80512da3bed7d4583cc5f73322dd6b34' into next_version
9fb7d98 Merge commit 'c16511be80512da3bed7d4583cc5f73322dd6b34' into next_version
95e4699 Merge commit 'f80d1266b063cb7c0efe13aefae1cafb626de02a' into next_version
270b8fe Merge commit 'f80d1266b063cb7c0efe13aefae1cafb626de02a' into next_version
9043c29 Merge commit '6ecf0ac4cd5cd175aa53ba1389698d45a3861f9c' into next_version
d5b7446 Merge commit '6ecf0ac4cd5cd175aa53ba1389698d45a3861f9c' into next_version
3de06dd Merge commit '0d2fdec84a386c64375551ce353118496a196f32' into next_version
99a2138 Merge commit '0d2fdec84a386c64375551ce353118496a196f32' into next_version
1694077 Bug déformation carte imprimée
2f74408 Bug déformation carte imprimée
772b3e0 Bug impressions comparaison : scope.compare_mode not interpreted
d2547fb Bug impressions comparaison : scope.compare_mode not interpreted
a029100 Merge commit 'ec64b461a62c43778b0b90ceaa8510cbeda39f69' into next_version
c16511b Merge commit 'ec64b461a62c43778b0b90ceaa8510cbeda39f69' into next_version
f80d126 Merge commit 'ec64b461a62c43778b0b90ceaa8510cbeda39f69' into next_version
6ecf0ac Merge commit 'ec64b461a62c43778b0b90ceaa8510cbeda39f69' into next_version
0d2fdec Merge commit 'ec64b461a62c43778b0b90ceaa8510cbeda39f69' into next_version
acd3d63 Merge commit '5719ef4911831174916e5eae65722a3d86daa11e' into next_version
9795f56 Merge commit '5719ef4911831174916e5eae65722a3d86daa11e' into next_version
63499f5 Merge commit '5719ef4911831174916e5eae65722a3d86daa11e' into next_version
c465203 Merge commit '5719ef4911831174916e5eae65722a3d86daa11e' into next_version
6d5b584 Merge commit 'a3e5d1d36229f1107457d86efd2f9519ee5a64c9' into next_version
a7af232 Merge commit 'a3e5d1d36229f1107457d86efd2f9519ee5a64c9' into next_version
5778862 Merge commit 'a3e5d1d36229f1107457d86efd2f9519ee5a64c9' into next_version
5171052 Merge commit '6a0b53eff0642da887fbeb552b02ea44cb7f823f' into next_version
85c53a9 Merge commit '6a0b53eff0642da887fbeb552b02ea44cb7f823f' into next_version
f179ee2 Resolve confilct
305e5c4 Resolve icons conflict
da914e9 Icone lien pour generateur url
aea547e Icone lien pour generateur url
c8a8513 Icone lien pour generateur url
6ec51b8 Merge branch 'evolution/26-generateur-d-url-pour-bo' into 'next_version'
b0861e7 Merge branch 'master' into next_version
2931553 Update gitignore
00e7059 Générateur d'url pour BO
ca25008 Générateur d'url pour BO
f50859e Merge branch 'master' into next_version
e89feac Remove squash from subtrees utils
b443f83 Merge branch 'master' into next_version
01783af Remove closure from gitignore
16b1d8d Revert "pull subtree"
c34ae8c Revert "pull subtree"
8a1d545 Squashed 'src/module_cadastreV2/' changes from 0c12f3e1a..5719ef491
ec64b46 pull subtree
a3e5d1d pull subtree
6a0b53e pull subtree
9c324c8 pull subtree
3ce4602 pull subtree
ab49657 pull subtree
b58c399 Squashed 'src/module_anc/' changes from 0c12f3e1a..5ef8a7624
2234695 pull subtree
b93971d pull subtree
28fc805 pull subtree
209350d pull subtree
1a650d5 pull subtree
2f788ee Squashed 'src/module_vm4ms/' changes from 0c12f3e1a..f42f31011
b5bafcb pull subtree
6a13d9e pull subtree
4bb796b pull subtree
ee4f9a2 pull subtree
06b33c8 Squashed 'src/module_vmap/' changes from 0c12f3e1a..467dfde8f
d140371 pull subtree
5a4861e pull subtree
504d372 pull subtree
d640dd3 pull subtree
94d96d8 pull subtree
2e13329 pull subtree
93d178f pull subtree
4e0e577 Squashed 'src/vitis/' changes from 940a5919d..ad685c897
81d25f3 pull subtree
5719ef4 Merge branch 'master' into next_app_vmap
101fad2 Merge branch 'master' into app_vmap
04012fb Remove gitignore
d06ee42 Merge branch 'next_version' into next_app_vmap
beccf8f Merge branch 'master' into next_version
1c5454e Merge branch 'master' into app_vmap
80c027e Merge branch 'app_vmap'
cef5535 Merge branch 'next_app_vmap' into next_version
0c12f3e Merge branch 'next_version' into next_app_vmap
db17bf5 Remove gitignore
c6890c6 Merge branch 'next_app_vmap' into next_version
1f972d0 Merge branch 'bug/24-url-exporter-ne-fonctionne-pas-si-le-mode-carto-n-est-pas-le-premier-de-l-application' into 'next_version'
2761aec Merge branch 'pre_prod' into next_version
c7dc5dc Merge branch 'evolution/2-mode-comparaison-2' into 'pre_prod'
2940c73 Alignement de la projecction de la carte comparée
04a28c5 JS doc
9433179 Ajout de la proj de la carte en comparaison
d625dde Syntaxe
42ca573 Ajout du nom de la carte en comparaison
50654dc Correction Recharge légende quand on affiche/cache un service de la carte compare
50b5ed2 Ajout de compare_mode dans le scope
e79d29d Comparaison impressions légende
7b74027 Mise au propre
a46fa1f Correction problème redimentionnement
ba1c14d Comparaison sur la fenêtre légende
051f186 Comparaison sur la fenêtre Jeux de données
2a7c2ee Ajout onglets (visu uniquement)
c662099 L'url ouvre l'application sur le mode Carto
5ef8a76 Merge branch 'pre_prod' into evolution/2-mode-comparaison-2
f42f310 Merge branch 'pre_prod' into evolution/2-mode-comparaison-2
d48cfcb Merge branch 'pre_prod' into evolution/2-mode-comparaison-2
9862a97 Remove gitignore
e76c445 make push_subtrees.sh executable
9752b76 pull subtree
ec4141b Squashed 'src/module_vmap/' changes from fb263937..f081e696
ad685c8 Merge branch 'next_version' into 'next_app_vmap'
4a400f1 Merge branch 'next_app_dtnet' into 'next_version'
dc9e09b Merge branch 'next_app_vmap' into 'next_version'
ed3718e Next app vmap
6909aee Correctif sur la concaténation de filtres
1e0dea6 Merge branch 'next_version' into 'master'
68d6ee1 Retouche attribut comparator sur les formulaires de filtres
ede9aab Add changelog
bda76d6 Amélioration forlulaire objet métier fix #9
ffc2d35 Agrandissement du bouton comparaison
a9e1f33 [zoom suivant precedent] Dysfonctionnement quand on ouvre les volets latéraux fix #23
2999a93 Supprression des contrôles de la carte de droite fix 22
bc4640e Utilisation de deux champs au lieu d'une checkbox pour la génération des liens dans le mode vMap. fix #21
3493d34 Amélioration de la synchronisation des cartes de comparaison Fix #20
1eeee25 fix #17 image objet metier affiche bouton upload
6ef5abb fix #17 image objet metier affiche bouton upload
77cbfb3 Calcul des superpositions en update Fix #18
ee85f80 fix url uthentification problems Closes #19
5e1ed3c fix url uthentification problems Closes #19
85bb73a Correction problèmes de chargement JS des sous formulaires
1aa1cae Correction problèmes de chargement JS des sous formulaires
a74a2a9 pull subtree
cb63318 pull subtree
dfd4bcb pull subtree
613ccca pull subtree
dbebb83 pull subtree
71144e8 pull subtree
181cdba pull subtree
51b130e pull subtree
3868e82 pull subtree
4d555e3 pull subtree
5b7a107 pull subtree
a937f6d pull subtree
112cdb5 pull subtree
b9ae980 pull subtree
1ad7328 pull subtree
401609c pull subtree
108289c pull subtree
4f5cf22 pull subtree
56346bc pull subtree
116e021 Squashed 'src/module_vmap/' changes from 66dbfede..2b3157a0
30d983f Squashed 'src/vitis/' changes from 4398b26d..940a5919
bf01f32 pull subtree
5e6139f pull subtree
93f3d98 Make push_subtrees runnable
bc664f7 Revert "pull subtree"
f002069 Correction problèmes chargement JS sous formulaires
9e8f5c6 Correction problèmes chargement JS sous formulaires
e999a18 update colonne version pour accepter les version de plus de 10 caractères
4402a3b update colonne version pour accepter les version de plus de 10 caractères
ca49780 update colonne version pour accepter les version de plus de 10 caractères
115665f Remove parasit files
3a3fe5d Remove parasit files
07f786f update colonne version pour accepter les version de plus de 10 caractères
1c87936 update colonne version pour accepter les version de plus de 10 caractères
1dd6eeb Merge branch 'next_version' into 'pre_prod'
5883a49 Merge branch 'master' into 'next_version'
7f7f902 Merge branch 'master' into 'next_version'
c2776a8 Merge remote-tracking branch 'origin/next_version' into next_version
0b735ab Merge remote-tracking branch 'origin/next_version' into next_version
65aa29c Interface générateur d'URL
f29a96e Review Checkbox CSS
e85ab01 Review Checkbox CSS
f4a1833 Review Checkbox CSS
01d51fa Review Checkbox CSS
bdae653 Merge branch 'evolution/2-mode-comparaison-2' into 'next_version'
d65f119 Resolve "mode comparaison"
d45e75d Interface checkbox
1d9f88d interface liste cartes comparaison
847e66e Amélioration performances
f9f4d2c fix problemes coef resolution
233ea36 fix problèmes boutons blockage zone impression
68392db css curseur comparaison
ae74ba2 Bouton de comparaison blanc quand la fonctionnalité est activée
1ccb1a8 Mise à l'échelle lors du chargement de la carte
f940d51 Correction erreur de compilation sur impression et erreur si élément non présent dans l'impression
b3684eb Merge branch 'evolution/9-ajouter-les-listes-deroulantes-au-formulaire-objet-metier' into 'next_version'
fb8adf6 Ajout de listes déroulantes au formulaire objet métier
7382c53 Correction Zoom et déformation d'étendue
ce3bb9c Resolve "[Studio] suppressions des différents formulaires"
3154da3 Merge branch 'evolution/studio-suppression-des-formulaires' into 'next_version'
4b3c71d Resolve "[Studio] suppressions des différents formulaires"
eb48d02 Reset src/module_cadastre
93a4ba8 Reset src/module_cadastre
69a7f28 Utilisation de l'étendue pour la synchronisation
40e7d46 pull subtree
dce9cac Merge branch 'bug/5-contraintes-d-urbanisme-remontees-pour-une-parcelle-limitrophe-entre-deux-communes-mauvaise-numerisation' into 'master'
7e14e88 Ajout propertie intersect_id_com pour utiliser un filtre id_com en plus de l'intersection
8a44aec Ajout propertie intersect_id_com pour utiliser un filtre id_com en plus de l'intersection
68214db Update crontab.txt - Changement nom balise
a8607fc Merge branch 'bug/4-problemes-lors-qu-un-utilisateur-vmap_admin-et-non-vitis_admin-va-dans-le-mode-configuration' into 'master'
a366275 Non affichage du mode configuration pour les utilisateurs vmap_admin
6bdd6f9 retrait console.log et code commenté
ed20c32 Merge remote-tracking branch 'origin/next_version' into evolution/2-mode-comparaison-2
10e6f9c Ajout de la fonctionnalitée d'impression sur la carte de comparaison
32fd687 Généralisation de la classe Printbox
ceac048 Merge branch 'evolution/7-calculs-de-polygones-jointifs' into 'next_version'
771a565 Merge branch 'Sebastien-master-patch-58096' into 'master'
eb1594e Synchronisation
7d3a986 Prettify code
0e53ade Nommage & affichage
500f524 Instanciation du composant Map pour la comparaison et synchro avec le composant classique
aee4451 Ajout calcul de polygones jointifs en mode update
3a3c236 correction syntaxe
8fcd4c0 Limite le calcul des polygones jointifs aux types polygon, multipolygon, geometry, geometrycollection
7f4401b Ajout des fonctions de calcul de polygones jointifs
815cedc Add diff_geometry request
40fce0a Retouche pour séparer la vue principale en deux
0974ddb Retouche du sélécteur de carte pour la carte de comparaison
af13d1c Ajout de l'outils dans Basictools
0eb3260 Avoid intersections interface
14af3a5 Edit snapping modal title
594f0c3 Add right-click to termine drawing
f2ffb07 Add right-click to termine drawing
05c763b Add right-click to termine drawing
a05e0fd Add right-click to termine drawing
914a1b6 pull subtree
c88aa58 Merge remote-tracking branch 'origin/next_version' into evolution/2-mode-comparaison-2
4cbf5a6 Merge branch 'master'
940a591 Merge branch 'cherry-pick-4398b26d' into 'next_version'
622dea6 Merge branch 'bug/4-formreader-champs-date-non-pris-en-compte-si-on-met-la-date-du-jour-en-insertion' into 'master'
4398b26 Merge branch 'bug/4-formreader-champs-date-non-pris-en-compte-si-on-met-la-date-du-jour-en-insertion' into 'master'
d17933b Edit datetime picker event
b3b6ec0 Merge branch '1-js-sous-formulaire' into 'master'
41a1553 Load BO Javascript on subforms
4f3da34 Merge branch 'master' into 'next_version'
e3923b1 Merge branch 'feature/impressions_144dpi' into 'master'
38bafaf Increase the WMS symbols size to match resolution
431529f Merge branch 'master' into 'next_version'
3516369 Merge branch 'hotfix/swagger_doc' into 'master'
275422b Make swagger work for dev installs
064924e Mise à jour du fichier de version pour fonctionnait avec la version 11.0 de PostgreSQL
ee4da38 Add gitignore
f53e707 Merge branch 'master' of gitlab.veremes.net:Development/vitis_apps/sources/vitis
6c984be Add client/vas dependencies
1c340f7 pull subtree
895d7e3 pull subtree
12a22d7 pull subtree
7b55e67 Utilisation de dirname($_SERVER['SCRIPT_FILENAME']) au dlieu de __DIR__
24ea0f3 pull subtree
f4326e8 Squashed 'src/module_vm4ms/' changes from 4d95a3da..af1a2e36
68cd713 Merge branch 'master' of gitlab.veremes.net:Development/vitis_apps/application/vmap
af1a2e3 Merge branch 'master' of gitlab.veremes.net:Development/vitis_apps/application/vmap
258a417 Modify symlinks strategy
6acd8ed Modify symlinks strategy
1b6864e add subtree
8bb3577 add subtree
4d95a3d add subtree
df88c95 Squashed 'src/module_cadastre/' content from commit 0bb9b2fa9
cbd47c2 Squashed 'src/module_cadastre/' content from commit 0bb9b2fa9
a77b5d1 Squashed 'src/module_cadastre/' content from commit 0bb9b2fa9
32487f9 add subtree
cc0df5e add subtree
d661316 add subtree
16f9769 Merge branch 'master' into next_version
b442386 Merge branch 'master' into next_version
24e0fb6 Merge branch 'master' into next_version
ad32c46 Merge branch 'master' of gitlab.veremes.net:Development/vitis_apps/sources/module_anc
8158b9a Resolve require problems
373ef42 Change __DIR__ by dirname($_SERVER['SCRIPT_FILENAME'])
e132804 Change __DIR__ by dirname($_SERVER['SCRIPT_FILENAME'])
4321adc Change __DIR__ by dirname($_SERVER['SCRIPT_FILENAME'])
7a1818a add subtree
6c1b3e3 Reset sources
a195a4d Init from SVN
4ad29c4 add subtree
1ac46cd Squashed 'src/closure/' content from commit 622066d
635a2f9 add subtree
7593c38 Squashed 'src/vitis/' content from commit 01d199c
b487cd6 Update from SVN
266e19a Initial commit
3adab3a gitignore
4f506db add gitignore
e678ee1 add gitignore
b55c5e8 add gitignore
01d199c Update from SVN
7780fca Update from SVN
8ac7a8b Update from SVN
df3f8eb Update from SVN
21f8928 gitignore
1d1dcfc gitignore
caaa168 gitignore
5674ba2 fixed untracked files
bc1486d fixed untracked files
80e8527 fixed untracked files
be58244 fixed untracked files
68af99b add subtree
28140b9 add subtree
0b81257 add subtree
ce1c22a add subtree
355b5f8 Update from SVN
ddd89b9 Update from SVN
4e05585 Update from SVN
1a7d90a Update from SVN
862099b Update from SVN
1f0d403 Update from SVN
519580a Update from SVN
7347d06 Update from SVN
015a4e7 Update from SVN
2feba72 Update from SVN
00cb90d Update from SVN
ab8db90 Update dependency.xml
3c167ff Ajout de la dépendance au schema cadastre
9b7aed8 Update dependency.xml
d374201 Update dependency.xml
80ef848 Update dependency.xml
8c49823 Divise les dependances client et vas pour apache
a7b754e Update _install/dependency.xml
0033955 Update dependency.xml
b03d7e5 Update dependency.xml
189e0e6 Update dependency.xml
3bf002c Update dependency.xml
2c489f9 Update dependency.xml
b05764f Update dependency.xml
54d83af Update dependency.xml
7743bd8 Update dependency.xml
ecf80b3 Update dependency.xml
700adff Change dependencies model
598189b Change dependencies model
87b86b4 Change dependencies model
ce4f3cc Change dependencies model
832eb3b Change dependencies model
12a17e1 Change dependencies model
a18be2f Chamge dependencies model
449fe8f Modification du titre
e3b4bf8 Update README.md

git-subtree-dir: src/module_vmap
git-subtree-split: 80ac33f902ac5bc6b9254f1411d4265969ac3c52
---
 module/css/vmap.less                          |  32 ++++-
 ...ration_vitis_configuration_vmapConfig.json |  91 +++++++++++---
 ...ap_business_object_vmap_business_object.js |   5 +
 ..._business_object_vmap_business_object.json |  38 ++++--
 module/javascript/app/vmap/map/mapcompare.js  |  49 +++++++-
 .../app/vmap/mapmanager/layerstree.js         |  48 ++++++++
 .../app/vmap/mapmanager/maplegend.js          |  38 +++++-
 .../app/vmap/mapmanager/mapmanager.js         |  10 +-
 module/javascript/app/vmap/tools/controls.js  |   6 +-
 module/javascript/app/vmap/tools/insert.js    |  20 ++-
 module/javascript/app/vmap/tools/location.js  |  19 ++-
 module/javascript/app/vmap/tools/print.js     | 111 +++++++++--------
 .../app/vmap/tools/select/basicselect.js      |  46 +++++++
 .../app/vmap/tools/select/select.js           |   8 +-
 .../javascript/app/vmap/tools/urlexporter.js  |  50 ++++----
 module/javascript/vitis/script_module.js      |  18 +++
 module/lang/lang-en.json                      |  43 +++++--
 module/lang/lang-fr.json                      |  45 +++++--
 module/template/layers/layertree.html         | 114 +++++++++++++++++-
 module/template/layers/maplegend.html         |  39 +++++-
 .../layers/mapmodal/maplistlitle.html         |   4 +-
 module/template/tools/basicselect.html        |   2 +-
 module/template/tools/basictools.html         |  16 +--
 module/template/tools/location.html           |  32 ++---
 module/template/tools/select.html             |   2 +-
 module/template/tools/urlexporter.html        |  32 ++---
 module/template/vmap.html                     |   2 +-
 web_service/conf/properties.inc               |   2 +
 28 files changed, 724 insertions(+), 198 deletions(-)

diff --git a/module/css/vmap.less b/module/css/vmap.less
index cc42f401..aa8dcb82 100644
--- a/module/css/vmap.less
+++ b/module/css/vmap.less
@@ -2432,9 +2432,39 @@ div.vmap-select-scale-alert{
 
 #basic-tools-dropdown-comapremode{
     margin: -10px -1px;
-    width: 30%;
     min-width: 450px;
     max-width: 550px;
     min-height: 55px;
     padding-top: 15px !important;
 }
+
+@media only screen and (max-width:1200px) {
+    #basic-tools-dropdown-comapremode {
+        width: 30%;
+    }
+}
+@media only screen and (min-width:1200px) {
+    #basic-tools-dropdown-comapremode {
+        width: 550px;
+    }
+}
+
+.basic-tools-element>span.icon-mirror {
+    font-size: 16px;
+    line-height: 0;
+}
+
+.layerstree-nav {
+    margin-left: 40px;
+}
+
+.layerstree-nav>li>a {
+    padding: 0px 15px;
+    border: 1px solid #8a8a8a !important;
+    color: #333;
+}
+
+.ol-current-projection-compare{
+    bottom: 29px;
+    margin-left: -16%;
+}
diff --git a/module/forms/configuration/configuration_vitis_configuration_vmapConfig.json b/module/forms/configuration/configuration_vitis_configuration_vmapConfig.json
index eed719d9..4304e139 100755
--- a/module/forms/configuration/configuration_vitis_configuration_vmapConfig.json
+++ b/module/forms/configuration/configuration_vitis_configuration_vmapConfig.json
@@ -1,21 +1,46 @@
 {
     "datasources": {
-        "datasource_1": {
+        "datasource_tools": {
             "type": "object",
             "dataType": "text",
             "name": "avaliable_controls",
             "description": "",
             "options": [
-                "FORM_TOOLS_ATTRIBUTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Attribution",
-                "FORM_TOOLS_MOUSE_POSITION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|MousePosition",
-                "FORM_TOOLS_CURRENT_PROJECTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|CurrentProjection",
-                "FORM_TOOLS_MAP_NAME_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|MapName",
-                "FORM_TOOLS_SCALE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Scale",
-                "FORM_TOOLS_SCALE_LINE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|ScaleLine",
-                "FORM_TOOLS_OVERVIEW_MAP_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|OverviewMap",
-                "FORM_TOOLS_ZOOM_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Zoom",
-                "FORM_TOOLS_ZOOM_SLIDER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|ZoomSlider",
-                "FORM_TOOLS_REFRESH_SOCKET_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|RefreshSocket"
+                "FORM_TOOLS_MAP_MANAGER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|MapManager",
+                "FORM_TOOLS_LOCATION_SEARCH_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|LocationSearch",
+                "FORM_TOOLS_LOCATION_HOME_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|LocationHome",
+                "FORM_TOOLS_LOCATION_REFRESH_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|LocationRefresh",
+                "FORM_TOOLS_LOCATION_MAX_EXTENT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|LocationMaxExtent",
+                "FORM_TOOLS_LOCATION_MY_POSITION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|LocationMyPosition",
+                "FORM_TOOLS_LOCATION_XY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|LocationXY",
+                "FORM_TOOLS_LOCATION_PREC_NEXT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|LocationPrecNext",
+                "FORM_TOOLS_URL_GENERATOR_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|URLGenerator",
+                "FORM_TOOLS_MAP_COMPARE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|MapCompare",
+                "FORM_TOOLS_MESURE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Mesure",
+                "FORM_TOOLS_SELECT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Select",
+                "FORM_TOOLS_ADVANCED_SELECT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|AdvancedSelect",
+                "FORM_TOOLS_INSERT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Insert",
+                "FORM_TOOLS_PRINT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Print",
+                "FORM_TOOLS_CONFIG_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Config",
+                "FORM_TOOLS_USER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|User"
+            ]
+        },
+        "datasource_controls": {
+            "type": "object",
+            "dataType": "text",
+            "name": "avaliable_controls",
+            "description": "",
+            "options": [
+                "FORM_CONTROLS_ATTRIBUTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Attribution",
+                "FORM_CONTROLS_MOUSE_POSITION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|MousePosition",
+                "FORM_CONTROLS_CURRENT_PROJECTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|CurrentProjection",
+                "FORM_CONTROLS_MAP_NAME_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|MapName",
+                "FORM_CONTROLS_SCALE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Scale",
+                "FORM_CONTROLS_SCALE_LINE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|ScaleLine",
+                "FORM_CONTROLS_OVERVIEW_MAP_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|OverviewMap",
+                "FORM_CONTROLS_ZOOM_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|Zoom",
+                "FORM_CONTROLS_ZOOM_SLIDER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|ZoomSlider",
+                "FORM_CONTROLS_REFRESH_SOCKET_CONFIGURATION_CONFIGURATION_VMAP_CONFIG|RefreshSocket"
             ]
         }
     },
@@ -252,19 +277,53 @@
                 "fields": [
                     {
                         "type": "double_select",
-                        "name": "controls.active_controls",
+                        "name": "controls.active_tools",
                         "label_from": "FORM_AVALIABLE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
                         "label_to": "FORM_ACTIVE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
                         "required": false,
                         "nb_cols": 12,
                         "size": 10,
-                        "id": "Element_0_1_1",
+                        "name_to": "controls.active_tools",
+                        "name_from": "controls.active_tool",
+                        "datasource": {
+                            "datasource_id": "datasource_tools"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "double_select",
+                        "name": "controls.public_active_tools",
+                        "label_from": "FORM_AVALIABLE_PUBLIC_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "label_to": "FORM_ACTIVE_PUBLIC_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "required": false,
+                        "nb_cols": 12,
+                        "size": 10,
+                        "name_to": "controls.public_active_tools",
+                        "name_from": "controls.public_active_tool",
+                        "datasource": {
+                            "datasource_id": "datasource_tools"
+                        }
+                    }
+                ]
+            },
+            {
+                "fields": [
+                    {
+                        "type": "double_select",
+                        "name": "controls.active_controls",
+                        "label_from": "FORM_AVALIABLE_CONTROLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "label_to": "FORM_ACTIVE_CONTROLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG",
+                        "required": false,
+                        "nb_cols": 12,
+                        "size": 10,
                         "name_to": "controls.active_controls",
                         "name_from": "controls.active_control",
                         "datasource": {
-                            "datasource_id": "datasource_1"
-                        },
-                        "id_from": "Element_0_1_1_from"
+                            "datasource_id": "datasource_controls"
+                        }
                     }
                 ]
             },
diff --git a/module/forms/vmap_business_object/vmap_business_object_vmap_business_object.js b/module/forms/vmap_business_object/vmap_business_object_vmap_business_object.js
index 80ce2724..6a1ab146 100644
--- a/module/forms/vmap_business_object/vmap_business_object_vmap_business_object.js
+++ b/module/forms/vmap_business_object/vmap_business_object_vmap_business_object.js
@@ -250,6 +250,11 @@ var oFormScope;
                         oFormValues['id_field']['options'] = aColumnsOptions;
                     }
                 }
+                if (angular.isDefined(oFormValues['sorted_by'])) {
+                    if (angular.isDefined(oFormValues['sorted_by']['options'])) {
+                        oFormValues['sorted_by']['options'] = aColumnsOptions;
+                    }
+                }
                 if (angular.isDefined(oFormValues['geom_column'])) {
                     if (angular.isDefined(oFormValues['geom_column']['options'])) {
                         oFormValues['geom_column']['options'] = aColumnsOptions;
diff --git a/module/forms/vmap_business_object/vmap_business_object_vmap_business_object.json b/module/forms/vmap_business_object/vmap_business_object_vmap_business_object.json
index 17dbe046..e0168f15 100644
--- a/module/forms/vmap_business_object/vmap_business_object_vmap_business_object.json
+++ b/module/forms/vmap_business_object/vmap_business_object_vmap_business_object.json
@@ -280,13 +280,24 @@
             },
             {
                 "fields": [{
-                        "type": "text",
+                        "type": "editable_select",
                         "name": "sorted_by",
                         "label": "FORM_SORTED_BY_DEVELOPMENT_0",
                         "required": false,
-                        "pattern": "",
-                        "nb_cols": 6,
-                        "id": "New_el_9_11_1"
+                        "nb_cols": 5
+                    }, {
+                        "type": "button",
+                        "class": "btn-group btn-group-sm margin-top-20",
+                        "nb_cols": 1,
+                        "buttons": [{
+                                "type": "button",
+                                "name": "table-datalist",
+                                "label": "FORM_SORTED_BY_DEVELOPMENT_0",
+                                "class": "btn-primary",
+                                "event": "loadVMapBoFormColumns()",
+                                "glyphicon": "refresh"
+                            }
+                        ]
                     }]
             },
             {
@@ -709,13 +720,24 @@
             },
             {
                 "fields": [{
-                        "type": "text",
+                        "type": "editable_select",
                         "name": "sorted_by",
                         "label": "FORM_SORTED_BY_DEVELOPMENT_0",
                         "required": false,
-                        "pattern": "",
-                        "nb_cols": 6,
-                        "id": "New_el_9_11_1"
+                        "nb_cols": 5
+                    }, {
+                        "type": "button",
+                        "class": "btn-group btn-group-sm margin-top-20",
+                        "nb_cols": 1,
+                        "buttons": [{
+                                "type": "button",
+                                "name": "table-datalist",
+                                "label": "FORM_SORTED_BY_DEVELOPMENT_0",
+                                "class": "btn-primary",
+                                "event": "loadVMapBoFormColumns()",
+                                "glyphicon": "refresh"
+                            }
+                        ]
                     }]
             },
             {
diff --git a/module/javascript/app/vmap/map/mapcompare.js b/module/javascript/app/vmap/map/mapcompare.js
index 4fdf3a75..b3304a3c 100644
--- a/module/javascript/app/vmap/map/mapcompare.js
+++ b/module/javascript/app/vmap/map/mapcompare.js
@@ -86,8 +86,15 @@ nsVmap.MapCompare = function () {
      * @private
      */
     this.vmapTooltip_ = {};
+
     // Ajoute les couches à reprojeter en cas de changement de carte dans layersToTransform_
     this.layersToTransform_ = [];
+
+    // Vide les controls par défaut
+    var controls = this.oOpenLayersMap_.getControls().getArray();
+    for (var i = 0; i < controls.length; i++) {
+        this.oOpenLayersMap_.removeControl(controls[i]);
+    }
 }
 
 /**
@@ -512,8 +519,10 @@ nsVmap.MapCompare.prototype.mapCompareController = function ($scope, $window, $e
             'size': this_.map.getSize(),
             'tileSize': tileSize
         });
+
         // Définit la vue de la carte
         this_.addView(olView_);
+
         // Définit les couches de la carte
         for (var i = 0; i < olLayers_.length; i++) {
             this_.addLayer(olLayers_[i]);
@@ -526,6 +535,12 @@ nsVmap.MapCompare.prototype.mapCompareController = function ($scope, $window, $e
         setTimeout(function () {
             this_.updateCompareScaleMap();
         });
+
+        // Affiche le nom de la carte
+        this_.displayMapName();
+
+        // Affiche le nom de la carte
+        this_.displayMapProj();
     })
 
     /**
@@ -577,7 +592,7 @@ nsVmap.MapCompare.prototype.mapCompareController.prototype.synchronizeMap = func
     var this_ = this;
 
     // Synchro Échelle
-    oVmap.getMap().getOLMap().getTargetElement().addEventListener('mouseenter', function(){
+    this_.map.getTargetElement().addEventListener('mouseleave', function(){
         oVmap.getMap().getOLMap().on("moveend", this_.updateCompareScaleMap, this_);
         this_.map.un("moveend", this_.updateScaleMap, this_);
     });
@@ -758,3 +773,35 @@ nsVmap.MapCompare.prototype.mapCompareController.prototype.addView = function (o
         });
     }
 };
+
+/**
+ * Display the map name tool
+ */
+nsVmap.MapCompare.prototype.mapCompareController.prototype.displayMapName = function () {
+    oVmap.log('nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.displayMapName');
+
+    if ($("#map-name-compare").length == 0) {
+        $('#olMapCompare').children().children('.ol-overlaycontainer-stopevent').append('<div class="ol-map-name ol-map-name-compare ol-unselectable"><span id="map-name-compare" class="ol-control"></span></div>');
+    }
+
+    var vMapCatalog = oVmap.getMapManager().getMapCatalog();
+    for (var i = 0; i < vMapCatalog['maps'].length; i++) {
+        if (vMapCatalog['maps'][i]['compare'] === true) {
+            var currentMapName = vMapCatalog['maps'][i]['name'];
+        }
+    }
+    $("#map-name-compare").html(currentMapName);
+}
+
+/**
+ * Display the map proj tool
+ */
+nsVmap.MapCompare.prototype.mapCompareController.prototype.displayMapProj = function () {
+    oVmap.log('nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.displayMapProj');
+
+    if ($("#current-projection-compare").length == 0) {
+        $('#olMapCompare').children().children('.ol-overlaycontainer-stopevent').append('<div class="ol-current-projection ol-unselectable ol-current-projection-compare"><span id="current-projection-compare" class="ol-control"></span></div>');
+    }
+
+    $("#current-projection-compare").html(oVmap['oProjections'][oVmap.getMapCompare().getOLMap().getView().getProjection().getCode()]);
+}
diff --git a/module/javascript/app/vmap/mapmanager/layerstree.js b/module/javascript/app/vmap/mapmanager/layerstree.js
index 673cb4e0..2a5fe743 100644
--- a/module/javascript/app/vmap/mapmanager/layerstree.js
+++ b/module/javascript/app/vmap/mapmanager/layerstree.js
@@ -117,6 +117,19 @@ nsVmap.nsMapManager.LayersTree.prototype.LayertreeController = function ($scope,
      */
     $scope['tree'] = oVmap.getMapManager().getLayersTree();
 
+
+    /**
+     * The map compare layersTree
+     * @type {object}
+     */
+    $scope['compareTree'] = {};
+
+
+    /**
+     * The active map
+     */
+    $scope['activeMap'] = 1;
+
     /**
      * The current properties
      */
@@ -194,6 +207,17 @@ nsVmap.nsMapManager.LayersTree.prototype.LayertreeController = function ($scope,
 };
 oVmap.module.controller('AppLayertreeController', nsVmap.nsMapManager.LayersTree.prototype.LayertreeController);
 
+/**
+ * Resize the layertools
+ */
+nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.resize = function () {
+    oVmap.log('nsVmap.nsMapManager.LayersTree.LayertreeController.resize');
+
+    setTimeout(function () {
+        oVmap.resizeLayerTools();
+    });
+}
+
 /**
  * Set a layer visible or not
  * @param {ol.layer.Base} olLayer
@@ -270,6 +294,8 @@ nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.setGroupV
     }
 
     this.memoriseGroupVisible(node);
+
+    oVmap['scope'].$broadcast('layersChanged');
 };
 
 /**
@@ -350,6 +376,14 @@ nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.reloadTre
     // relance le chargement des couches avec le nouvel arbre
     this.loadTree();
 
+    // Arbre pour la comparaison
+    if(this.scope_["$root"]["compare_enabled"]){
+        var oCompareTree = jQuery.extend(true, {}, oVmap.getMapManager().getCompareLayersTree());
+        this.scope_['compareTree'] = oCompareTree;
+    } else {
+        this.scope_['compareTree'] = {};
+    }
+
     oVmap.resizeLayerTools(false);
 };
 
@@ -638,6 +672,20 @@ nsVmap.nsMapManager.LayersTree.prototype.LayertreeController.prototype.closeLaye
             }
         }
     }
+
+    if (goog.isDefAndNotNull(this.scope_['compareTree'])) {
+        if (goog.isArray(this.scope_['compareTree']['children'])) {
+            for (var i = 0; i < this.scope_['compareTree']['children'].length; i++) {
+                if (goog.isDefAndNotNull(this.scope_['compareTree']['children'][i]['children'])) {
+                    for (var ii = 0; ii < this.scope_['compareTree']['children'][i]['children'].length; ii++) {
+                        if (goog.isDefAndNotNull(this.scope_['compareTree']['children'][i]['children'][ii]['olLayer'])) {
+                            this.scope_['compareTree']['children'][i]['children'][ii]['displayedMenu'] = false;
+                        }
+                    }
+                }
+            }
+        }
+    }
 };
 
 /**
diff --git a/module/javascript/app/vmap/mapmanager/maplegend.js b/module/javascript/app/vmap/mapmanager/maplegend.js
index 48d2e54e..c6759068 100644
--- a/module/javascript/app/vmap/mapmanager/maplegend.js
+++ b/module/javascript/app/vmap/mapmanager/maplegend.js
@@ -136,7 +136,17 @@ nsVmap.nsMapManager.MapLegend.prototype.maplegendController = function ($scope)
     /**
      * @private
      */
-    this['aUrls'] = [];
+    this['oUrls'] = {};
+
+    /**
+     * @private
+     */
+    this['oCompareUrls'] = {};
+
+    /**
+     * The active map
+     */
+    $scope['activeMap'] = 1;
 
     /**
      * Contains the events stocked by listenLayers()
@@ -158,6 +168,18 @@ nsVmap.nsMapManager.MapLegend.prototype.maplegendController = function ($scope)
     });
 };
 
+
+/**
+ * Resize the layertools
+ */
+nsVmap.nsMapManager.MapLegend.prototype.maplegendController.prototype.resize = function () {
+    oVmap.log('nsVmap.nsMapManager.MapLegend.maplegendController.resize');
+
+    setTimeout(function () {
+        oVmap.resizeLayerTools();
+    });
+}
+
 /**
  * Loads the legend
  * @export
@@ -165,18 +187,26 @@ nsVmap.nsMapManager.MapLegend.prototype.maplegendController = function ($scope)
 nsVmap.nsMapManager.MapLegend.prototype.maplegendController.prototype.loadLegend = function () {
     oVmap.log('nsVmap.nsMapManager.MapLegend.maplegendController.loadLegend');
 
-    this['oUrls'] = this.getLegendUrls();
+    this['oUrls'] = this.getLegendUrls(oVmap.getMap().getOLMap());
     this.downloadLegendImgs(this['oUrls']);
+
+    if(this.$scope_["$root"]["compare_enabled"]){
+        this['oCompareUrls'] = this.getLegendUrls(oVmap.getMapCompare().getOLMap());
+        this.downloadLegendImgs(this['oCompareUrls']);
+    } else {
+        this['oCompareUrls'] = {};
+    }
 };
 
 /**
  * Get the legend URLs
+ * @param {object} olMap
  * @returns {object}
  */
-nsVmap.nsMapManager.MapLegend.prototype.maplegendController.prototype.getLegendUrls = function () {
+nsVmap.nsMapManager.MapLegend.prototype.maplegendController.prototype.getLegendUrls = function (olMap) {
     oVmap.log('nsVmap.nsMapManager.MapLegend.maplegendController.getLegendUrls');
 
-    var aLayers = oVmap.getMap().getOLMap().getLayers().getArray();
+    var aLayers = olMap.getLayers().getArray();
     var oUrls = {};
 
     // Récupération des URL WMS
diff --git a/module/javascript/app/vmap/mapmanager/mapmanager.js b/module/javascript/app/vmap/mapmanager/mapmanager.js
index 13114d60..d42d368d 100644
--- a/module/javascript/app/vmap/mapmanager/mapmanager.js
+++ b/module/javascript/app/vmap/mapmanager/mapmanager.js
@@ -314,7 +314,7 @@ nsVmap.nsMapManager.MapManager.prototype.loadCompareMap = function (element) {
     var this_ = this;
     this_.getAjaxLayersTree(sUrl, function(oTree){
 
-        oVmap.log("oTree: ", oTree);
+        oVmap.log("oCompareTree: ", oTree);
 
         // Change la variable oLayersTree
         this_.setCompareLayersTree(oTree);
@@ -927,7 +927,7 @@ nsVmap.nsMapManager.MapManager.prototype.ajaxGetMapCatalog = function (sUrl) {
  * @return {object<LayersTree>}
  */
 nsVmap.nsMapManager.MapManager.prototype.getAjaxLayersTree = function (sUrl, callback) {
-    var LayersTree;
+    var oLayersTree;
 
     ajaxRequest({
         'method': 'GET',
@@ -937,11 +937,9 @@ nsVmap.nsMapManager.MapManager.prototype.getAjaxLayersTree = function (sUrl, cal
         'success': function (response) {
             var data = JSON.parse(response['data']);
             if (goog.isDef(data['mapjsons'])) {
-                LayersTree = data['mapjsons'][0];
+                oLayersTree = data['mapjsons'][0];
             }
-
-            oVmap.log(LayersTree);
-            callback.call(this, LayersTree);
+            callback.call(this, oLayersTree);
         }
     });
 };
diff --git a/module/javascript/app/vmap/tools/controls.js b/module/javascript/app/vmap/tools/controls.js
index 67b20e2e..6fee41a7 100755
--- a/module/javascript/app/vmap/tools/controls.js
+++ b/module/javascript/app/vmap/tools/controls.js
@@ -31,7 +31,7 @@ goog.require('ol.format.TopoJSON');
 /**
  * @classdesc
  * Class {@link nsVmap.nsToolsManager.Controls}: Add the controls defined in data/tools.json,
- * available : Attribution, FullScreen, MousePosition, OverviewMap, Rotate, ScaleLine, Zoom, ZoomSlider, 
+ * available : Attribution, FullScreen, MousePosition, OverviewMap, Rotate, ScaleLine, Zoom, ZoomSlider,
  * ZoomToExtent, CurrentProjection, DragAndDrop (GPX,GeoJSON,IGC,KML,TopoJSON)
  * @param {array} aControls Controls to set
  * @constructor
@@ -273,7 +273,7 @@ nsVmap.nsToolsManager.Controls.prototype.addControl = function (control) {
 /**
  * Toggle a control to the ol map
  * @param {string} control Control to toggle
- * @param {boolean} bActive 
+ * @param {boolean} bActive
  * @export
  */
 nsVmap.nsToolsManager.Controls.prototype.setToolActive = function (control, bActive) {
@@ -426,4 +426,4 @@ nsVmap.nsToolsManager.Controls.prototype.getOverviewMap = function () {
 
 // Définit la directive et le controller
 oVmap.module.directive('appControls', nsVmap.nsToolsManager.Controls.prototype.controlsDirective);
-oVmap.module.controller('AppControlsController', nsVmap.nsToolsManager.Controls.prototype.controlsController);
\ No newline at end of file
+oVmap.module.controller('AppControlsController', nsVmap.nsToolsManager.Controls.prototype.controlsController);
diff --git a/module/javascript/app/vmap/tools/insert.js b/module/javascript/app/vmap/tools/insert.js
index 456136bc..ce07b268 100644
--- a/module/javascript/app/vmap/tools/insert.js
+++ b/module/javascript/app/vmap/tools/insert.js
@@ -317,6 +317,19 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController = function ($scope,
     // Supprime du trou de la feature (si il existe) feature lors de la sélection sur l'interaction this.deleteHole_
     this.deleteHole_.on('select', this.deleteHole, this);
 
+    // Évite les superpositions à l'édition
+    this.modify_.on('modifyend', function (evt) {
+
+        // Récupère la feature ajoutée
+        var aFeatures = evt.features.getArray();
+
+        var j = 0;
+        for (var i = 0; i < aFeatures.length; i++) {
+            // Évite les superpositions avec les autres couches si besoin
+            this_.avoidSuperpositions(aFeatures[i]);
+        }
+    });
+
     // Lance updateInsertObjectFeature lors de chaque changement sur this.oOverlayFeatures_
     // si il n'y a pas eut de changements pendant 500ms
     var iTmpChanges = 0;
@@ -324,6 +337,7 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController = function ($scope,
 
         // Retire les anciennes features si on est pas en mode multi
         var sGeomType = $scope['oInsertObject']['sGeomType'];
+
         // Si il ne s'agit pas d'une géométrie multiple
         if (goog.isDefAndNotNull(sGeomType)) {
             if (sGeomType.substr(0, 5) !== 'MULTI' && sGeomType !== 'GEOMETRYCOLLECTION') {
@@ -1244,7 +1258,7 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.setDiffGeo
             this_.setDiffGeom_(aSuperpositionBos, olFeature, opt_options);
         }
     }, function(err){
-        console.error('Cannot get the diff geom: ', err)
+        console.error('Cannot get the diff geom: ', err);
     });
 
 }
@@ -1282,11 +1296,11 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.getDiffGeo
                 return 0;
             }
             if (!goog.isDefAndNotNull(response['data'][0])) {
-                deferred.reject('response.data[0] not defined');
+                deferred.resolve(sEWKTGeom);
                 return 0;
             }
             if (!goog.isDefAndNotNull(response['data'][0]['diff_geom'])) {
-                deferred.reject('response.data[0].diff_geom not defined');
+                deferred.resolve(sEWKTGeom);
                 return 0;
             }
             deferred.resolve(response['data'][0]['diff_geom']);
diff --git a/module/javascript/app/vmap/tools/location.js b/module/javascript/app/vmap/tools/location.js
index 4cd96440..415bd9cb 100644
--- a/module/javascript/app/vmap/tools/location.js
+++ b/module/javascript/app/vmap/tools/location.js
@@ -197,12 +197,25 @@ nsVmap.nsToolsManager.Location.prototype.locationController = function ($scope,
 
 	        fHistoryDelayHandler = $timeout(function () {
 	        	if(this_['iHistoryOffset'] === 0){
-	        		this_["aLocationHistory"].push({
+
+                    var oNewLocation = {
 		        		center: this_.map_.getView().getCenter(),
 		        		zoom: this_.map_.getView().getZoom()
-		    		});
+		    		}
+
+                    var oLastLocation = this_['aLocationHistory'][this_['aLocationHistory'].length - 1];
+
+                    if (this_['aLocationHistory'].length > 0) {
+                        if (oNewLocation.zoom === oLastLocation.zoom &&
+                            oNewLocation.center[0] === oLastLocation.center[0] &&
+                            oNewLocation.center[1] === oLastLocation.center[1]) {
+                            return 0;
+                        }
+                    }
+
+	        		this_["aLocationHistory"].push(oNewLocation);
 	        	} else {
-	        		// splice 
+	        		// splice
 	        		var iHistoryPosition = this_['aLocationHistory'].length - (this_['iHistoryOffset']);
 	        		this_["aLocationHistory"].splice(iHistoryPosition, this_['iHistoryOffset'], {
 		        		center: this_.map_.getView().getCenter(),
diff --git a/module/javascript/app/vmap/tools/print.js b/module/javascript/app/vmap/tools/print.js
index efc99e6a..f2d041ca 100644
--- a/module/javascript/app/vmap/tools/print.js
+++ b/module/javascript/app/vmap/tools/print.js
@@ -161,11 +161,23 @@ nsVmap.nsToolsManager.Print.prototype.printController = function ($timeout, $com
     this.template_;
 
     /**
-     * Size of the printZone
+     * Size of the map printZone
      * @private
      */
     this.printedMapSize_;
 
+    /**
+     * Size of the compare map printZone
+     * @private
+     */
+    this.printedCompareMapSize_;
+
+    /**
+     * Size of the overview map printZone
+     * @private
+     */
+    this.printedOverviewMapSize_;
+
     /**
      * this.printedMapSize_ resize coeff
      * @private
@@ -363,10 +375,10 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.loadModelParmas2
     oVmap.log('nsVmap.nsToolsManager.Print.printController.loadModelParmas2');
 
     // Récupère la taille de la carte this.printedMapSize_ ainsi que le coefficient this.resizeCoeff_
-    oPrintMapSize = this.getPrintedMapSize(this.template_);
+    this.printedMapSize_ = this.getPrintedMapSize(this.template_, '#map1', '#map_image');
+    this.printedOverviewMapSize_ = this.getPrintedMapSize(this.template_, '#map1', '#map_overview');
 
-    this.printedMapSize_ = oPrintMapSize.printedMapSize;
-    this.resizeCoeff_ = oPrintMapSize.resizeCoeff;
+    this.resizeCoeff_ = this.printedMapSize_.resizeCoeff;
 
     // Pré-rempli le champ "Résolution"
     this['resolution'] = this.resizeCoeff_;
@@ -375,26 +387,29 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.loadModelParmas2
     this['currentScale'] = oVmap.getMap().getPrettyScale(oVmap.getMap().getScale() / this.resizeCoeff_);
 
     // Dessine un carré d'impression à chaque mouvement de la carte
-    this.printBox_.setSize(this.printedMapSize_);
+    this.printBox_.setSize(this.printedMapSize_.printedMapSize);
     this.printBox_.show();
 
     if(this.$scope_["$root"]["compare_enabled"]){
-        this.oComparePrintMapSize = this.getPrintedMapSize(this.template_,"#map1Compare","#map_image_compare");
-        if(this.oComparePrintMapSize !== 0){
+        this.printedCompareMapSize_ = this.getPrintedMapSize(this.template_, "#map1Compare", "#map_image_compare");
+
+        if(this.printedCompareMapSize_ !== 0){
             // Pré-rempli le champ "Résolution"
-            this['resolutionCompare'] = this.oComparePrintMapSize.resizeCoeff;
+            this['resolutionCompare'] = this.printedCompareMapSize_.resizeCoeff;
 
             // Ajuste l'échelle avec le niveau de détail
-            this['currentScaleCompare'] = oVmap.getMapCompare().getPrettyScale(oVmap.getMapCompare().getScale() / this.oComparePrintMapSize.resizeCoeff);
+            this['currentScaleCompare'] = oVmap.getMapCompare().getPrettyScale(oVmap.getMapCompare().getScale() / this.printedCompareMapSize_.resizeCoeff);
 
             // Dessine un carré d'impression à chaque mouvement de la carte
-            this.printBoxCompare_.setSize(this.oComparePrintMapSize.printedMapSize);
+            this.printBoxCompare_.setSize(this.printedCompareMapSize_.printedMapSize);
             this.printBoxCompare_.show();
         } else {
             this.printBoxCompare_.hide();
         }
     }
 
+    // Supprime le template du body de Vmap
+    $(this.template_).remove();
 };
 
 /**
@@ -420,11 +435,18 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.setTemplate = fu
         });
     }
 
+    this.$scope_['compare_mode'] = this.$scope_["$root"]["compare_enabled"];
+
     if (goog.isDefAndNotNull(oModel['definition'])) {
         var template = document.createElement("div");
         template.innerHTML = oModel['definition'];
+
+        this.$compile_(template)(this.$scope_);
         this_.template_ = template;
-        callback.call(this, [template]);
+
+        setTimeout(function () {
+            callback.call(this_, [template]);
+        });
     }
 };
 
@@ -450,6 +472,8 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.getPrintedMapSiz
         return 0;
     }
 
+    oPrintScope = angular.element($(template).find(sPrintId)).scope();
+
     // Ajoute temporairement le template au body de Vmap
     $(template).addClass('print_template');
     $('body').append(template);
@@ -457,9 +481,6 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.getPrintedMapSiz
     var mapHeight = imageDiv.height();
     var mapWidth = imageDiv.width();
 
-    // Supprime le template du body de Vmap
-    $(template).remove();
-
     // Vérifie si la taille de la carte est suppérieur à la taille de l'écran
     var resizeCoeff = 1;
     var tmpWidth = angular.copy(mapWidth);
@@ -472,6 +493,7 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.getPrintedMapSiz
 
     return {
         printedMapSize: [mapWidth, mapHeight],
+        realSize: [imageDiv.width(), imageDiv.height()],
         resizeCoeff: resizeCoeff
     }
 };
@@ -575,7 +597,7 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.prepareAndLaunch
 
     // récupération des infos pour la carte de comparaison si le mode comparaison est actif
     if(this.$scope_['$root']["compare_enabled"]){
-        if(this.oComparePrintMapSize !== 0){
+        if(this.printedCompareMapSize_ !== 0){
             // Enregistre l'échelle actuelle
             this.currentScaleCompare_ = oVmap.getMapCompare().getScale({
                 'pretty': true
@@ -635,14 +657,22 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.print = function
     var printStyleId = opt_options.printStyleId;
 
     // Set includesJSON
-    var includesJson = JSON.stringify([{
+    var aIncludes = [{
             'target': '#map_legend',
-            'html': this_.getLegendTemplate()
-        }]);
+            'html': this_.getLegendTemplate('#maplegend')
+        }];
+    if(this.$scope_["$root"]["compare_enabled"]){
+        aIncludes.push({
+            'target': '#map_legend_compare',
+            'html': this_.getLegendTemplate('#compare_maplegend')
+        });
+    }
+    var includesJson = JSON.stringify(aIncludes);
 
     // Set scope
     var oPrintScope = goog.isDefAndNotNull(opt_options.scope) ? opt_options.scope : {};
     oPrintScope['date'] = goog.isDefAndNotNull(oPrintScope['date']) ? oPrintScope['date'] : today;
+    oPrintScope['compare_mode'] = this.$scope_["$root"]["compare_enabled"] === true ? true : false;
     var sScope = JSON.stringify(oPrintScope);
 
     // Ouvre la fenêtre d'impression
@@ -687,12 +717,9 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.print = function
             var sFormat = response['data']['data'][0]['rt_format_id'];
             var sOrientation = response['data']['data'][0]['rt_orientation_id'];
 
-            var template = document.createElement("div");
-            template.innerHTML = response['data']['data'][0]['definition'];
-
-            var mapImageSize = this_.getTemplateTargetSize(template, '#map_image');
-            var mapImageSizeCompare = this_.getTemplateTargetSize(template, '#map_image_compare');
-            var overviewSize = this_.getTemplateTargetSize(template, '#map_overview');
+            var mapImageSize = this_.printedMapSize_.realSize;
+            var mapImageSizeCompare = this_.printedCompareMapSize_.realSize;
+            var overviewSize = this_.printedOverviewMapSize_.realSize;
 
             var oJsonDefOptions = {
                 mapId: opt_options.mapId,
@@ -780,6 +807,10 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.print = function
     return 1;
 };
 
+/**
+ * Get the maps JSON defs
+ * @param  {object} opt_options
+ */
 nsVmap.nsToolsManager.Print.prototype.printController.prototype.getMapsJsonDef = function (opt_options) {
     oVmap.log('nsVmap.nsToolsManager.Print.prototype.printController.prototype.getMapsJsonDef');
 
@@ -899,40 +930,14 @@ nsVmap.nsToolsManager.Print.prototype.printController.prototype.getMapsJsonDef =
     return mapsJson;
 }
 
-/**
- * Get the size of a target in a template
- * @param {string} template
- * @param {string} target
- * @returns {Array<Number>|undefined}
- */
-nsVmap.nsToolsManager.Print.prototype.printController.prototype.getTemplateTargetSize = function (template, target) {
-
-    var targetDiv = $(template).find(target);
-
-    // Vérifie la présence de '#map_image'
-    if (!goog.isDef(targetDiv.get(0))) {
-        oVmap.log('Aucune balise ' + target + ' trouvée dans le template');
-        return undefined;
-    }
-
-    $('body').append(template);
-
-    var targetHeight = targetDiv.height();
-    var targetWidth = targetDiv.width();
-
-    // Supprime le template du body de Vmap
-    $(template).remove();
-
-    return [targetWidth, targetHeight];
-};
-
 /**
  * Get the html definition of the template with base64 images
+ * @param  {string} sTarget
  * @returns {String}
  */
-nsVmap.nsToolsManager.Print.prototype.printController.prototype.getLegendTemplate = function () {
+nsVmap.nsToolsManager.Print.prototype.printController.prototype.getLegendTemplate = function (sTarget) {
 
-    var template = $('#maplegend').clone();
+    var template = $(sTarget).clone();
 
     // Transforme les images en base64
     template.find('img').each(function (index) {
diff --git a/module/javascript/app/vmap/tools/select/basicselect.js b/module/javascript/app/vmap/tools/select/basicselect.js
index f8d0af3c..200baf00 100755
--- a/module/javascript/app/vmap/tools/select/basicselect.js
+++ b/module/javascript/app/vmap/tools/select/basicselect.js
@@ -542,6 +542,7 @@ nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.repl
 nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.displaySelectionPopup = function (aSelection, olPoint) {
     oVmap.log('nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.displaySelectionPopup');
 
+    var this_ = this;
     var scope = this.$scope_;
 
     for (var i = 0; i < aSelection.length; i++) {
@@ -659,6 +660,51 @@ nsVmap.nsToolsManager.BasicSelect.prototype.basicSelectController.prototype.disp
                 }
             });
         }
+
+        aSelection[i]['mapPopup'].addAction({
+            'content': '<span class="icon-link_url"></span> Lien vers cet objet' ,
+            'event': angular.bind(this, function(i){
+                scope.$apply(function () {
+                    // generate url for this object;
+                    var sUrl = this_['properties']['web_server_name'] + "/" + this_['properties']['application'];
+
+                    if (goog.isDefAndNotNull(this_['properties']['environment'])){
+                        if (this_['properties']['environment'] != ""){
+                            sUrl += "_" + this_['properties']['environment'];
+                        }
+                    }
+
+                    sUrl += "?mode_id=vmap&";
+
+                    var oMapCatalog = oVmap.getMapManager().getMapCatalog();
+                    var iMapId = oMapCatalog["maps"][oMapCatalog["usedMap"]]["map_id"];
+
+                    sUrl += "map_id=" + iMapId + "&";
+                    sUrl += "bo_id=" + aSelection[i]["bo_type"] + "&";
+                    sUrl += "ids=" + aSelection[i]["bo_id_value"];
+
+                    //copy url to clipboard
+                    var textArea = document.createElement("textarea");
+                    textArea.value = sUrl;
+                    document.body.appendChild(textArea);
+                    textArea.focus();
+                    textArea.select();
+
+                    try {
+                        var successful = document.execCommand('copy');
+                        if (successful){
+                            $.notify('L\'URL d\'accés à cette objet a été copié dans votre presse-papier : \n' + sUrl, 'success');
+                        } else {
+                            $.notify('L\'URL d\'accés à cette objet n\'a pas pu être copié dans votre presse-papier : \n' + sUrl, 'error');
+                        }
+                    } catch (err) {
+                        $.notify('L\'URL d\'accés à cette objet n\'a pas pu être copié dans votre presse-papier : \n' + sUrl, 'error');
+                        console.error('Fallback: Oops, unable to copy', err);
+                    }
+                    document.body.removeChild(textArea);
+                });
+            }, i)
+        });
     }
 
     // Ajoute les résultats
diff --git a/module/javascript/app/vmap/tools/select/select.js b/module/javascript/app/vmap/tools/select/select.js
index 9c89bc22..0944cee5 100755
--- a/module/javascript/app/vmap/tools/select/select.js
+++ b/module/javascript/app/vmap/tools/select/select.js
@@ -539,13 +539,14 @@ nsVmap.nsToolsManager.Select.prototype.selectController = function ($scope, $tim
         // Récupère la feature ajoutée
         var aFeatures = evt.features.getArray();
 
-        // Évite les superpositions avec les autres couches si besoin
         var j = 0;
         for (var i = 0; i < aFeatures.length; i++) {
+            // Évite les superpositions avec les autres couches si besoin
             this_.avoidSuperpositions(aFeatures[i]).then(function(){
                 j++;
                 if (!j < aFeatures.length) {
                     setTimeout(function () {
+                        // Enregistre les changements
                         this_.putFeaturesOnTheElement(this_.oOverlayFeatures_.getArray());
                     });
                 }
@@ -556,6 +557,7 @@ nsVmap.nsToolsManager.Select.prototype.selectController = function ($scope, $tim
         setTimeout(function () {
             if (j === 0) {
                 console.error('avoidSuperpositions never sents callback');
+                // Enregistre les changements
                 this_.putFeaturesOnTheElement(this_.oOverlayFeatures_.getArray());
             }
         }, 3000);
@@ -2332,11 +2334,11 @@ nsVmap.nsToolsManager.Select.prototype.selectController.prototype.getDiffGeom_ =
                 return 0;
             }
             if (!goog.isDefAndNotNull(response['data'][0])) {
-                deferred.reject('response.data[0] not defined');
+                deferred.resolve(sEWKTGeom);
                 return 0;
             }
             if (!goog.isDefAndNotNull(response['data'][0]['diff_geom'])) {
-                deferred.reject('response.data[0].diff_geom not defined');
+                deferred.resolve(sEWKTGeom);
                 return 0;
             }
             deferred.resolve(response['data'][0]['diff_geom']);
diff --git a/module/javascript/app/vmap/tools/urlexporter.js b/module/javascript/app/vmap/tools/urlexporter.js
index d89684f2..d531827e 100644
--- a/module/javascript/app/vmap/tools/urlexporter.js
+++ b/module/javascript/app/vmap/tools/urlexporter.js
@@ -68,35 +68,38 @@ nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController = function ($s
     /**
      * @type {string}
      */
-    this["urlToExport"] = "";
+    this["privateExportUrl"] = "";
+
     /**
-     * @type {boolean}
+     * @type {string}
      */
-    this["usePublicToken"] = false;
-
-    this["urlConstructor"]();
+    this["publicExportUrl"] = "";
 
     // recalcule l'url quand on change de carte
     oVmap['scope'].$on('mapChanged', function () {
-        this_["urlConstructor"]();
+        this_["privateExportUrl"] = this_.getExportUrl();
+        this_["publicExportUrl"] = this_.getExportUrl(true);
     });
 
-    $scope.$watch("ctrl.usePublicToken", function(){
-        this_["urlConstructor"]();
-    })
-
+    // recalcule l'url quand on bouge la  carte
     oVmap.getMap().getOLMap().on("moveend", function(event){
-        this_["urlConstructor"]();
+        this_["privateExportUrl"] = this_.getExportUrl();
+        this_["publicExportUrl"] = this_.getExportUrl(true);
     });
+
+    // Recalcule l'URL
+    this_["privateExportUrl"] = this_.getExportUrl();
+    this_["publicExportUrl"] = this_.getExportUrl(true);
 };
 
 /**
- * Display the user form in display mode
- * @returns {undefined}
+ * Generates and return the export URL
+ * @param  {boolean} bPublic
+ * @return {string}
  * @export
  */
-nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController.prototype.urlConstructor = function () {
-    oVmap.log("nsVmap.nsToolsManager.Urlexporter.urlExporterController.urlConstructor");
+nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController.prototype.getExportUrl = function (bPublic) {
+    oVmap.log("nsVmap.nsToolsManager.Urlexporter.urlExporterController.getExportUrl");
 
     var sUrl = this['properties']['web_server_name'] + "/" + this['properties']['application'];
 
@@ -106,7 +109,7 @@ nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController.prototype.urlC
         }
     }
 
-    sUrl += "?";
+    sUrl += "?mode_id=vmap&";
 
     var oMapCatalog = oVmap.getMapManager().getMapCatalog();
     var iMapId = oMapCatalog["maps"][oMapCatalog["usedMap"]]["map_id"];
@@ -114,7 +117,7 @@ nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController.prototype.urlC
     sUrl += "map_id=" + iMapId;
 
     // si public add token
-    if (this["usePublicToken"]){
+    if (bPublic === true){
         sUrl += "&token=" + this['properties']['public_token'];
     }
 
@@ -122,20 +125,23 @@ nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController.prototype.urlC
     var sExtent = oVmap.getMap().getOLMap().getView().calculateExtent(oVmap.getMap().getOLMap().getSize()).join("|");
     sUrl += "&extent=" + encodeURI(sExtent);
 
-    this["urlToExport"] = sUrl;
+    return sUrl;
 };
 
-
 /**
  * Copy the generated URL on the clipboard
- *
+ * @param  {boolean} bPublic
  * @export
  */
-nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController.prototype.copyUrl = function () {
+nsVmap.nsToolsManager.Urlexporter.prototype.urlExporterController.prototype.copyUrl = function (bPublic) {
     oVmap.log("nsVmap.nsToolsManager.Urlexporter.urlExporterController.copyUrl");
 
     /* Get the text field */
-    var copyText = document.getElementById("urlExporterField");
+    if (bPublic === true) {
+        var copyText = document.getElementById("publicExportUrlField");
+    } else {
+        var copyText = document.getElementById("privateExportUrlField");
+    }
 
     /* Select the text field */
     copyText.select();
diff --git a/module/javascript/vitis/script_module.js b/module/javascript/vitis/script_module.js
index 00d7bea3..d740803e 100644
--- a/module/javascript/vitis/script_module.js
+++ b/module/javascript/vitis/script_module.js
@@ -3607,4 +3607,22 @@ vitisApp.on('appMainDrtvLoaded', function () {
             "sMessage": "LIST_DELETE_CONFIRM_VMAP_BUSINESS_OBJECT"
         });
     };
+
+    /**
+     * Return true/false if the tool is avaliable for this user
+     * @param  {string} sTool
+     * @return {boolean}
+     */
+    angular.element(vitisApp.appMainDrtv).scope()["isVmapToolActive"] = function (sTool) {
+
+        var aTools;
+
+        if (propertiesSrvc['public_user']) {
+            aTools = propertiesSrvc['controls']['public_active_tools'].split('|');
+        } else {
+            aTools = propertiesSrvc['controls']['active_tools'].split('|');
+        }
+
+        return aTools.indexOf(sTool) !== -1 ? true : false;
+    }
 });
diff --git a/module/lang/lang-en.json b/module/lang/lang-en.json
index 29d2d9f9..dfca19f9 100644
--- a/module/lang/lang-en.json
+++ b/module/lang/lang-en.json
@@ -251,19 +251,40 @@
     "FORM_PRINTSERVER_ALIAS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Printserver alias",
     "FORM_VEREMAP_API_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Veremap API",
     "FORM_PROXY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Proxy",
+    "FORM_AVALIABLE_CONTROLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Avaliable controls",
+    "FORM_ACTIVE_CONTROLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Actives controls",
     "FORM_AVALIABLE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Avaliable tools",
     "FORM_ACTIVE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Active tools",
-    "FORM_TOOLS_ATTRIBUTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Attribution",
-    "FORM_TOOLS_MOUSE_POSITION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Mouse position",
-    "FORM_TOOLS_CURRENT_PROJECTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Current projection",
-    "FORM_TOOLS_MAP_NAME_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Map Name",
-    "FORM_TOOLS_SCALE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Numeric scale",
-    "FORM_TOOLS_OVERVIEW_MAP_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Overview map",
-    "FORM_TOOLS_ROTATE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Rotate",
-    "FORM_TOOLS_SCALE_LINE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Scale line",
-    "FORM_TOOLS_ZOOM_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Zoom",
-    "FORM_TOOLS_ZOOM_SLIDER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Zoom slider",
-    "FORM_TOOLS_REFRESH_SOCKET_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Refresh auto",
+    "FORM_AVALIABLE_PUBLIC_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Avaliable tools for public user",
+    "FORM_ACTIVE_PUBLIC_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Active tools for public user",
+    "FORM_CONTROLS_ATTRIBUTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Attribution",
+    "FORM_CONTROLS_MOUSE_POSITION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Mouse position",
+    "FORM_CONTROLS_CURRENT_PROJECTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Current projection",
+    "FORM_CONTROLS_MAP_NAME_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Map Name",
+    "FORM_CONTROLS_SCALE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Numeric scale",
+    "FORM_CONTROLS_OVERVIEW_MAP_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Overview map",
+    "FORM_CONTROLS_ROTATE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Rotate",
+    "FORM_CONTROLS_SCALE_LINE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Scale line",
+    "FORM_CONTROLS_ZOOM_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Zoom",
+    "FORM_CONTROLS_ZOOM_SLIDER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Zoom slider",
+    "FORM_CONTROLS_REFRESH_SOCKET_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Refresh auto",
+    "FORM_TOOLS_MAP_MANAGER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Gestion des cartes",
+    "FORM_TOOLS_LOCATION_SEARCH_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Localisation recherche",
+    "FORM_TOOLS_LOCATION_HOME_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Position initiale",
+    "FORM_TOOLS_LOCATION_REFRESH_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Rafraichissement carte",
+    "FORM_TOOLS_LOCATION_MAX_EXTENT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Étendue maximale",
+    "FORM_TOOLS_LOCATION_MY_POSITION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Position GPS",
+    "FORM_TOOLS_LOCATION_XY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Position XY",
+    "FORM_TOOLS_LOCATION_PREC_NEXT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Précédent/suivant",
+    "FORM_TOOLS_URL_GENERATOR_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "URL de la carte en cours",
+    "FORM_TOOLS_MAP_COMPARE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Comparaison de cartes",
+    "FORM_TOOLS_MESURE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Mesures",
+    "FORM_TOOLS_SELECT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Interrogation",
+    "FORM_TOOLS_ADVANCED_SELECT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Interrogation avancée",
+    "FORM_TOOLS_INSERT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Insertion",
+    "FORM_TOOLS_PRINT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Impressions",
+    "FORM_TOOLS_CONFIG_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Configuration contrôles",
+    "FORM_TOOLS_USER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Utilisateur en cours",
     "TITLE_DISPLAY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Display",
     "TITLE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Tools",
     "TITLE_CONTROLS_KEEPLOADED_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Keep tiles loaded when autorefreshing",
diff --git a/module/lang/lang-fr.json b/module/lang/lang-fr.json
index 82fca25d..a1b1a7bb 100644
--- a/module/lang/lang-fr.json
+++ b/module/lang/lang-fr.json
@@ -251,19 +251,40 @@
     "FORM_PRINTSERVER_ALIAS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Alias pintserver",
     "FORM_VEREMAP_API_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "API Veremap",
     "FORM_PROXY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Proxy",
+    "FORM_AVALIABLE_CONTROLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Contrôles disponibles",
+    "FORM_ACTIVE_CONTROLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Contrôles actifs",
     "FORM_AVALIABLE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Outils disponibles",
-    "FORM_ACTIVE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Outils actifs par défaut",
-    "FORM_TOOLS_ATTRIBUTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Attributions",
-    "FORM_TOOLS_MOUSE_POSITION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Position de la souris",
-    "FORM_TOOLS_CURRENT_PROJECTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Projection en cours",
-    "FORM_TOOLS_MAP_NAME_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Nom de la carte",
-    "FORM_TOOLS_SCALE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Échelle numérique",
-    "FORM_TOOLS_SCALE_LINE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Échelle graphique",
-    "FORM_TOOLS_OVERVIEW_MAP_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Carte de supervision",
-    "FORM_TOOLS_ROTATE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Rotation",
-    "FORM_TOOLS_ZOOM_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Zoom",
-    "FORM_TOOLS_ZOOM_SLIDER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Slider de zoom",
-    "FORM_TOOLS_REFRESH_SOCKET_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Rafraichissement auto",
+    "FORM_ACTIVE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Outils actifs",
+    "FORM_AVALIABLE_PUBLIC_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Outils disponibles pour l'utilisateur public",
+    "FORM_ACTIVE_PUBLIC_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Outils actifs pour l'utilisateur public",
+    "FORM_CONTROLS_ATTRIBUTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Attributions",
+    "FORM_CONTROLS_MOUSE_POSITION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Position de la souris",
+    "FORM_CONTROLS_CURRENT_PROJECTION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Projection en cours",
+    "FORM_CONTROLS_MAP_NAME_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Nom de la carte",
+    "FORM_CONTROLS_SCALE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Échelle numérique",
+    "FORM_CONTROLS_SCALE_LINE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Échelle graphique",
+    "FORM_CONTROLS_OVERVIEW_MAP_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Carte de supervision",
+    "FORM_CONTROLS_ROTATE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Rotation",
+    "FORM_CONTROLS_ZOOM_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Zoom",
+    "FORM_CONTROLS_ZOOM_SLIDER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Slider de zoom",
+    "FORM_CONTROLS_REFRESH_SOCKET_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Rafraichissement auto",
+    "FORM_TOOLS_MAP_MANAGER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Gestion des cartes",
+    "FORM_TOOLS_LOCATION_SEARCH_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Localisation recherche",
+    "FORM_TOOLS_LOCATION_HOME_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Localisation position initiale",
+    "FORM_TOOLS_LOCATION_REFRESH_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Rafraichissement couches",
+    "FORM_TOOLS_LOCATION_MAX_EXTENT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Localisation étendue maximale",
+    "FORM_TOOLS_LOCATION_MY_POSITION_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Localisation GPS",
+    "FORM_TOOLS_LOCATION_XY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Localisation XY",
+    "FORM_TOOLS_LOCATION_PREC_NEXT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Localisation précédent/suivant",
+    "FORM_TOOLS_URL_GENERATOR_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "URL de la carte en cours",
+    "FORM_TOOLS_MAP_COMPARE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Comparaison de cartes",
+    "FORM_TOOLS_MESURE_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Mesures",
+    "FORM_TOOLS_SELECT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Interrogation",
+    "FORM_TOOLS_ADVANCED_SELECT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Interrogation avancée",
+    "FORM_TOOLS_INSERT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Insertion",
+    "FORM_TOOLS_PRINT_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Impressions",
+    "FORM_TOOLS_CONFIG_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Configuration contrôles",
+    "FORM_TOOLS_USER_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Utilisateur en cours",
     "TITLE_DISPLAY_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Affichage",
     "TITLE_TOOLS_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Outils",
     "TITLE_CONTROLS_KEEPLOADED_CONFIGURATION_CONFIGURATION_VMAP_CONFIG": "Garder les tuiles lors d'un rafraichissement automatique",
diff --git a/module/template/layers/layertree.html b/module/template/layers/layertree.html
index 5002135b..3141c44e 100644
--- a/module/template/layers/layertree.html
+++ b/module/template/layers/layertree.html
@@ -12,10 +12,20 @@
 </div>
 
 <div id="layertree" class="layers-tool" collapse="{{ctrl.layerstree_collapsed === true ? 'out' : 'in'}}">
+
+    <ul class="nav nav-tabs layerstree-nav left" ng-show="$root.compare_enabled">
+        <li ng-class="{'active' : activeMap == 1}">
+            <a href="#" ng-click="activeMap=1;ctrl.resize()">Carte 1</a>
+        </li>
+        <li ng-class="{'active' : activeMap == 2}">
+            <a href="#" ng-click="activeMap=2;ctrl.resize()">Carte 2</a>
+        </li>
+    </ul>
     <div class="indicators">
         <span class="text-info icon-eye" style="font-size: 18px;line-height: 0" title="Définit si la couche est visible"></span>
     </div>
-    <ul class="tree">
+
+    <ul class="tree" ng-show="activeMap == 1 || !$root.compare_enabled">
         <div ng-repeat="node in tree.children| orderBy : 'name'" ng-if="node.view === undefined">
 
             <!-- Service -->
@@ -140,6 +150,108 @@
             </ul>
         </div>
     </ul>
+
+    <ul class="tree" ng-show="activeMap == 2 && $root.compare_enabled">
+        <div ng-repeat="node in compareTree.children| orderBy : 'name'" ng-if="node.view === undefined">
+
+            <!-- Service -->
+            <div class="layerstree-phather">
+                <div class="tree-father-collapse-btn service-name left" data-toggle="collapse" data-target="#comparetree_element_{{$id}}" onclick="setTimeout(function () {
+                                oVmap.resizeLayerTools(true)
+                            }, 500)" title="{{node.name}}">
+                    {{node.name}}
+                </div>
+                <div class="checkbox checkbox-info inline-checkbox right"
+                     ng-class="{'checkbox_indeterminate': node.visible === null}">
+                    <input id="compare_service_{{$id}}_visible"
+                           ng-init="node.visible = ctrl.isGroupVisible(node)"
+                           ng-model="node.visible"
+                           ng-model-options="{getterSetter: true}"
+                           ng-click="ctrl.setGroupVisible(node)"
+                           type="checkbox"
+                           style="cursor:pointer; position: absolute"
+                           title="Definit si le groupe est visible">
+                    <label for="compare_service_{{$id}}_visible"
+                           style="cursor:pointer"
+                           title="Definit si le groupe est visible"></label>
+                </div>
+            </div>
+
+            <!-- Calque -->
+            <ul id="comparetree_element_{{$id}}" class="collapse layers-tree-ul tree-element" ng-class="{'in': ctrl.layers_collapsed !== true}">
+                <div ng-repeat="layer in node.children">
+                    <li>
+                        <ul class="list-group-item layertree-item auto-height">
+
+                            <!-- Nom du calque -->
+                            <div class="layer-name layer-name-tree" title="{{layer.name}}">{{layer.name}}</div>
+                            <div class="layer-checkboxes">
+                                <button type="button"
+                                        class="btn btn-xs margin-sides-10 hidden"
+                                        ng-click="layer.olLayer.getSource().refreshWithTimestamp()">
+                                    <span class="glyphicon glyphicon-refresh"></span>
+                                </button>
+                                <div type="button" class="btn btn-xs layer-menu-button" ng-click="ctrl.toggleLayerMenu(layer, $event)">
+                                    <span ng-class="{'icon-filter': layer.olLayer.get('is_filtered'), 'icon-format_list_bulleted': !layer.olLayer.get('is_filtered')}"></span>
+                                </div>
+                                <!-- Checkbox visible -->
+                                <div class="checkbox checkbox-info inline-checkbox" style="z-index: 10;">
+                                    <input id="{{layer.$$hashKey}}_compare_visible_order_checkbox"
+                                           type="checkbox"
+                                           style="cursor:pointer; position: absolute"
+                                           title="Definit si le calque est visible"
+                                           ng-checked="layer.olLayer.values.visible === true"
+                                           ng-click="ctrl.setVisible(layer.olLayer, !layer.olLayer.values.visible);node.visible = ctrl.isGroupVisible(node)">
+                                    <label for="{{layer.$$hashKey}}_compare_visible_order_checkbox" style="cursor:pointer" title="Definit si la couche est visible"></label>
+                                </div>
+                            </div>
+                        </ul>
+                    </li>
+                    <div class="dropdown-menu layer-menu" ng-class="{'block': layer.displayedMenu === true}">
+                        <div class="layer-menu-list">
+                            <li ng-if="layer.olLayer.get('is_filtered')" ng-click="ctrl.displayFilterLayerModal(layer.olLayer)">
+                                <a href="#">
+                                    <span class="icon-filter"></span>
+                                    Filtre
+                                </a>
+                            </li>
+                            <li>
+                                <a href="#">
+                                    <div class="row">
+                                        <div class="col-xs-6">
+                                            <span class="icon-star-half"></span>
+                                            Transparence
+                                        </div>
+                                        <div class="col-xs-6">
+                                            <div class="layer-menu-list-slider">
+                                                <input data-app-layer-opacity-slider="" id="compare_slider_layer_form_{{layer.$$hashKey}}" type="text">
+                                            </div>
+                                        </div>
+                                    </div>
+                                </a>
+                            </li>
+                            <li ng-if="layer.olLayer.get('type') === 'imagewms' || layer.olLayer.get('type') === 'tilewms'"
+                                ng-repeat="sublayer in layer.olLayer.get('sublayers')">
+                                <div class="sublayer-checkboxes">
+                                    <!-- Checkbox visible -->
+                                    <div class="checkbox checkbox-info sublayer-checkbox inline-checkbox">
+                                        <input id="{{layer.$$hashKey}}_compare_sublayer_{{sublayer}}_visible_checkbox"
+                                               type="checkbox"
+                                               style="cursor:pointer; position: absolute"
+                                               title="Definit si la couche est visible"
+                                               ng-checked="ctrl.isSublayerActive(layer.olLayer, sublayer)"
+                                               ng-disabled="layer.olLayer.values.visible !== true"
+                                               ng-click="ctrl.toggleSubLayer(layer.olLayer, sublayer, '#' + layer.$$hashKey + '_sublayer_' + sublayer + '_visible_checkbox')">
+                                        <label for="{{layer.$$hashKey}}_compare_sublayer_{{sublayer}}_visible_checkbox" style="cursor:pointer" title="Definit si la couche est visible">{{sublayer}}</label>
+                                    </div>
+                                </div>
+                            </li>
+                        </div>
+                    </div>
+                </div>
+            </ul>
+        </div>
+    </ul>
 </div>
 
 <!--Modale pour le filtrage-->
diff --git a/module/template/layers/maplegend.html b/module/template/layers/maplegend.html
index a82570aa..4c34eb49 100755
--- a/module/template/layers/maplegend.html
+++ b/module/template/layers/maplegend.html
@@ -1,9 +1,9 @@
 <div class="maplegendtool">
     <div ng-if="!$root.is_mobile" id="maplegendcontainer-button">
-        <div class="list-group-item active pointer maplegend-button-content" 
-             title="Légende de la carte" 
+        <div class="list-group-item active pointer maplegend-button-content"
+             title="Légende de la carte"
              collapse="{{ctrl.legend_collapsed === true ? 'out' : 'in'}}"
-             data-target="#maplegendcontainer" 
+             data-target="#maplegendcontainer"
              onclick="oVmap.getMapManager().collapseElement(this)">
             <span class="icon-info list-group-icon"></span>
             <span>Légende</span>
@@ -12,7 +12,15 @@
         </div>
     </div>
     <div id="maplegendcontainer" class="layers-tool legend" collapse="{{ctrl.legend_collapsed === true ? 'out' : 'in'}}">
-        <div id="maplegend" class="tree legend">
+        <ul class="nav nav-tabs layerstree-nav" ng-show="$root.compare_enabled">
+            <li ng-class="{'active' : activeMap == 1}">
+                <a href="#" ng-click="activeMap=1;ctrl.resize()">Carte 1</a>
+            </li>
+            <li ng-class="{'active' : activeMap == 2}">
+                <a href="#" ng-click="activeMap=2;ctrl.resize()">Carte 2</a>
+            </li>
+        </ul>
+        <div id="maplegend" class="tree legend" ng-show="activeMap == 1 || !$root.compare_enabled">
             <div ng-repeat="(sLayerName, layer) in ctrl.oUrls" class="layer-legend"
                  ng-show="ctrl.areLegendsLoaded(layer)">
                 <div id="legend_father{{$index}}" data-toggle="collapse" data-target="#legend_element_{{$index}}">
@@ -23,7 +31,26 @@
                 <div id="legend_element_{{$index}}" class="collapse in">
                     <ul class="list-group-item auto-height">
                         <div ng-repeat="node in layer"
-                             ng-show="node.legendBlobURL">                            
+                             ng-show="node.legendBlobURL">
+                            <img ng-src="{{node.legendBlobURL}}" class="legend-img" legend-image-node>
+                        </div>
+                    </ul>
+                </div>
+            </div>
+        </div>
+
+        <div id="compare_maplegend" class="tree legend" ng-show="activeMap == 2 && $root.compare_enabled">
+            <div ng-repeat="(sLayerName, layer) in ctrl.oCompareUrls" class="layer-legend"
+                 ng-show="ctrl.areLegendsLoaded(layer)">
+                <div id="compare_legend_father{{$index}}" data-toggle="collapse" data-target="#compere_legend_element_{{$index}}">
+                    <div style="display: inline-block; width:98%">
+                        <div class="legend_father_name" title="{{sLayerName}}">{{sLayerName}}</div>
+                    </div>
+                </div>
+                <div id="compare_legend_element_{{$index}}" class="collapse in">
+                    <ul class="list-group-item auto-height">
+                        <div ng-repeat="node in layer"
+                             ng-show="node.legendBlobURL">
                             <img ng-src="{{node.legendBlobURL}}" class="legend-img" legend-image-node>
                         </div>
                     </ul>
@@ -31,4 +58,4 @@
             </div>
         </div>
     </div>
-</div>
\ No newline at end of file
+</div>
diff --git a/module/template/layers/mapmodal/maplistlitle.html b/module/template/layers/mapmodal/maplistlitle.html
index e2ff1e2f..bbfb1ce3 100644
--- a/module/template/layers/mapmodal/maplistlitle.html
+++ b/module/template/layers/mapmodal/maplistlitle.html
@@ -47,7 +47,7 @@
                         <div url="{{map.url}}"
                              ng-if="compare"
                              title="{{map.description}}"
-                             class="col-md-6 margin-10 pointer opacity-hover underline-hover maplist-map"
+                             class="col-md-3 margin-10 pointer opacity-hover underline-hover maplist-map"
                              style="text-align: center; font-size: 12px;"
                              onclick="oVmap.getMapManager().loadCompareMap(this)"
                              data-dismiss="modal">
@@ -74,7 +74,7 @@
                     <div ng-if="($index + 1) % 4 !== 0 && compare"
                          url="{{map.url}}"
                          title="{{map.description}}"
-                         class="col-md-6 margin-10 pointer opacity-hover underline-hover maplist-map"
+                         class="col-md-3 margin-10 pointer opacity-hover underline-hover maplist-map"
                          style="text-align: center; font-size: 12px;"
                          onclick="oVmap.getMapManager().loadCompareMap(this)"
                          data-dismiss="modal">
diff --git a/module/template/tools/basicselect.html b/module/template/tools/basicselect.html
index 1f829c66..d0ecff8d 100644
--- a/module/template/tools/basicselect.html
+++ b/module/template/tools/basicselect.html
@@ -1,6 +1,6 @@
 <div id="vmap-basicselect-tool"></div>
 
-<li role="presentation" style="position: inherit" class="basic-tools-dropdown">
+<li role="presentation" style="position: inherit" class="basic-tools-dropdown"  ng-class="{'hidden': !$root.isVmapToolActive('Select')}">
     <a class="basic-tools-element pointer"
        id="basic-tools-dropdown-basicselect-btn"
        ng-show="ctrl.aBusinessObjectsList.length > 0 || (ctrl.properties.selection.enable_getfeatureinfo === true && ctrl.aQueryableLayers.length > 0)"
diff --git a/module/template/tools/basictools.html b/module/template/tools/basictools.html
index 03218712..8d42420c 100644
--- a/module/template/tools/basictools.html
+++ b/module/template/tools/basictools.html
@@ -5,12 +5,12 @@
                 <!-- Outils de localisation -->
                 <div app-location app-lang="ctrl.lang" app-map="ctrl.map"></div>
                 <!-- Outil d'export d'url -->
-                <div>
+                <div ng-class="{'hidden': !$root.isVmapToolActive('URLGenerator')}">
                     <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
                         <a class="basic-tools-element pointer"
                            title="Lien vers la carte en cours"
                            onclick="oVmap.getToolsManager().getBasicTools().toggleTool(this)">
-                            <span class="fa fa-link" aria-hidden="true"></span>
+                            <span class="icon-link_url" aria-hidden="true"></span>
                         </a>
                         <div app-url-exporter app-lang="ctrl.lang" app-map="ctrl.map"
                              id="basic-tools-dropdown-urlexporter"
@@ -20,7 +20,7 @@
                     </li>
                 </div>
                 <!-- Outil de comparaison -->
-                <div>
+                <div ng-class="{'hidden': !$root.isVmapToolActive('MapCompare')}">
                     <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
                         <a class="basic-tools-element pointer"
                            id="map-compare-tool-btn"
@@ -36,7 +36,7 @@
                     </li>
                 </div>
                 <!-- Login de l'utilisateur -->
-                <div class="right">
+                <div class="right" ng-class="{'hidden': !$root.isVmapToolActive('User')}">
                     <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
                         <a class="basic-tools-element pointer"
                            title="Utilisateur"
@@ -50,7 +50,7 @@
                     </li>
                 </div>
                 <!-- Contrôles -->
-                <div class="right">
+                <div class="right" ng-class="{'hidden': !$root.isVmapToolActive('Config')}">
                     <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
                         <a class="basic-tools-element pointer"
                            title="Outils de contrôle"
@@ -64,7 +64,7 @@
                     </li>
                 </div>
                 <!-- Impression -->
-                <div class="right">
+                <div class="right" ng-class="{'hidden': !$root.isVmapToolActive('Print')}">
                     <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
                         <a id="print-select-btn"
                            class="basic-tools-element pointer"
@@ -79,7 +79,7 @@
                     </li>
                 </div>
                 <!-- Insertion -->
-                <div class="right">
+                <div class="right" ng-class="{'hidden': !$root.isVmapToolActive('Insert')}">
                     <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
                         <a class="basic-tools-element pointer"
                            id="basic-tools-dropdown-insert-btn"
@@ -96,7 +96,7 @@
                 <!--Outils de sélection-->
                 <div app-select app-lang="ctrl.lang" app-map="ctrl.map" app-action="ctrl.currentAction" class="right basic-tools-nav"></div>
                 <!-- Mesure -->
-                <div class="right">
+                <div class="right" ng-class="{'hidden': !$root.isVmapToolActive('Mesure')}">
                     <li style="position: inherit" class="basic-tools-dropdown">
                         <a 	class="basic-tools-element pointer"
                             title="Outils de mesure"
diff --git a/module/template/tools/location.html b/module/template/tools/location.html
index a9f3e9bc..62e46ed3 100644
--- a/module/template/tools/location.html
+++ b/module/template/tools/location.html
@@ -1,16 +1,16 @@
 <!--location search-->
-<li id="location-search-tool" role="presentation">
+<li id="location-search-tool" role="presentation" ng-class="{'hidden': !$root.isVmapToolActive('LocationSearch')}">
     <form ng-submit="ctrl.searchLocation()" id="location-search-form" class="margin-sides-5 from-control">
         <!--Recherche-->
         <input id="location-search-input"
-               type="text" 
+               type="text"
                placeholder="Localiser.."
                ng-model="ctrl.locationSearch"
                ng-click="ctrl.searchLocation()">
         <!--Sélecteur-->
         <select id="location-search-api-select"
                 ng-model="ctrl.sSelectedLocationService"
-                ng-change="ctrl.searchLocation()">            
+                ng-change="ctrl.searchLocation()">
             <!--Géocodeurs-->
             <option ng-repeat="(key, value) in ctrl.locationServices"
                     value="{{key}}">{{value.title}}</option>
@@ -26,7 +26,7 @@
         <!--Bandeau du haut-->
         <div style="margin: 10px">
             <label>Résultats de la recherche: </label>
-            <span class="glyphicon glyphicon-remove right pointer margin-sides-10" 
+            <span class="glyphicon glyphicon-remove right pointer margin-sides-10"
                   ng-click="ctrl.removeLocation()"></span>
         </div>
 
@@ -65,12 +65,12 @@
 
         <!-- Géocodeur -->
         <div ng-if="locationServiceType === 'geocoder'" class="location-search-dropdown-content">
-            <div class="location-search-dropdown-result" 
+            <div class="location-search-dropdown-result"
                  ng-repeat="node in ctrl.locationResults">
                 <div class="pointer opacity-hover"
                      ng-click="ctrl.locatePlace(node)">
                     <span>{{node.title}}</span>
-                </div>					
+                </div>
 
                 <div class="location-search-dropdown-result-buttons pointer collapsed" data-toggle="collapse" href="#location-search-dropdown-result-infos-{{this['$index']}}">
                     <a>Détails</a>
@@ -78,7 +78,7 @@
                 </div>
 
                 <div class="collapse" id="location-search-dropdown-result-infos-{{this['$index']}}">
-                    <div style="padding-bottom: 10px" ng-if="node.summary">	
+                    <div style="padding-bottom: 10px" ng-if="node.summary">
                         <ul>
                             <li ng-repeat="oSummaryElement in node.summary">{{oSummaryElement.label}}: {{oSummaryElement.value}}</li>
                         </ul>
@@ -91,13 +91,13 @@
         <div style="text-align: center; margin: 10px;">
             <button type="button" class="btn btn-sm btn-primary" ng-click="ctrl.searchLocation(ctrl.locationSearch, 12)">
                 Plus de résultats
-            </button>			
+            </button>
         </div>
     </div>
 </li>
 
 <!--Go home-->
-<li role="presentation">
+<li role="presentation" ng-class="{'hidden': !$root.isVmapToolActive('LocationHome')}">
     <a id="original-position-tool"
        class="basic-tools-element pointer" title="Centrer la carte sur l’emprise par défaut"
        ng-click="ctrl.goHome()">
@@ -106,7 +106,7 @@
 </li>
 
 <!--Refresh map-->
-<li role="presentation">
+<li role="presentation" ng-class="{'hidden': !$root.isVmapToolActive('LocationRefresh')}">
     <a id="original-position-tool"
        class="basic-tools-element pointer" title="Rafraichir les couches de la carte"
        ng-click="ctrl.refreshMap()">
@@ -115,7 +115,7 @@
 </li>
 
 <!--Max extent-->
-<li role="presentation">
+<li role="presentation" ng-class="{'hidden': !$root.isVmapToolActive('LocationMaxExtent')}">
     <a class="basic-tools-element pointer" title="Centrer la carte à l’étendue maximale"
        ng-click="ctrl.maxExtent()">
         <span class="icon-language" aria-hidden="true"></span>
@@ -123,7 +123,7 @@
 </li>
 
 <!--Geolocate me-->
-<li role="presentation">
+<li role="presentation" ng-class="{'hidden': !$root.isVmapToolActive('LocationMyPosition')}">
     <a class="basic-tools-element pointer" title="Centrer la carte sur ma position"
        ng-click="ctrl.geolocateMe()">
         <span class="glyphicon glyphicon-map-marker" aria-hidden="true"></span>
@@ -131,7 +131,7 @@
 </li>
 
 <!--Go to-->
-<li role="presentation" style="position: inherit" class="basic-tools-dropdown">
+<li role="presentation" style="position: inherit" class="basic-tools-dropdown" ng-class="{'hidden': !$root.isVmapToolActive('LocationXY')}">
 
     <a class="basic-tools-element pointer"
        title="Centrer la carte sur une position donnée"
@@ -148,7 +148,7 @@
                 <div class="input-group-sm">
                     <input type="number" class="form-control" placeholder="Y" ng-model="goToY">
                 </div>
-            </div>			
+            </div>
             <div class="col-md-5">
                 <b>Projection:</b>
                 <select class="form-control" ng-model="goToProj">
@@ -169,7 +169,7 @@
 </li>
 
 <!--Previous history-->
-<li role="presentation">
+<li role="presentation" ng-class="{'hidden': !$root.isVmapToolActive('LocationPrecNext')}">
     <a class="basic-tools-element pointer" title="Aller à l'étendue précédente"
        ng-click="ctrl.previousHistoryExtent()" ng-class="{'inactive' : ctrl.iHistoryOffset >= ctrl.aLocationHistory.length - 1}">
         <span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span>
@@ -177,7 +177,7 @@
 </li>
 
 <!--Next history-->
-<li role="presentation">
+<li role="presentation" ng-class="{'hidden': !$root.isVmapToolActive('LocationPrecNext')}">
     <a class="basic-tools-element pointer" title="Aller à l'étendue suivante"
        ng-click="ctrl.nextHistoryExtent()" ng-class="{'inactive' : ctrl.iHistoryOffset === 0}">
         <span class="glyphicon glyphicon-arrow-right" aria-hidden="true"></span>
diff --git a/module/template/tools/select.html b/module/template/tools/select.html
index 24ae5ca8..f801d83e 100644
--- a/module/template/tools/select.html
+++ b/module/template/tools/select.html
@@ -2,7 +2,7 @@
 <div id="vmap-select-tool"></div>
 
 <!-- Selection Avancée -->
-<div class="right" ng-if="!$root.is_mobile">
+<div class="right" ng-if="!$root.is_mobile" ng-class="{'hidden': !$root.isVmapToolActive('AdvancedSelect')}">
     <li role="presentation" style="position: inherit" class="basic-tools-dropdown">
         <a class="basic-tools-element pointer"
            id="basic-tools-dropdown-select-btn"
diff --git a/module/template/tools/urlexporter.html b/module/template/tools/urlexporter.html
index c10845a6..a1602e30 100644
--- a/module/template/tools/urlexporter.html
+++ b/module/template/tools/urlexporter.html
@@ -2,29 +2,29 @@
 <div class="row margin-sides-0 margin-10">
     <div class="col-md-12">
         <div class="left">
-            <label for="urlExporterField" class="control-label">Lien vers la carte en cours</label>
-        </div>
-        <div class="right" ng-if="ctrl.properties.allow_public_connection">
-            <div class="checkbox checkbox-info checkbox-inline">
-                <input id="publicAccountCheckbox"
-                        type="checkbox"
-                        style="cursor:pointer;"
-                        title=">Activer / Désactiver le mode public"
-                        ng-model="ctrl.usePublicToken">
-                <label for="publicAccountCheckbox"
-                       style="cursor:pointer"
-                       title="Activer / Désactiver le mode public">
-                    Public
-                </label>
-            </div>
+            <label for="privateExportUrlField" class="control-label">Lien vers la carte en cours</label>
         </div>
     </div>
     <div class="col-md-12">
         <div class="input-group">
-            <input type="text" class="form-control" ng-model="ctrl.urlToExport" id="urlExporterField">
+            <span class="input-group-btn">
+                <button type="button" class="btn btn-default" disabled><span class="fa fa-lock"></span></button>
+            </span>
+            <input type="text" class="form-control" ng-model="ctrl.privateExportUrl" id="privateExportUrlField">
             <span class="input-group-btn">
                 <button type="button" class="btn btn-default" ng-click="ctrl.copyUrl()"><span class="icon-copy"></span></button>
             </span>
         </div>
     </div>
+    <div class="col-md-12 margin-10" ng-if="ctrl.properties.allow_public_connection">
+        <div class="input-group">
+            <span class="input-group-btn">
+                <button type="button" class="btn btn-default" disabled><span class="fa fa-unlock"></span></button>
+            </span>
+            <input type="text" class="form-control" ng-model="ctrl.publicExportUrl" id="publicExportUrlField">
+            <span class="input-group-btn">
+                <button type="button" class="btn btn-default" ng-click="ctrl.copyUrl(true)"><span class="icon-copy"></span></button>
+            </span>
+        </div>
+    </div>
 </div>
diff --git a/module/template/vmap.html b/module/template/vmap.html
index 0b1b12f9..3dfe8e97 100755
--- a/module/template/vmap.html
+++ b/module/template/vmap.html
@@ -19,7 +19,7 @@
 
                 <app-maplistlitle app-lang="ctrl.lang" app-maplistlitle-map="ctrl.map"></app-maplistlitle>
 
-                <div id="map-manager-button-container" style="text-align: center">
+                <div id="map-manager-button-container" style="text-align: center" ng-class="{'hidden': !$root.isVmapToolActive('MapManager')}">
                     <button id="map-manager-button"
                             type="button"
                             class="btn btn-success btn-sm btn-modal margin-10"
diff --git a/web_service/conf/properties.inc b/web_service/conf/properties.inc
index f21d672f..14c81c89 100755
--- a/web_service/conf/properties.inc
+++ b/web_service/conf/properties.inc
@@ -10,6 +10,8 @@ $properties["vmap"]["layers_collapsed"] = false;
 $properties["vmap"]["layerstree_collapsed"] = false;
 $properties["vmap"]["layersorder_collapsed"] = true;
 $properties["vmap"]["legend_collapsed"] = false;
+$properties['controls']['active_tools'] = 'LocationMaxExtent|User|Print|Insert|AdvancedSelect|Select|Mesure|URLGenerator|MapManager|LocationSearch|LocationHome|LocationRefresh|LocationXY|MapCompare|LocationMyPosition';
+$properties['controls']['public_active_tools'] = 'User|Insert|AdvancedSelect|LocationXY|MapManager|LocationHome|MapCompare|Select|Print|LocationSearch|LocationMyPosition|Mesure';
 $properties['controls']['active_controls'] = 'Attribution|MousePosition|CurrentProjection|MapName|Scale|ScaleLine|OverviewMap|Zoom|ZoomSlider|RefreshSocket';
 $properties["selection"]["limit_popup"] = 1;
 $properties["selection"]["limit_list"] = 50;
-- 
GitLab