PageSourceSearch

https://www.marches-publics.gouv.fr/themes/js/jsmap.components.js?k=f70e2701f1

js marches-publics.gouv.fr collected 2026-10-02 16:18:11 UTC 20,155 bytes, 879 lines download raw bytes

1
2/*
3 * Copyright (C) Atexo - All Rights Reserved
4 * Unauthorized copying of this file, via any medium is strictly prohibited
5 * Proprietary and confidential
6 */
7
8/*
9 *  Composants JS carte interactive
10 *
11 *  Version 1.0
12 *
13 *
14 *  Composants jsMap, jsMapSubItem, jsMapSubItemsTab, jsMapItem, jsMapItemsTab
15 *
16 */
17
18
19//Composant jsMapSubItem
20jsMapSubItem = function (obj, map, type, pos, subpos){
21
22	this.component     = 'jsMapSubItem';
23
24	this.name          = obj.name; //ex : "Somme"
25	this.code          = obj.code; //ex : "80"
26	this.nuts          = obj.nuts; //ex : "FR223"
27	this.path          = obj.path; //Chemin vectoriel de l'element
28	this.color         = obj.color; //ex : "#edc667"
29	this.map           = map; //Carte JS
30
31	this.id            = 'sub_it_'+this.nuts;
32	this.label         = this.code+' - '+this.name; //ex : "80 - Somme"
33
34	this.local         = +obj.local; //Sous-element a placer dans la carte locale ou non
35	this.local_color   = obj.local_color; //Couleur du sous-element en mode "local"
36	this.local_selcolor= obj.local_selcolor; //Couleur du sous-element selectionne en mode "local"
37	this.local_path    = obj.local_path; //Chemin vectoriel du sous-element en mode "local"
38
39	this.pos           = pos; //Position de l'element parent dans le tableau listant les elements de la carte
40	this.subpos        = subpos; //Position du sous-element courant dans le tableau listant les s
40ous elements de l'element parent
41
42	this.type          = type; //ex : departement
43
44	this.selected      = false; // Sous-element selectionne ou non
45
46	/**
47     * Met a jour la valeur de l'etat de selection du sous-element
48     *
49     */
50	this.applySelection = function(selection){
51
52		//Modification de l'etat de selection du sous-element
53		this.selected = selection;
54		
55		//Actualisation de la couleur du sous-element
56		if(this.map.mode == this.type){
57		
58			if(this.map.browser == 'MSIE' && (this.map.browser_version == '7' || this.map.browser_version == '8' )){
59				
60				this.draw();
61				
62			} else {
63				
64				this.updateColor();
65				
66			}		
67		}
68	}
69
70	/**
71    * Modifie la couleur du sous-element
72    *
73    */
74	this.setColor = function(color){
75
76		//Recuperation de l'ID HTML du sous-element
77		var map_id   = '#'+this.id;
78		
79		//Recuperation du composant HTML du sous-element
80		var map_item = J(map_id);
81		
82		//Actualisation de la couleur du composant HTML
83        map_item.attr('fill',color);
84	}
85	
86		/**
87     * Met a jour la couleur du sous-element en fonction de son statut "selectionne"/"non selectionne"
88     *
89     */
90	this.updateColor = function (){
91
92		var show_local = this.map.show_local;
93
94		if(this.selected){
95
96			if(show_local && this.local){
97
98				this.setColor(this.local_selcolor);
99
100			} else {
101
102				this.setColor(this.map.features.selcolor);
103
104			}
105
106		} else {
107
108			if(show_local && this.local){
109
110				this.setColor(this.local_color);
111
112			} else {
113
114				this.setColor(this.color);
115
116			}
117		}
118	}
119	
120	/**
121     * Met a jour la couleur du sous-element en fonction de son statut "selectionne"/"non selectionne"
122     *
123     */
124	this.drawColor = function (){
125		
126		var map_id = this.map.name + '.' + this.id;
127		
128		if(this.selected){
129
130			if(this.map.show_local && this.local){
131
132				this.map.container.map_id = this.map.container.path(this.local_path).attr(this.map.features).attr('fill',this.local_selcolor);
133
134			} else {
135
136				this.map.container.map_id = this.map.container.path(this.path).attr(this.map.features).attr('fill',this.map.features.selcolor);
137
138			}
139
140		} else {
141
142			if(this.map.show_local && this.local){
143
144				this.map.container.map_id = this.map.container.path(this.local_path).attr(this.map.features).attr('fill',this.local_color);
145
146			} else {
147				
148				this.map.container.map_id = this.map.container.path(this.path).attr(this.map.features).attr('fill',this.color);
149
150			}
151		}
152	}
153
154	/**
155     * Dessine le chemin vectoriel du sous-element et les evenements lies
156     *
157     */
158	this.draw = function(){
159
160		//Attributs de l'objet Raphael a creer
161
162		//Ajouter cet objet a la carte
163		var map_id     = this.map.name + '.' + this.id;
164		
165		this.drawColor();
166		
167		//Mettre a jour ses proprietes
168		this.map.container.map_id[0].style.cursor = 'pointer';
169		this.map.container.map_id[0].setAttribute("id",this.id);
170				
171				
172		var obj    = this.map.container.map_id;
173		var obj_id = '#'+this.map.container.map_id[0].id;
174		var label  = this.label;
175		
176		//Ajout evenement "onMouseOver"
177		this.map.container.map_id[0].onmouseover= function () {
178
179			tipText = label;
180
181			obj.attr('opacity',0.5);
182			map.container.safari();
183			// no longer usable
184			//J(tip).stop(true, true).show();
185			over = true;
186
187		};
188
189		//Ajout evenement "onMouseOut"
190		this.map.container.map_id[0].onmouseout= function () {
191
192			obj.attr('opacity',1);
193			map.container.safari();
194			// no longer usable
195			//J(tip).stop(true, true).hide();
196			over = false;
197
198		};
199
200		//Ajout evenement "onClick"
201		var js_obj       = this;
202		var onmouseclick = this.map.onmouseclick;
203		this.map.container.map_id[0].onclick = function () {
204			onmouseclick(js_obj);
205		};
206
207	}
208
209	/**
210     * Deselectionne le sous-element
211     *
212     */
213	this.unselect = function (){
214
215		var selection = false;
216
217		this.applySelection(selection);
218
219	}
220
221}
222
223
224//Composant jsMapSubItemsTab
225jsMapSubItemsTab = function (map, pos, json_subitems){
226
227	this.map           = map;
228	this.type          = json_subitems.type;
229	this.json_subitems = json_subitems.tab;
230
231	this.tab           = new Array();
232
233	for(var i = 0, c = this.json_subitems.length; i < c; i++){
234
235		//Position du sous element dans le tableau
236		var subpos  = this.tab.length;
237
238		//Creation du sous-element
239		var subitem = null;
240		subitem     = new jsMapSubItem(this.json_subitems[i], this.map, this.type, pos, subpos);
241
242		//Ajout du sous-element au tableau des sous-elements
243		this.tab[subpos] = subitem;
244
245	}
246
247	/**
248     * Modifie la valeur du statut de selection pour l'ensemble des sous-elements references dans le tableau des sous-elements
249     *
250     */
251	this.applySelection = function(selection){
252
253		for (var i = 0, c = this.tab.length; i < c; i++) {
254
255			this.tab[i].applySelection(selection);
256
257		}
258
259	}
260
261	/**
262     * Dessine les sous-elements references dans le tableau des sous-elements
263     *
264     */
265	this.draw = function(subitems){
266
267		if(this.map.mode == this.type){
268
269			for (var i = 0, c = this.tab.length; i < c; i++) {
270
271				var selection = false;
272				if(subitems.subitems.tab[i].id){
273
274					selection = subitems.subitems.tab[i].selection;
275
276				}
277
278				this.tab[i].draw(selection);
279
280			}
281		}
282
283	}
284
285	/**
286     * Chargement des sous-elements deja selectionnes
287     *
288     */
289	this.loadSelectedSubitems = function(selSubitemsTab){
290
291		//Initialisation
292		var selection = true;
293		var d         = selSubitemsTab.length;
294		
295		if(d > 0){
296			//Parcours de l'ensemble des sous-elements composant le tableau des sous-elements
297			for (var i = 0, c = this.tab.length; i < c; i++) {
298				//Si navigateur IE7 ou IE8 (version JS ne prenant pas en compte la mathode indexOf)
299				if(this.map.browser == 'MSIE' && (this.map.browser_version == '7' || this.map.browser_version == '8' )){	//|| this.map.browser_version == '9')){
300					//Verification presence du sous-element dans le tableau des sous-elements precedemment selectionnes				
301					for(var j = 0; j < d; j++){				
302					
303						if(selSubitemsTab[j] == this.tab[i].code){ // cette ligne pose pb sous IE7
304							this.tab[i].applySelection(selection); // cette ligne pose pb sous IE7
305							break;
306						}				
307					}
308				} else {
309					//Si navigateurs plus evolues
310					if(selSubitemsTab.indexOf(this.tab[i].code)> -1){
311						//Mise a jour du statut du sous-element
312						this.tab[i].applySelection(selection);
313					}
314				}
315			}
316		}
317	}
318
319}
320
321
322//Composant jsMapItem
323jsMapItem = function (obj, map, type, pos, subitems){
324
325	this.component     = 'jsMapItem';
326
327	this.name          = obj.name;
328	this.code          = obj.code;
329	this.nuts          = obj.nuts;
330	this.path          = obj.path;
331	this.color         = obj.color;
332	this.map           = map;
333
334	this.local         = +obj.local;
335
336	this.id            = 'it_'+this.nuts;
337	this.label         = this.name;
338
339	this.pos           = pos;
340	this.type          = type;
341
342	this.subitems      = subitems;
343
344	this.selected          = false;
345	this.selected_subitems = false;
346
347	/**
348     * Met a jour la valeur de l'etat de selection de l'element
349     *
350     */
351	this.applySelection = function(selection){
352
353		//Modification de l'attribut pour les sous-composants
354		this.subitems.applySelection(selection);
355
356		//Mise a jour des proprietes du composant
357		this.update();
358
359	}
360	
361	/**
362     * Modifie la couleur de l'element
363     *
364     */
365	this.setColor = function (color){
366
367		var map_id   = '#'+this.id;
368		var map_item = J(map_id);
369		map_item.attr('fill', color);
370
371	}
372
373	/**
374     * Met a jour la couleur de l'element en fonction de son statut "selectionne"/"non selectionne"
375     *
376     */
377	this.updateColor = function (){
378
379		if(this.selected){
380
381			this.setColor(this.map.features.selcolor);
382
383		} else {
384
385			this.setColor(this.color);
386
387		}
388	}
389
390
391	/**
392     * Met a jour la couleur de l'element en fonction de son statut "selectionne"/"non selectionne"
393     *
394     */
395	this.drawColor = function (){
396
397		var map_id  = this.map.name + '.' + this.id;
398
399		if(this.selected){
400
401			this.map.container.map_id = this.map.container.path(this.path).attr(this.map.features).attr('fill',this.map.features.selcolor);
402
403		} else {
404
405			this.map.container.map_id = this.map.container.path(this.path).attr(this.map.features).attr('fill',this.color);
406
407		}		
408	}
409
410	/**
411     * Met a jour le statut "selectionne"/"non selectionne" de l'element en fonction du statut de ses sous-elements
412     *
413     */
414	this.update = function(){
415
416		var selected     = 0;
417		var not_selected = 0;
418
419		//Verification du statut de selection des elements imbriques
420		for (var i = 0, c = this.subitems.tab.length; i < c; i++) {
421
422			if(this.subitems.tab[i].selected){
423
424				selected += 1;
425
426			} else {
427
428				not_selected += 1;
429
430			}
431		}
432
433		//Test pour la mise a jour du statut de l'element imbriquant
434		if(selected == this.subitems.tab.length){
435
436			//Tous les sous elements selectionnes
437
438			//Mise a jour de l'attribut selected_subitems
439			this.selected_subitems = true;
440
441			//Mise a jour de l'attribut selected
442			this.selected = true;
443
444
445		} else if(not_selected == this.subitems.tab.length){
446
447			//Tous les sous elements deselectionnes
448
449			//Mise a jour de l'attribut selected_subitems
450			this.selected_subitems = false;
451
452			//Mise a jour du statut
453			this.selected = false;
454
455
456		} else {
457
458			//Il y a a la fois des sous elements selectionnes et deselectionnes
459			//Si au moins un subitem selectionne, l'item est selectionne
460
461			//Mise a jour de l'attribut selected_subitems
462			this.selected_subitems = true;
463
464			//Mise a jour de l'attribut selected
465			this.selected = true;
466
467
468		}		
469		
470		//Si IE7 et IE8
471		if(this.map.browser == 'MSIE' && (this.map.browser_version == '7' || this.map.browser_version == '8')){
472		
473			if(this.map.mode == this.type){
474			
475				this.draw(this.selected);
476		
477			}
478		} else {
479			
480			//Si navigateurs plus evolues
481			this.updateColor();
482			
483		}
484	}
485
486	/**
487     * Dessine le chemin vectoriel de l'element et les evenements lies aux interactions avec la souris
488     *
489     */
490	this.draw = function(){
491
492		//Ajouter cet objet a la carte
493		var map_id = this.map.name + '.' + this.id;		
494					
495		this.drawColor();
496		
497		//Mettre a jour ses proprietes
498		this.map.container.map_id[0].style.cursor = 'pointer';
499		this.map.container.map_id[0].setAttribute("id",this.id);
500
501		var obj    = this.map.container.map_id;
502		var obj_id = '#'+this.map.container.map_id[0].id;
503		var label  = this.label;
504		
505		//Ajout evenement "onMouseOver"
506		this.map.container.map_id[0].onmouseover= function () {
507
508			tipText = label;
509
510			obj.attr('opacity',0.5);
511			map.container.safari();
512            // no longer usable
513			//J(tip).stop(true, true).show();
514			over = true;
515
516		};
517
518		//Ajout evenement "onMouseOut"
519		this.map.container.map_id[0].onmouseout= function () {
520
521			obj.attr('opacity',1);
522			map.container.safari();
523            // no longer usable
524			//J(tip).stop(true, true).hide();
525			over = false;
526
527		};
528		
529		//Ajout evenement "onClick"
530		var js_obj       = this;
531		var onmouseclick = this.map.onmouseclick;
532		this.map.container.map_id[0].onclick = function () {
533			onmouseclick(js_obj);
534		};
535
536	}
537
538	/**
539     * Dessine les sous-elements de l'element
540     *
541     */
542	this.drawSubitems = function(subitems){
543
544		var show_local = this.map.show_local;
545
546		//Tracage des elements si la vue n'est pas locale ou si ils font partie de la vue locale
547		if((show_local && this.local) || !show_local){
548
549			this.subitems.draw(subitems);
550
551		}
552	}
553
554
555	/**
556     * Deselectionne l'element
557     *
558     */
559	this.unselect = function(){
560
561		var selection = false;
562
563		//Mise a jour de l'attribut de selection du composant
564		this.applySelection(selection);
565
566	}
567
568	/**
569     * Chargement des sous-elements deja selectionnes
570     *
571     */
572	this.loadSelectedSubitems = function(selSubitemsTab){
573		
574		if(selSubitemsTab.length > 0){
575			//Chargement des sous-elements deja selectionnes
576			this.subitems.loadSelectedSubitems(selSubitemsTab);
577			//Mise a jour de l'element courant en fonction du statut de ses sous-elements
578			this.update();
579		}
580	}
581
582}
583
584
585//Composant jsMapItemsTab
586jsMapItemsTab = function (map, json_items){
587
588	this.map          = map;
589	this.type         = json_items.type;
590	this.json_items   = json_items.tab;
591
592	this.tab          = new Array();
593
594	for(var i = 0, c = this.json_items.length; i < c; i++){
595
596		//Position de l'element dans le tableau
597		var pos = this.tab.length;
598
599		//Recuperation des donnnes parsees a partir du format JSON
600		var json_subitems = this.json_items[i].subitems;
601
602		//Creation des sous-elements
603		var subitems_tab = new jsMapSubItemsTab(this.map, pos, json_subitems);
604
605		//Creation de l'element
606		var item = null;
607		item = new jsMapItem(this.json_items[i], this.map, this.type, pos, subitems_tab);
608
609		//Ajout de l'element au tableau des elements
610		this.tab[pos] = item;
611
612	}
613
614	/**
615     * Charge les sous-elements devant etre pre-selectionnes
616     *
617     */
618	this.update = function(){
619
620		for (var i = 0, c = this.tab.length; i < c; i++) {
621
622			this.tab[i].update();
623
624		}
625
626	}
627
628	/**
629     * Dessine les elements references dans le tableau des elements
630     *
631     */
632	this.draw = function (map){
633
634		if(map.mode == this.type){
635
636			for (var i = 0, c = this.tab.length; i < c; i++) {
637
638				var item_selection = '';
639
640				if(map.items.tab[i].id){
641
642					item_selection = map.items.tab[i].selection;
643
644				}
645
646				this.tab[i].draw(item_selection);
647
648			}
649
650		} else {
651
652			for (var i = 0, c = this.tab.length; i < c; i++) {
653
654				this.tab[i].drawSubitems(map.items.tab[i]);
655
656			}
657		}
658	}
659
660	/**
661     * Deselectionne l'ensemble des elements contenus dans le tableau des elements
662     *
663     */
664	this.unselect = function (){
665
666		for (var i = 0, c = this.tab.length; i < c; i++) {
667
668			this.tab[i].unselect();
669
670		}
671	}
672
673
674	/**
675     * Charge les sous-elements devant etre pre-selectionnes
676     *
677     */
678	this.loadSelectedSubitems = function(selSubitemsTab){
679
680		if(selSubitemsTab.length > 0){
681
682			for (var i = 0, c = this.tab.length; i < c; i++) {
683
684				//Chargement des sous-elements deja selectionnes
685				this.tab[i].loadSelectedSubitems(selSubitemsTab);
686
687			}
688		}
689	}
690
691}
692
693
694
695//Composant jsMap
696
697jsMap = function (map_json, onmouseclick, browser_name, browser_version){
698
699	//Initialisation des valeurs des attributs
700	this.component             = 'jsMap';
701	this.mode                  = ''; //Mode de la carte pour savoir quels elements tracer
702	this.name                  = map_json.name; //Nom de la carte
703	this.canvas_items          = map_json.canvas_items; //Parametres du canvas des elements de la carte
704	this.canvas_subitems       = map_json.canvas_subitems; //Parametres du canvas des sous elements de la carte
705	this.canvas_local_subitems = map_json.canvas_local_subitems; //Parametres du canvas des elements de la carte en mode affichage local
706	this.features              = map_json.features; //Caracteristiques generaux de la carte
707	this.json_items            = map_json.items; //Elements de la carte au format JSON
708
709	this.show_local            = true; //Afficher les elements de la carte locale
710
711	//Recuperation des methodes pour la gestion evenementielles
712	this.onmouseclick          = onmouseclick;
713
714	//Creation des elements de la carte
715	var items                  = new jsMapItemsTab (this, this.json_items);
716	this.items                 = items;
717	
718	//Recuperation des informations sur le navigateur
719	this.browser               = browser_name;
720	this.browser_version       = browser_version;
721
722
723	/**
724     * Dessine le canvas des sous-elements a dessiner dans la vue locale
725     *
726     */
727	this.drawCanvasLocalSubitems = function (){
728
729		//Suppresion du contenu du canvas
730		J('#paper').empty();
731
732		//Initialisation de l'objet Raphael
733		this.container = Raphael("paper", +this.canvas_local_subitems.paper_width, +this.canvas_local_subitems.paper_height);
734
735		//Initialisation du canvas de l'objet Raphael
736		this.container.setViewBox(+this.canvas_local_subitems.x, +this.canvas_local_subitems.y, +this.canvas_local_subitems.width, +this.canvas_local_subitems.height, +this.canvas_local_subitems.fit);
737
738	}
739
740
741	/**
742     * Dessine le canvas des elements a dessiner dans la vue regionale
743     *
744     */
745	this.drawCanvasItems = function (){
746
747		//Suppresion du contenu du canvas
748		J('#paper').empty();
749
750		//Initialisation de l'objet Raphael
751		this.container = Raphael("paper", +this.canvas_items.paper_width, +this.canvas_items.paper_height);
752
753		//Initialisation du canvas de l'objet Raphael
754		this.container.setViewBox(+this.canvas_items.x, +this.canvas_items.y, +this.canvas_items.width, +this.canvas_items.height, +this.canvas_items.fit);
755
756	}
757
758	/**
759     * Dessine le canvas des sous-elements a dessiner dans la vue departementale
760     *
761     */
762	this.drawCanvasSubitems = function (){
763
764		//Suppresion du contenu du canvas
765		J('#paper').empty();
766
767		//Initialisation de l'objet Raphael
768		this.container = Raphael("paper", +this.canvas_subitems.paper_width, +this.canvas_subitems.paper_height);
769
770		//Initialisation du canvas de l'objet Raphael
771		this.container.setViewBox(+this.canvas_subitems.x, +this.canvas_subitems.y, +this.canvas_subitems.width, +this.canvas_subitems.height, +this.canvas_subitems.fit);
772
773	}
774
775	/**
776     * Dessine la vue "regionale"
777     *
778     */
779	this.drawItems = function (obj,mode){
780
781		//Mise a jour du mode de la carte
782		this.mode = mode;		
783		this.show_local = false;
784
785		//Tracage du canvas des elements
786		this.drawCanvasItems();
787
788		//Tracage des elements
789		this.items.draw(obj);
790
791		//Recuperation de l'objet cree
792		var obj = this;
793
794		return obj;
795
796	}
797
798	/**
799     * Dessine la vue "departementale"
800     *
801     */
802	this.drawSubitems = function (obj,mode){
803
804		//Mise a jour du mode de la carte
805		this.mode = mode;		
806		this.show_local = false;
807
808		//Tracage du canvas des sous elements
809		this.drawCanvasSubitems();
810
811		//Tracage des sous elements
812		this.items.draw(obj);
813
814		//Recuperation de l'objet cree
815		var obj = this;
816
817		return obj;
818
819	}
820
821	/**
822     * Dessine la vue "locale"
823     *
824     */
825	this.drawLocalSubitems = function (obj,mode){
826
827		//Mise a jour du mode de la carte
828		this.mode = mode;		
829		this.show_local = true;
830
831		//Tracage du canvas des sous elements
832		this.drawCanvasLocalSubitems();
833
834		//Tracage des sous elements
835		this.items.draw(obj);
836
837		//Recuperation de l'objet cree
838		var obj = this;
839
840		return obj;
841
842	}
843
844	/**
845     * Met a jour l'ensemble des elements et sous-elements composant la carte
846     *
847     */
848	this.update = function (){
849		//Mise a jour des elements et sous elements de la carte (statut "selectionne")
850		this.items.update();
851
852	}
853
854	/**
855     * Deselectionne l'ensemble des elements et sous-elements composant la carte
856     *
857     */
858	this.unselect = function(){
859		//Mise a jour des elements et sous elements de la carte (statut "selectionne")
860		this.items.unselect();
861
862	}
863
864	/**
865     * Charge l'ensemble des sous-elements de la carte devant etre pre-selectionnes
866     *
867     */
868	this.loadSelectedSubitems = function(selSubitemsTab){
869
870		if(selSubitemsTab.length > 0){
871			//Chargement des sous-elements preselectionnes
872			this.items.loadSelectedSubitems(selSubitemsTab);
873		}
874	}
875
876
877}
878
879

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.