
//specificités browser
var FFBrowser = (document.implementation && document.implementation.createDocument);
var IEBrowser = window.ActiveXObject;


// ========================================================================
// Specifique Browsers
// ========================================================================

function getHttpRequest()
{
	var httpReq = null;
	if (window.XMLHttpRequest) // code for all new browsers
		httpReq = new XMLHttpRequest();
	else if (window.ActiveXObject) 	// code for IE5 and IE6
		httpReq = new ActiveXObject("Microsoft.XMLHTTP");
	return httpReq;
}

// ------------------------------------------------------------------------

function getXMLDoc(xml)
{
	var xmldoc = null;
	if (FFBrowser)
	{
		// déclaration pour Mozilla et FF
		xmldoc = document.implementation.createDocument('', '', null);
		var parser = new DOMParser();
		xmldoc = parser.parseFromString(xml, "text/xml");
	}
	else if (IEBrowser)
	{
		xmldoc = new ActiveXObject("Microsoft.XMLDOM");  
		xmldoc.loadXML(xml);
	}
	
	return xmldoc;
}

// ========================================================================
// Global  VideoNavig configuration
// ========================================================================

// ------------------------------------------------------------------------
/**
  *	Definition d'un serveur
  */

function VnCfgServer(name, address, appli, folder, pid, directory, protocol)
{
	this.name 	= name;
	this.address= address;
	this.appli  = appli;
	this.folder = folder;
	this.pid    = pid;
	this.directory=directory;
	this.protocol=protocol;
}

// ------------------------------------------------------------------------
/**
  *	Definition d'un réseau (plage d'adresses)
  */
function VnCfgNetwork(name, ipBegin, ipEnd, servers)
{
	this.name 	 = name;
	this.ipBegin = ipBegin;
	this.ipEnd   = ipEnd;
	this.servers = servers;
}

// ------------------------------------------------------------------------
/**
  *	Definition d'un domaine
  */
function VnCfgDomain(name)
{
	this.addNetwork = function (name, ipBegin, ipEnd, servers)
	{
		this.networks[this.networks.length] = new VnCfgNetwork(name, ipBegin, ipEnd, servers);
	}

	this.name = name;
	this.networks = new Array();
}

// ------------------------------------------------------------------------
/**
  *	gestion de la configuration globale
  */

