

	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	//
	//		Script d'interface avec l'applet Kogis.
	//		Copyright (c) ESRI France, département produit
	//
	//		Révision 1.0.0.0 du 22/07/2002
	//
	//		THP - 3/12/2002 - Modification changeProjet() pour MAC
	//		THP - 25/04/2003 - Commentaires
	//		THP - 15/10/2003 - Correction BUG substring() pour Netscape
	//
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	
	// Taille par défaut de la fenetre requeteur.
	var requeteur_W = "400";
	var requeteur_H = "600";

	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	//						//HIGH LEVEL API\\
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////

	// Ouverture d'une fenetre fille du navigateur.
	// Elle est centrée en bas à droite de l'ecran si X,Y sont null
	// theURL : URL
	// W,H : Largeur, Hauteur
	// X,Y: Position (ou null)
	// wname: Nom.
	
	function openIT(theURL,W,H,X,Y, wname) 
	{
		// setup test for Nav 4.0
		var isIE = false;
		var isIE6 = false;
		var is5up = false;
		
		var isNav = (navigator.appName.indexOf("Netscape")>=0);
		var isNav4 = false;
		
		if (isNav) 
		{
			if (parseFloat(navigator.appVersion)<5) 
			{
				isNav4=true;
			} 
		} 
		else 
		{
			isIE=true;
			if ( navigator.appVersion.indexOf("MSIE 6") > 0 )
			{
				isIE6 = true;
			}
		}	
	
		var s = 'dependent=yes,resizable=yes,scrollbars=yes,directories=no,location=no,menubar=no,personalbar=no,status=no,toolbar=no';
		s = s + ",width=" + W;
		s = s + ",height=" + H;
		if (X==null) X=Math.ceil( (window.screen.width-W-25)  );
		if (Y==null) Y=Math.ceil( (window.screen.height-H-75) );
		
		if ( theURL == "jsplib/requeteur.jsp" )
		{
			requeteur_W = W;
			requeteur_H = H;
		}
		
		if ( false ) // ( isIE6 )
		{
			var theWin = open( 
				'',
				wname,
				s
			);
			theWin.moveTo(Math.ceil(X),Math.ceil(Y));
			theWin.focus();
			
		// Modification : Pour faire attendre ...
			theWin.document.writeln( "<html><head><title>Chargement</title></head>" );
			theWin.document.writeln( '<body>' );
			theWin.document.writeln( '<center><br>Chargement en cours ...<br><br>' );
			theWin.document.writeln( '<img src="/Kogis/images/anime/download.gif"><br>' );
			theWin.document.writeln( "</center>" );
			theWin.document.writeln( "<script>" );
			theWin.document.writeln( "	document.location = '" + theURL + "';" );
			theWin.document.writeln( "</script>" );
			theWin.document.writeln( "</body></html>" );
			theWin.document.close();
		}
		else
		{
			var theWin = open( 
				theURL,
				wname,
				s
			);
			theWin.moveTo(Math.ceil(X),Math.ceil(Y));
			theWin.focus();
		}
				
		return theWin;
	}

	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
		
	// Position courante de la souris en coordonnées CARTE
	var currentX = "0";
	var currentY = "0";
	
	// Distance par défaut utilisée dans la recherche par proximité
	// [4/6/2003] Placer 0 permet de bénéficier du paramétrage coté serveur.
	var currentDistance = "0";
	
	// Callback utilisateur appellée lors de chaque ajout/retrait de fonction
	// dans l'applet (Utilisé par exemple pour changer l'état des boutons de la toolbar
	// en fonction de la fonction courante
	// Cette fonction à le prototype:
	// function cb(currentFunction)
	//     ou currentFunction est le nom de la classe de la fonction active, ou ""
	
	var callbackIHM = null;
	
	// CallBAck utilisateur appelée pour chaque évenement.
	// Cette fonction peut traiter l'evènement et rendre
	//		true pour arreter le traitement par defaut
	//		false pour autoriser le traitement par défaut
	
	var callbackUSER = null;
	
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	// Fonction par défaut de traitement des evènements de l'applet.
	// Le code est explicite quand aux traitemements réalisés.
	// Voir le JAVADOC, classe com.esrifrance.kogis.client.KogisApplet
	// méthode "getEvent" pour la liste des évènements rendus par l'applet
	//
	function doEvent( applet, e )
	{	
		if ( applet == null ) return;

		// Laisser à l'utilisateur le choix ...
		if ( callbackUSER != null )
		{
		 	if ( callbackUSER( e ) == true ) 
		 		return;
		}
		
		if ( e == "STARTUP:OK" || e == "STARTUP:ERR" )
		{
			if ( e == "STARTUP:ERR" )
			{
				alert( "Une erreur interdit le lancement de l'application\nLe serveur est probablement surchargé, quittez le navigateur et réessayez" );
			}
		}
		else
		if ( e == "IMAGE:OK" )
		{
			if ( MVAppletOV != null )
				MVAppletOV.LoadImage();
		}
		else
		if ( e == "IMAGE:ERR" )
		{
			alert( "La carte n'a pas pu être affichée\nLe serveur est probablement surchargé\nUtilisez la fonction 'Rafraichir'" );
		}
		else
		if ( e == "MOUSE:CLIC" )
		{
			if ( applet.getValue("ActiveLayer") != "" )
				findALL();
		}
		else
		if ( e == "SELECTED_OBJECT" )
		{
			if ( applet.getValue("ActiveLayer") != "" )
				findSelected( applet.getValue("SELECTED_OBJECT") );
		}
		else
		if ( e == "MOUSE:MOVE" )
		{
			var x = applet.getValue("MouseX");
			var y = applet.getValue("MouseY");
			currentX = applet.screenToMapXAsString(x);
			currentY = applet.screenToMapYAsString(y);
		}		
		else
		if ( e == "FUNCTION:REMOVED" || e == "FUNCTION:ADDED" )
		{
			var fName = applet.getValue("CurrentFunction");
			if ( callbackIHM != null ) callbackIHM( fName );
		}
		else
		{
			var sEvent = new String( e );
			if ( sEvent.length >= 16 )
			{
				var tmp = sEvent.substr(0,16);
				if ( tmp == "OBJECTPROPERTIES" )
				{
					// OBJECTPROPERTIES
					getProperties( e );
				}
			}
			if ( sEvent.length >= 12 )
			{
				var tmp = sEvent.substr(0,12);
				if ( tmp == "FIdentifyEx:" )
				{
					doFIdentifyEx( sEvent.substr(12) );
				}
			}
			if ( sEvent.length >= 13 )
			{
				var tmp2 = sEvent.substr(0,13);
				if ( tmp2 == "FSelectionEx:" )
				{
					doFIdentifyEx2( sEvent.substr(13), true );
				}
			}
		}
	}

	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	// Execute the commands sent from the AppletOV :
	// COMMAND:ZoomRect
	//		Or
	// COMMAND:PanToXY
	
	function doEventOV( appletOV, eOV )
	{
		if (eOV.substring (0,7) == "COMMAND") 
		{
			//alert (eOV.substring (8));
			doMVCmd(eOV.substring (8));
		}
	}

	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	// Ouverture d'une fenetre fille contenant l'image de la légende
	//
	function openLegend()
	{
		var applet = MVApplet;
		if ( applet == null ) 
		{
			var url = getApplicationURL();
			url = url + "/servlet/com.esrifrance.kogis.server.KogisServlet?";
			url = url + "cmd=getlegend&lw=" + "200" + "&lh=" + "20";
			url = url + "";
			var legendWin = openIT(url, 250, 500, null, null, 'Legende');
		}
		else
		{		
			var legendWin = openIT(applet.getLegendURL("200","20"), 250, 500, null, null, 'Legende');
		}
	}
 

	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	// Ouverture d'une fenetre fille contenant l'image de l'overview
	//

	function openOV()
	{
		var applet = MVApplet;
		if ( applet == null ) 
		{
			var url = getApplicationURL();
			url = url + "/servlet/com.esrifrance.kogis.server.KogisServlet?";
			url = url + "cmd=getOV&ow=" + "250" + "&oh=" + "250";
			url = url + "";
			var ovWin = openIT(url, 300, 300, null, null, 'VueGlobale');
		}
		else
		{
			var ovWin = openIT(applet.getOVURL("250","250"), 300, 300, null, null, 'VueGlobale');
		}
	}

	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	// Ouverture d'une fenetre fille contenant les couches avec la possibilité
	// de les activer/désactiver
	//

	function openLayerLegend()
	{
		openIT('jsplib/legend.jsp', 400, 550, null, null, 'Couches');
		return;
	}
	
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	// Ouverture d'une fenetre fille contenant les couches 
	// avec leur représentation thématique avec la possibilité
	// de les activer/désactiver et de modifier le rendu thématique
	//
	function openLayerTheme()
	{
		openIT('theme/legend_theme.jsp', 650, 550, null, null, 'Couches');
		return;
	}

	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	//						
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////

	// Fonction permettant de positionner la couche active et de lancer
	// la fonction d'identification. Elle a plusieurs effets:
	//		Elle place le layer actif
	//		Elle indertit à l'utilisateur de le changer via le menu contextuel
	//		Elle place l'applet en mode "Generation clic" (Génération d'un évenement
	//		"CLIC" lors de la sélection d'un objet.
	//		Elle quitte TOUTES les fonctions de l'applet
	//		Elle lance la fonction d'identification
	// "dist" est la distance par défaut utilisée lors de la sélection par proximité
	//
	function doSelect(layer,dist)
	{
		if ( dist != null )
			currentDistance = dist;
		else
			currentDistance = "0";
			
		var applet = MVApplet;
		if ( applet == null ) return;

	// Tout pour bloquer sur le layer
		applet.setValue( "ActiveLayer", layer );
		applet.setValue( "CanChangeActiveLayer", "0" );
		applet.setValue( "GenerateClicEvent", "1" );
		doMVDynamicFunction('');
		doMVDynamicFunction('com.esrifrance.kogis.client.functions.FIdentify');
	}

	// Fonction permettant de lancer la fonction d'identification en autorisant
	// la modification du layer actif par l'utilisateur
	// Elle a plusieurs effets:
	//		Elle AUTORISE l'utilisateur à changer le layer actif via le menu contextuel
	//		Elle place l'applet en mode "Generation clic" (Génération d'un évenement
	//		"CLIC" lors de la sélection d'un objet.
	//		Elle quitte TOUTES les fonctions de l'applet
	//		Elle lance la fonction d'identification
	//

	function doSelectALL()
	{
		doSelectALLEx( '1' );
	}
	
	//
	// Idem ci-dessus, mais permet de passer en mode "sélection seule" sans
	// apparition de la fiche attributaire (identify="0")
	//
	
	function doSelectALLEx(identify)
	{
		var applet = MVApplet;
		if ( applet == null ) return;

		// Tout déblocage!
		applet.setValue( "CanChangeActiveLayer", "1" );
		applet.setValue( "GenerateClicEvent", "1" );
		doMVDynamicFunction('');
		doMVDynamicFunction('com.esrifrance.kogis.client.functions.FIdentify?' + identify);
	}

	//
	// Cette fonction permet d'envoyer la commande "gomme" (Effacement de toutes les sélections)
	//

	function clearSelection()
	{
		doMVCmd( "clearSelection" );
	}
	
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	//		Autres
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////

	// Taille par défaut des fenetres filles
	var defaultFicheW = 600;
	var defaultFicheH = 350;
	
	// Ouverture d'une fiche 
	function openFiche(url,W,H)
	{
		if ( W == null ) W = defaultFicheW;
		if ( H == null ) H = defaultFicheH;
		openIT(url, W, H, null, null, 'fiche1');
	}
	
	// Idem, mais avec un nom
	function openNamedFiche(url,W,H,name)
	{
		if ( W == null ) W = defaultFicheW;
		if ( H == null ) H = defaultFicheH;
		openIT(url, W, H, null, null, name);
	}

	// Cette fonction permet de traiter la sélection par clic au sein de l'applet
	// Elle utilise le layer actif, la position de la souris et recherche les objets
	// en X,Y et ouvre la fiche attributaire
	
	function findALL()
	{
		var applet = MVApplet;
		if ( applet == null ) return;

		var id = doMVTextRequest( 
			"getObjectIDByLocation" +
			"&objectClass=" + escape(applet.getValue( "ActiveLayer" )) +
			"&X=" + escape(currentX) + 
			"&Y=" + escape(currentY) + 
			"&D=" + escape(currentDistance)
		);
		if ( id != "" )
		{
			// alert(id);
			// [THP:31/10/2002] Modifications pour gérer la sélection multiple		
			var objectID = "";
			var res = Tokenize(id,"\r\n");
			var i = 0;
			for ( i = 0; i < res.length; i++ )
			{
				if ( res[i] != "" )
				{
					var tok = Tokenize(res[i],"|");
					if ( tok.length >= 2 )
					{
						if ( objectID != "" ) objectID += "|";
						objectID += tok[1];
					}
				}
			}
			var url = applet.getServletURL();
			url += "&htmlrequest=getObjectAttribute";
			url += "&objectClass=" + escape(applet.getValue( "ActiveLayer" ));
			url += "&objectID=" + escape(objectID);
			openIT( url, defaultFicheW, defaultFicheH, null, null, 'FicheObjet' );
			// Le voir!
			doMVCmd( 
				"addObjectToSelection&objectClass=" + 
				escape(applet.getValue( "ActiveLayer" )) + 
				"&objectID=" + escape(objectID) + "&zoomTo=1" 
			);
		}
		else
			alert( "pas d'objet trouvé : " + applet.getValue( "ActiveLayer" ) );
	}

	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	// Cette fonction permet de sélectionner et d'obtenir la fiche attributaire
	// d'un objet dont l'identifiant est "id"
	// Elle utilise le layer actif,  et ouvre la fiche attributaire

	function findSelected(id)
	{
		var applet = MVApplet;
		if ( applet == null ) return;
		if ( id != "" )
		{
			var url = applet.getServletURL();
			url += "&htmlrequest=getObjectAttribute";
			url += "&objectClass=" + escape(applet.getValue( "ActiveLayer" ));
			url += "&objectID=" + escape(id);
			openIT( url, defaultFicheW, defaultFicheH, null, null, 'FicheObjet' );
			// Le voir!
			doMVCmd( 
				"addObjectToSelection&objectClass=" + 
				escape(applet.getValue( "ActiveLayer" )) + 
				"&objectID=" + escape(id) + "&zoomTo=1" 
			);
		}
		else
			alert( "pas d'objet trouvé : " + applet.getValue( "ActiveLayer" ) );
	}

	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	// Ouverture de la fiche attributaire d'un objet 
	// en modification

	function getProperties(id)
	{
		var applet = MVApplet;
		if ( applet == null ) return;
		
		if ( id != "" )
		{
			var res = Tokenize(id,"|");
			if ( res.length < 3 )
			{
				alert( "Kogis_ext.getProperties: invalid id" );
				return;
			}
		
			var objectClass = res[ 1 ];
			var objectId = res[ 2 ];
			var url = applet.getServletURL();
			url += "&htmlrequest=getObjectAttribute";
			url += "&objectClass=" + escape(objectClass);
			url += "&objectID=" + escape(objectId);
			url += "&mode=modify";
			openIT( url, defaultFicheW, defaultFicheH, null, null, 'FicheAttributaire' );
		}
		else
		{
			alert( "Kogis_ext.getProperties: invalid id" );
		}
	}
	
	
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	// Traite l'évènement "FIdentifyEx" en sélectionnant les objets
	// puis en ouvrant la fiche attributaire.
	// Vous pouvez modifier ce comportement en réécrivant cette fonction
	// et en trappant l'evènement.
	//
	function doFIdentifyEx(sCoord)
	{
		doFIdentifyEx2(sCoord,false);
	}
	
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	// L'amélioration de la même fonction....
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
		
	function doFIdentifyEx2(sCoord, selectOnly)
	{
		var applet = MVApplet;
		if ( applet == null ) 
			return;
		if ( sCoord == "" )
			return;
		if ( applet.getValue( "ActiveLayer" ) == "" )
		{
			alert( "Pas de couche active" );
			return;
		}
		var sTabCoord = Tokenize(sCoord,"|");
		if ( sTabCoord.length < 2 )
		{
			alert( "doIdentifyEx: Parameters invalid" );
			return;
		}

	// POINT ???
		if ( sTabCoord.length == 2 )
		{
			var id = doMVTextRequest( 
				"getObjectIDByLocation" +
				"&objectClass=" + escape(applet.getValue( "ActiveLayer" )) +
				"&X=" + escape(sTabCoord[0]) + 
				"&Y=" + escape(sTabCoord[1]) + 
				"&D=0"
			);
			if ( id != "" )
			{
				var objectID = "";
				var res = Tokenize(id,"\r\n");
				var i = 0;
				for ( i = 0; i < res.length; i++ )
				{
					if ( res[i] != "" )
					{
						var tok = Tokenize(res[i],"|");
						if ( tok.length >= 2 )
						{
							if ( objectID != "" ) objectID += "|";
							objectID += tok[1];
						}
					}
				}
				if ( !selectOnly )
				{
					var url = applet.getServletURL();
					url += "&htmlrequest=getObjectAttribute";
					url += "&objectClass=" + escape(applet.getValue( "ActiveLayer" ));
					url += "&objectID=" + escape(objectID);
					openIT( url, defaultFicheW, defaultFicheH, null, null, 'FicheObjet' );
				}
				// Le voir!
				doMVCmd( 
					"addObjectToSelection&objectClass=" + 
					escape(applet.getValue( "ActiveLayer" )) + 
					"&objectID=" + escape(objectID) + "&zoomTo=1" 
				);
			}
			
			// Ok.
			return;
		}
		
		// Ligne ou polygone ....
		var spatialfilter = "GEOMETRY:";
		var spatialend = "";
		if ( sTabCoord[0] == sTabCoord[ sTabCoord.length-2 ] && sTabCoord[1] == sTabCoord[ sTabCoord.length-1 ] )
		{
			spatialfilter += "<POLYGON><RING>";
			spatialend = "</RING></POLYGON>";
		}
		else
		{
			spatialfilter += "<POLYLINE><PATH>";
			spatialend = "</PATH></POLYLINE>";
		}
		
		for ( i = 0; i < sTabCoord.length; i += 2 )
		{
			spatialfilter += '<POINT x="' + sTabCoord[i] + '" y="' + sTabCoord[i+1] + '"/>';
		}
		spatialfilter += spatialend;

		// Fiche attributaire ...
		if ( !selectOnly )
		{
			var url = applet.getServletURL();
			url += "&htmlrequest=getObjectAttribute";
			url += "&objectClass=" + escape(applet.getValue( "ActiveLayer" ));
			url += "&objectBufferClass=" + escape(spatialfilter);
			url += "&bufferDistance=0";
			openIT( url, defaultFicheW, defaultFicheH, null, null, 'FicheObjet' );
		}
				
		// Le voir!
		doMVCmd( 
			"addObjectToSelection&objectClass=" + 
			escape(applet.getValue( "ActiveLayer" )) +
			"&bufferDistance=0" +
			"&objectBufferClass=" + escape(spatialfilter) + "&zoomTo=1" 
		);
	}
	
	
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	// Cette fonction permet de changer de site Kogis en 
	// gardant le même extent sur la carte
	// Projet est le nom de l'application web ( "atlas" )
	// Le prérequis est que la page de l'application soit "index.jsp"
	//
	function changeProjet( projet )
	{
		var applet = MVApplet;
		if ( applet == null )
		{
			var newurl = "/" + projet + "/index.jsp?scriptable=no";
			document.location = newurl;
		}
		else
		{
			var newurl = "/" + projet + "/index.jsp?Cmd=";
			var x1 = applet.getValue("MinX");
			var x2 = applet.getValue("MaxX");
			var y1 = applet.getValue("MinY");
			var y2 = applet.getValue("MaxY");
			newurl += escape("ZoomRect&xmin=" + x1 + "&ymin=" + y1 + "&xmax=" + x2 + "&ymax=" + y2);
			document.location = newurl;
		}
	}

	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	// 
	// Cette méthode permet de récupérer la fenetre possédant l'applet.
	// Trés utile dans des pages JSP pour obtenir la page de l'applet
	// et pouvoir ainsi appeler les fonctions JAVASCRIPT opérant sur celle
	// ci.
	//
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	
	function getTopAppletWindow()
	{
		var win = self.opener;
		for (;;)
		{
			if ( win == null )
				return null;
			if ( win.document.applets["MicroViewer"] != null )
				return win;
			if ( win.document.forms["KOGISMAIN"] != null )
				return win;
			win = win.opener;
		}
	}
	

	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	// Initialise la variable callbackIHM (Voir l'aide sur cette variable)
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////

	function initCallbackIHM( f )
	{
		callbackIHM = f;
	}
	
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	// recherche les caractères non valide;renvoie 1 si tout bon
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////

	function checkForGoodChar( s )
	{
		// / * ? < >
		if (s.indexOf("/") > -1) return 0;
		if (s.indexOf("*") > -1) return 0;
		if (s.indexOf("?") > -1) return 0;
		if (s.indexOf("<") > -1) return 0;
		if (s.indexOf(">") > -1) return 0;
		if (s.indexOf("\\") > -1) return 0;
		if (s.indexOf("\"") > -1) return 0;
		
		return 1;
	}	
	
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	// test si une chaine est un numérique, renvoie 1 si nb
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////

	function checkIsNumber( s )
	{
		// / * ? < >
		if (s.search(/^[0-9]*$/)  > -1 ) return 1;
		return 0;
	}	
	
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	// test si une chaine est une date jj/mm/[aa/aaaa], renvoie 1 si date
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////

	function checkIsDate( s )
	{
		// / * ? < >
		if (chaine.search(/^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{2,4}$/) != -1) return 1;
		return 0;
	}	
