

	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	//
	//		Script d'interface avec l'applet Kogis.
	//		Copyright (c) ESRI France, département produit
	//
	//		Révision 1.0.0.0 du 22/07/2002
	//
	//		Révision 1.0.0.1 du 28/10/2002 - THP - Gestion des navigateurs
	//			applet non scriptable ...
	//
	//		Révision 1.0.0.2 du 24/11/2002 - THP - ajout DecodeBase64()
	//			+ modifications pour utilisation de "href" au lieu de OnClick()
	//
	//		Révision 1.0.0.3 du 25/4/2003 - THP - Commentaires sur les fonctions.
	//
	//		Révision 1.0.0.4 du 14/5/2004 - THP - rajout userCallBackTimer qui permet
	//									    de définir une fonction qui sera appelée sur le timer
	//										interne de Kogis
	//
	//		Révision 1.0.0.5 du 23/11/2005 - THP - Ajout de la fonction initMVAppletWithJSCallBack
	//		qui permet de passer à un mode de gestion des évènements par "CallBack" au lieu
	//		du timer. [Pb JRE 1.5]
	//
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////

	// variables internes
	var MVRootURL = null;	

	var MVApplet = null;
	var MVCallBack = null;

	var MVAppletOV = null;
	var MVCallBackOV = null;
	
	var userCallBackTimer = null;
	
	// Fonction interne
	function fnMVTimeOut()
	{
		var applet = MVApplet;
		if ( applet == null || MVCallBack == null ) 
		{
			return;
		}
		
		var e = applet.getEvent();
		while ( e != "" ) 
		{
			// La méthode.
			MVCallBack(MVApplet,e);
			
			// Au suivant!
			e = applet.getEvent();
		}

		// Process the events sent from the AppletOV
		if ( MVAppletOV != null && MVCallBackOV != null )
		{
			var eOV = MVAppletOV.getEvent();
			while ( eOV != "" )
			{
				// La méthode.
				MVCallBackOV(MVAppletOV,eOV);
				// Au suivant!
				eOV = MVAppletOV.getEvent();
			}
		}
			
		if ( userCallBackTimer != null )
			userCallBackTimer();
						
		self.setTimeout( "fnMVTimeOut()", 25 );
	}

	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////

	// Fonction interne
	function fnMVFirstTimeOut()
	{
		var applet = MVApplet;
		if ( applet == null || MVCallBack == null ) 
		{
			return;
		}
		
	// OK pour la boucle ...			
		self.setTimeout( "fnMVTimeOut()", 25 );
	}

	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	//						PUBLIC API
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////

	//	Cette fonction execute une commande de type "cmd" sur la servlet et regénère l'image
	//  Les commandes de type "cmd" sont décrites dans le JAVADOC Kogis, 
	//  classe com.esrifrance.kogis.server.KogisServlet, méthode "doKogisServletRequest"
	//	Exemple : doMVCmd( "ZoomScale&x=123543&y=132543&scale=1500" );
	
	function doMVCmd(cmd)
	{
		var applet = MVApplet;
		if ( applet == null ) 
		{
			// [1.0.0.1] Recharger le document...
			var url = "";
			url = MVRootURL + "&Cmd=" + escape(cmd);
			document.location = url;
			return;
		}
		applet.doCmd( cmd );
	}

	//	Cette fonction execute une fonction interne à Kogis 
	//  La paramètre className est le nom de la classe à executer dans l'applet
	//  La liste des classes fournies en standard est décrite dans le JAVADOC Kogis:
	//  Ce sont les classes du paquetage "com.esrifrance.kogis.client.function"
	//	Exemple : doMVDynamicFunction( "com.esrifrance.kogis.client.functions.FIdentify" );
	//            lance la fonction d'identification
	
	function doMVDynamicFunction(className)
	{
		var applet = MVApplet;
		if ( applet == null ) return;
		var res = applet.doDynamicFunction( className );
		return;
	}

	//	Cette fonction execute une commande de type "txtrequest" sur la servlet et rend en 
	//  résultat le texte rendu par le serveur.
	//  Les commandes de type "txtrequest" sont décrites dans le JAVADOC Kogis, 
	//  classe com.esrifrance.kogis.server.KogisServlet, méthode "doKogisServletRequest"
	//	Exemple : doMVTextRequest( "getObjectIDByLocation&objectClass=Parcelle&x=123543&y=132543" );
	//            permet de récupérer les identifiants des objets "Parcelle" 
	//            sur la coordonnée précisée
	
	function doMVTextRequest( cmd )
	{
		var applet = MVApplet;
		if ( applet == null ) return "";
		var res = applet.doTextRequest( cmd );
		return res;
	}

	// Cette fonction rend la racine de l'URL de l'application
	// Par exemple: /atlas pour l'application "atlas"
	
	function getApplicationURL()
	{
		var s = MVRootURL;
		var result = "/";
		var i = 0;
		for (i = 1; i < s.length; i++) 
		{
			if ( s.charAt(i) == '/' )
				break;
			result = result + s.charAt(i);
		}
		return result;
	}
	
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	//
	// 	String API - Facilite le traitement des
	//	résultats renvoyés par le serveur Kogis
	//
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	
	// Cette fonction rend un tableau formé des sous chaines de "item"
	// délimité par le caractere "delimiter"
	
	function Tokenize(item,delimiter) 
	{
		  tempArray=new Array(1);
		  var Count=0;
		  var tempString = new String(item);
		
		  while ( tempString.indexOf(delimiter) > 0 ) 
		  {
		    tempArray[Count] = tempString.substr(0,tempString.indexOf(delimiter));
		    tempString = tempString.substr(
	    		tempString.indexOf(delimiter)+1,
	    		tempString.length-tempString.indexOf(delimiter)+1
		    ); 
		    Count=Count+1
		  }
		  tempArray[Count]=tempString;
		  return tempArray;
	}

	// Cete fonction remplace dans str les ocuurences de "quoi"
	// par "parquoi" et rend le résultat
	
	function charReplace(str,quoi,parquoi) 
	{
		  var resString = new String( "" );
		  var tempString = new String(str);
		  var i = 0;
		  for ( i = 0; i < tempString.length; i++ )
		  {
		  		if ( tempString.charAt( i ) == quoi )
		  			resString += parquoi;
		  		else
		  			resString += tempString.charAt( i );
		  }
		  return resString;
	}

	// Code la chaine "str" en chaine compatible pour être placé dans une URL
	// Elle remplace les caracteres "+" par le codage correspondant, ce que ne fait
	// pas par défaut la fonction "escape".
	
	function escapeWithPlus(str)
	{
		return charReplace( escape(str), "+", "%2B" );
	}

	// Decode la chaine "str" en chaine standard
	// Elle est la réciproque de la fonction escapeWithPlus
	
	function unescapeWithPlus(str)
	{
		return unescape( charReplace( str, "+", " " ) );
	}

	// Cette fonction decode la chaine "str", qui est en base64.
	// Le codage en "base64" est souvent utilisé par le serveur Kogis pour
	// rendre des résultats sans avoir de problêmes de "codage"
		
	function DecodeBase64( str )
	{
		var result = "";
		var i = 0;
		var x;
		var shiftreg = 0;
		var count = -1;
		for (i=0; i < str.length; i++) 
		{
			c = str.charAt(i);
			if ('A' <= c && c <= 'Z')
				x = str.charCodeAt(i) - 65;
			else if ('a' <= c && c <= 'z')
				x = str.charCodeAt(i) - 97 + 26;
			else if ('0' <= c && c <= '9')
				x = str.charCodeAt(i) - 48 + 52;
			else if (c == '+')
				x = 62;
			else if (c == '/')
				x = 63;
			else
				continue;
	
			count++;
	
			switch (count % 4) {
			case 0:
				shiftreg = x;
				continue;
			case 1:
				v = (shiftreg<<2) | (x >> 4);
				shiftreg = x & 0x0F;
				break;
			case 2:
				v = (shiftreg<<4) | (x >> 2);
				shiftreg = x & 0x03;
				break;
			case 3:
				v = (shiftreg<<6) | (x >> 0);
				shiftreg = x & 0x00;
				break;
			}
			result = result + String.fromCharCode(v);
		}
		return result.toString();
	}

	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	//  Désactiver le menu contextuel de netscape qui
	//  interfère avec celui de l'applet ...
	// Appelée par initMVApplet()
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	
	function disableNetscapeContextMenu()
	{
		if (parseInt(navigator.appVersion)>3 && navigator.appName=="Netscape") 
		{
			document.oncontextmenu = function() { 
					return false;
			}
			// Modif AGA [Mdp - 25/10/2005]
			if ( parseInt(navigator.appVersion) < 5 )
			{	
				if (document.layers) 
				{
					window.captureEvents(Event.MOUSEDOWN);
					window.onmousedown = function(e) { 
						if(e.target==document)
							return false;
					}
				}
				else 
				{
					document.onmousedown = function() {
						return false;
					}
				}
			}
		}
	}	

	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	// Code langue du navigateur sur 
	// deux caractères
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	
	function MVGetLanguage()
	{
		// Trouver la langue du client.
		var l = "fr";
		if (typeof(navigator.language) != "undefined")
			l = navigator.language;
		else 
		if (typeof(navigator.userLanguage) != "undefined")
			l = navigator.userLanguage;
		else 
		if (typeof(navigator.browserLanguage) != "undefined")
			l = navigator.browserLanguage;
		return l.substring(0,2);
	}
	
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	//
	// Initialisation
	//
	// Cette fonction doit être appelé par la page PRINCIPALE de
	// l'application (contenant l'applet). 
	// L'appel se fait sur le body onLoad="initPage();">
	// 
	// function initPage()
	// {
	//		// Traitement de evenements par la fonction par défaut
	//		var cb = doEvent;
	//		// L'applet
	//		var applet = document.applets["MicroViewer"];
	//		initMVApplet( applet, cb, "<%=sPageUrl%>" );
	// }
	//
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	
	function initMVApplet(applet, event_callback, document_url)
	{
		disableNetscapeContextMenu();
		// Les parametres.
		MVRootURL   = document_url;
		MVApplet	= applet;
		MVCallBack 	= event_callback;
		if ( MVCallBack != null )
		{
			self.setTimeout( "fnMVFirstTimeOut()", 1500 );
		}
	} 

	//////////////////////////////////////////////////////////////
	//
	//
	// Initialisation
	// Idem ci dessus, mais avec gestion des évènement par CallBack
	// Javascript à la place du timer()
	//
	//////////////////////////////////////////////////////////////
	
	function initMVAppletWithJSCallBack(applet, event_callback, document_url)
	{
		disableNetscapeContextMenu();
		// Les parametres.
		MVRootURL   = document_url;
		MVApplet	= applet;
		MVCallBack 	= event_callback;
		if ( MVApplet != null )
		{
			MVApplet.setJSEventCallBack(  'KogisEventCallBack' , 0);
		}
	} 

	//////////////////////////////////////////////////////////////
	//
	// Fonction de CallBAck pour KogisApplet.
	//
	//////////////////////////////////////////////////////////////
	
	function KogisEventCallBack( evt )
	{
		if ( MVCallBack != null )
			MVCallBack(MVApplet,evt);
	}

	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	// Initialisation dans le cas de la présence de l'applet KogisOVApplet
	//
	// Cette fonction doit être appelé par la page PRINCIPALE de
	// l'application (contenant l'applet). 
	// L'appel se fait sur le body onLoad="initPage();">
	// 

	function initMVAppletOV(applet, event_callback)
	{
		MVAppletOV	= applet;
		MVCallBackOV = event_callback;
	}	

	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	// La même mais avec CallBack JavaScript
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////

	function initMVAppletOVWithJSCallBack(applet, event_callback)
	{
		MVAppletOV	= applet;
		MVCallBackOV = event_callback;
		if ( MVAppletOV != null )
		{
			MVAppletOV.setJSEventCallBack(  'KogisOVEventCallBack' , 0);
			//alert( 'initMVAppletOVWithJSCallBack' );
		}
	}	


	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	// Fonction de CallBAck pour KogisOVApplet.
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	
	function KogisOVEventCallBack( evt )
	{
		//alert( 'KogisOVEventCallBack:' + evt );
		if ( MVCallBackOV != null )
			MVCallBackOV(MVAppletOV,evt);
	}

	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	//		//END PUBLIC API\\
	//////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////
	
		