function VnConfig(filename)
{
	// --------------------------------------------------------------------
	//	PUBLIC API
	// --------------------------------------------------------------------

	/* retourne le host asscoié à une addrese ip */
	/* les type de serveur peuvent être fournis pour une recherche plus fine */
	/* sinon le premier est retourné 								  */
	
	this.getTypes = function(ipAddr)
	{
		var serverTypes = array();
	}
	
	// Optimisation possible en memorisation les serveurs et adresses ip courante
	// actuellement peu de réseau, donc traitement de recherche rapide et ainsi non nécessaire
	this.getHost = function(ipAddr, serverId, userDomain)
	{
		server = this.getServer(ipAddr, serverId, userDomain);
		if (server != null)
			return server.address;
		return null;
	}
	
	this.getAppli = function (ipAddr, serverId, userDomain)
	{
		server = this.getServer(ipAddr, serverId, userDomain);
		if (server != null)
			return server.appli;
		return null;
	}
	
	this.getFolder = function (ipAddr, serverId, userDomain)
	{
		server = this.getServer(ipAddr, serverId, userDomain);
		if (server != null)
			return server.folder;
		return null;
	}
	
	this.getPid = function (ipAddr, serverId, userDomain)
	{
		server = this.getServer(ipAddr, serverId, userDomain);
		if (server != null)
			return server.pid;
		return null;
	}
	
	this.getDirectory = function (ipAddr, serverId, userDomain)
	{
		server = this.getServer(ipAddr, serverId, userDomain);
		if (server != null)
			return server.directory;
		return null;
	}
	
	this.getProtocol = function (ipAddr, serverId, userDomain)
	{
		server = this.getServer(ipAddr, serverId, userDomain);
		if (server != null)
			return server.protocol;
		return null;
	}
	
	// --------------------------------------------------------------------
	//	INTERNAL
	// --------------------------------------------------------------------

	this.currentServer = null;
	this.currentIp = null;
	
	/**
	 *	Determine si l'addresse Ip est incluse dans un range d'addresses
	 *	c'est addresss sont au format text: 192.X.Y.z et doivent donc subir un traitement particulier
	 */
	this.IPcompare = function(ip_1, ip2)
	{
		// A priori ce sont 2 chainess
		return (ip_1 == ip_2);
	}
	 
	this.IPisInRange = function(ipCheck, ipBegin, ipEnd)
	{
		var result		= true;
		var tabIp 		= ipCheck.split(".");
		var tabIpBegin	= ipBegin.split(".");
		var tabIpEnd	= ipEnd.split(".");

		for (i=0;i<4;i++)
		{
			if ((parseInt(tabIp[i],10)<parseInt(tabIpBegin[i],10)) || (parseInt(tabIp[i],10)>parseInt(tabIpEnd[i],10)))
			{
				result = false;
				break;
			}
		}
		return (result);
	}
	 
	/**
	 *	analyse du fichier XML recu 
	 **/
	this.fileReady = function(xml)
	{
		var doc = getXMLDoc(xml)
		if (doc != null)
		{
			var config = doc.documentElement;
			
			// lecture des informations liées aux domaines
			doms = config.getElementsByTagName("domain");

			// analyse de tous les domaines
			for (var i = 0; i < doms.length; i++)
			{
				_this.domains[i] = new VnCfgDomain(doms[i].getAttribute('id'));
				
				networks = doms[i].getElementsByTagName('network');
				for (var j=0; j<networks.length; j++)
				{
					var servers = new Array();
					servs = networks[j].getElementsByTagName('server');
					for (var k=0; k<servs.length; k++)
					{
						servers[k] = new VnCfgServer(servs[k].getAttribute('id'), servs[k].getAttribute('name'), servs[k].getAttribute('path'), servs[k].getAttribute('folder'), servs[k].getAttribute('pid'), servs[k].getAttribute('directory'), servs[k].getAttribute('protocol'));
					}
					_this.domains[i].addNetwork('ntwk'+j, 
												networks[j].getAttribute('ipBegin'), networks[j].getAttribute('ipEnd'),
												servers);
				}

				// la valeur par default est en dernier
				networks = doms[i].getElementsByTagName('default');
				if (networks.length == 1)
				{
					var servers = new Array();
					servs = networks[0].getElementsByTagName('server');
					for (var k=0; k<servs.length; k++)
					{
						servers[k] = new VnCfgServer(servs[k].getAttribute('id'), servs[k].getAttribute('name'), servs[k].getAttribute('path'), servs[k].getAttribute('folder'), servs[k].getAttribute('pid'), servs[k].getAttribute('directory'), servs[k].getAttribute('protocol'));
					}
					_this.domains[i].addNetwork('default', 
											networks[0].getAttribute('ipBegin'), networks[0].getAttribute('ipEnd'),
											servers);
				}
				else
					alert('CONFIG:\nPAS de serveur par default pour le domaine '+_this.domains[i].name);
			}
		}
	}

	// --------------------------------------------------------------------
	/**
	 * fonction de parsing, 
	 * recherche du serveur à utiliser en fonction de critères 
	*/
	
	this.getServer = function(ipAddr, serverId, userDomain)
	{
		var iDomain = 0;
		var iServer = 0;
		var iNetwork = 0;
		
		// si pas de domaine specifie, alors on prend le premier
		if (userDomain != null)
		{	
			// plus tard dans un autre monde
			alert("Il y a un domaine : "+userDomain);
			iDomain = 99;
		}
		
		// recherche du server en fonction de l'adresse ip
		domain = this.domains[iDomain];
		
		// recherche dans lequel les plages d'adresse est valide
		// le dernier réseau est le reseau par defaut
		for (iNetwork=0; iNetwork<domain.networks.length-1; iNetwork++)
		{
			if ( this.IPisInRange(ipAddr, domain.networks[iNetwork].ipBegin, domain.networks[iNetwork].ipEnd))
			{
				// alert('address found');
				break;
			}
		}
		
		// si pas de serveur specifie, alors on prend le premier
		if (serverId != null)
		{
			// recherche du serveur en fonction de son id 
			for (var j=0; j<domain.networks[iNetwork].servers.length; j++)
				if (domain.networks[iNetwork].servers[j].name == serverId)
				{
					iServer = j;
					break;
				}
		}
		return domain.networks[iNetwork].servers[iServer];
	}

	// --------------------------------------------------------------------
	/**
	 *	Chargement du fichier XML sous forme HttpRequest
	  **/
	this.loadXML = function (url)
	{
		var xmlhttp = getHttpRequest();

		if (xmlhttp != null)
		{
			xmlhttp.onreadystatechange = function()
			{
				// alert ('state_changed('+xmlhttp.readyState+'/'+xmlhttp.status+')');
				if (xmlhttp.readyState == 4)	// 4 = "loaded"
					if (xmlhttp.status == 200)	// 200 = OK
					{
						// alert('file loaded: ' + xmlhttp.responseText);// ...our code here...
						_this.fileReady(xmlhttp.responseText);
					}
					else
					{
						//alert("Can't read Global Config file");
						_this.getHost = null;
					}
			}
			xmlhttp.open("GET",url,true);
			xmlhttp.send(null);
		}
	}
	
	// --------------------------------------------------------------------
	/**
	 *	DEBUG: retourne la configuration lue 
	  **/
	this.toString = function()
	{
		str = '--- Config ---\n';
		
		for (var i=0; i<this.domains.length; i++)
		{
			str += 'domain: '+this.domains[i].name+'\n';
			for (var j=0; j<this.domains[i].networks.length; j++)
			{
				str += '   '+this.domains[i].networks[j].name+': ';
				str += this.domains[i].networks[j].ipBegin+' -> '+this.domains[i].networks[j].ipEnd;
				str += '\n';
				for (var k=0; k<this.domains[i].networks[j].servers.length; k++)
				{
					str += '   '+'   '+this.domains[i].networks[j].servers[k].name;
					if (this.domains[i].networks[j].servers[k].appli != null)
						str += '/'+this.domains[i].networks[j].servers[k].appli;
					str += ': ' + this.domains[i].networks[j].servers[k].address;
					str += '\n';
				}
			}
		}
		return str;
	}
	
	// --------------------------------------------------------------------
	/**
	 *	DEBUG: affichage de la configuration lue 
	  **/
	this.display = function()
	{
		alert(this.toString());
	}
	
	// --------------------------------------------------------------------
	// ------------- Constructeur ------------------------
	this.filename = filename;
	this.domains = new Array();
	var _this = this;
	
	// chargement et analyse du fichier XML de configuration
	this.loadXML(filename);
}

// ========================================================================
// Local User Informations
// ========================================================================

function VnUser()
{
	var getIpUrl = './php/getIP.php';	// constante
	
	// --------------------------------------------------------------------
	_this = this;
	this.ipAddress = '127.0.0.1';	// soit local host
	
	// --------------------------------------------------------------------
	/**
	 *	Les information sur l'IP locale sont obtenues en appelant
	  *	une methode PHP sur le serveur
	  * 	L'obtention de cette adresse n'est pas possible à partir du javascript
	  *	pour des raisons de sécurité.
	  */
	this.searchIp = function()
	{
		var request = getHttpRequest();

		if (request != null)
		{
			request.onreadystatechange = function()
			{
				if (request.readyState ==   4)	// 4 = "loaded"
					if (request.status == 200) 	// 200 = OK
					{
						var reg = new RegExp("( )", "g"); // retrait de l espace en fin d adresse
						_this.ipAddress = request.responseText.replace(reg,"");
					}
					/*else
						alert("[ip] : ERROR - Can't get client ip address !!");*/
			}
		}
		request.open("GET", getIpUrl + "?" + new Date()*Math.random(), true);
		request.setRequestHeader("Cache-Control","no-cache");
		request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		request.send(null);
	}
	
	this.searchIp();
}

// ========================================================================

