/* ----------------------------------------------------------------------
CONSTANTES
---------------------------------------------------------------------- */

	var URL_CARLYSOFT = "http://www.carly-sa.fr/carlysoft/";

/* ----------------------------------------------------------------------
Support linguistique.
  
 	L'objet Language peut être utilisé par tous les programmes
	Il exploite un fichier dont le nom est celui de la page avec 
	l'extension .res (mais c'est un fichier xml).
	Les messages sont identifiés par un numéro.
	Les messages de 1 à 99 doivent être identiques dans tous les
	fichiers .res
---------------------------------------------------------------------- */

var Admin = false;

try {Language = new apsLanguage();}
catch(Err) {alert(Err.message);};


function apsLanguage(File) {
	if(!File) {File = "carlysoft.xml";}

	try {
		if(NavIsIe()) {
			this.doc = new ActiveXObject("Microsoft.XMLDOM");
			this.doc.async = false;
		}
		if(NavIsOpera() || NavIsFf()) {
			this.doc = document.implementation.createDocument("", "doc", null);
			this.doc.async = false;
		}
		if(NavIsSafari()){
			Ajx = new XMLHttpRequest();
		}
	}
	catch(Err) {throw new Error("Support linguistique : Navigateur non compatible.");}

	try {	
		if(NavIsIe())
			{this.doc.load(File);}
		if(NavIsOpera())
			{this.doc.load(File);}
		if(NavIsFf()) {
			var XmlLoaded = false;
			this.doc.onload = function() {XmlLoaded=true;}
			this.doc.load(File);
			while(!XmlLoaded) {};
		}
		if(NavIsSafari()){
			Ajx.open("GET", File, false);
			Ajx.send();
			this.doc = Ajx.responseXML;
		}
	}
	catch(Err) {throw new Error("Support linguistique : Impossible de charger le fichier linguistique " + File);}

/*
	var XmlLoaded = false;
	if (window.ActiveXObject){
		this.doc = new ActiveXObject("Microsoft.XMLDOM");
	}
	else if(document.implementation.createDocument){
		this.doc = document.implementation.createDocument("", "doc", null);
		this.doc.onload = function() {XmlLoaded=true;}
	}
	else {
		throw new Error("Support linguistique : Navigateur non compatible.");
	}

	this.doc.async = false;

	try {this.doc.load(File);}
	catch(Err){throw new Error("Support linguistique : Impossible de charger le fichier linguistique " + File);}
	if(!this.doc.firstChild) 
		{throw new Error("Support linguistique : le fichier "+File+" est incorrect.");}

	if(NavIsFf())
		{while(!XmlLoaded) {};}
*/
	try {this.Lang = this.doc.getElementsByTagName("Data")[0].getAttribute("Lang");}
	catch(Err){throw new Error("Support lingtuistique : la syntaxe du fichier " + File + " est incorrecte.");}

	this.GetTxt = function(No,Params) {
		if(!this.doc)
			{return "Fichier linguistique introuvable.";}
		var Nodes = this.doc.getElementsByTagName("Text");
		var Node=null;
		for(var N=0;N<Nodes.length;N++)
			{if(Nodes[N].getAttribute("Id")==No){Node = Nodes[N];}}
		if(!Node)
			{return "Support linguistique : Le message n° " + No + " n'existe pas dans " + File;}			

		var Text = ""
		if(Node.firstChild)	{var Text = Node.firstChild.nodeValue;}

		if(Params) {
			if(Params instanceof Array) {
				for(No=0; No<Params.length; No++)
					{Text = Text.replace(/#/i, Params[No]);}
			}
			else
				{Text = Text.replace(/#/i, Params);}
		}
		return Text.replace("¶","<br/>");
	}
}

/* ------------------------------------------------------------
Traitements XML

	L'objet ApsXmlFile charge un fichier XML et publie un
    objet doc comportant toutes les méthodes habituelles de
    traitement d'un document XML (getElementByTagName par ex)
------------------------------------------------------------ */

function ApsXmlFile(XmlFile) {
	this.FileName = XmlFile;

	try {
		if(NavIsIe()) {
			this.doc = new ActiveXObject("Microsoft.XMLDOM");
			this.doc.async = false;
			if(XmlFile) {this.doc.load(XmlFile);}
		}
		if(NavIsOpera()) {
			this.doc = document.implementation.createDocument("", "doc", null);
			this.doc.async = false;
			if(XmlFile) {this.doc.load(XmlFile);}
		}	
		if(NavIsFf()) {
			var XmlLoaded = false;
			this.doc = document.implementation.createDocument("", "doc", null);
			this.doc.onload = function() {XmlLoaded=true;}
			this.doc.async = false;
			if(XmlFile) {this.doc.load(XmlFile);}
			while(!XmlLoaded) {};
		}
		if(NavIsSafari()){
			var Ajx = false;
			Ajx = new XMLHttpRequest();
			if(XmlFile) {
				Ajx.open("GET", XmlFile, false);
				Ajx.send();
				this.doc = Ajx.responseXML;
			}
		}
	}
	catch(Err){throw new Error(Language.GetTxt(2, XmlFile));}

/*
	var XmlLoaded = false;
	if (window.ActiveXObject){
		this.doc = new ActiveXObject("Microsoft.XMLDOM");
	}
	else if(document.implementation.createDocument){
		this.doc = document.implementation.createDocument("", "doc", null);
		this.doc.onload = function() {XmlLoaded=true;}
	}
	else {throw new Error(Language.GetTxt(1));} // Navigateur non compatible

	this.doc.async = false;
	if(XmlFile) {
		try{this.doc.load(XmlFile);}
		catch(Err){throw new Error(Language.GetTxt(2, XmlFile));}
	}

	if(NavIsFf())
		{while(!XmlLoaded) {};}
*/
}

/* ------------------------------------------------------------
Gestion des cookies

	SetCookie et GetCookie : deux fonctions pratiques pour
	manipuler les cookies du document actif.	
------------------------------------------------------------ */

function GetCookie(NomCookie){
	if (document.cookie == "") { return "" ;}
	var NomCookie = "; " + NomCookie + "=";
	var DocCookies = "; " + document.cookie;
	var Deb = DocCookies.indexOf(NomCookie);
	if(Deb == -1)  { return "" ;} else {Deb += NomCookie.length;}
	var Fin = DocCookies.indexOf(";", Deb);
	if (Fin == -1) {Fin = DocCookies.length}
	return unescape(DocCookies.substring(Deb, Fin));
}

function SetCookie(NomCookie, ValCookie, NbJours) {
	if(NbJours){
		Expiration = new Date();
		Expiration.setDate(Expiration.getDate()+NbJours);
		document.cookie = NomCookie+"="+escape(ValCookie)+"; expires="+Expiration.toGMTString();
	}
	else
		{document.cookie = NomCookie+"="+escape(ValCookie);}
}
/* ----------------------------------------------------------------------
	Initialisation du formulaire de saisie des critères
---------------------------------------------------------------------- */
function InitLstHtml(Obj, Xml, ElementName){
	Obj.length=0;
	Opts = Xml.getElementsByTagName(ElementName);
	for(var NoOpt=0; NoOpt<Opts.length; NoOpt++)
		{Obj.options[Obj.length] = new Option(Opts[NoOpt].firstChild.nodeValue,Opts[NoOpt].getAttribute("Id"));}
	Obj.value = GetCookie(ElementName);
}
function InitLst(Obj, Xml, ElementName){
	Obj.length=0;
	Opts = Xml.getElementsByTagName(ElementName);
	for(var NoOpt=0; NoOpt<Opts.length; NoOpt++)
		{Obj.options[Obj.length] = new Option(Opts[NoOpt].firstChild.nodeValue,Opts[NoOpt].getAttribute("Id"));}
	Obj.value = GetCookie(ElementName);
}
function InitTxt(Obj, ElementName){
	Obj.value = GetCookie(ElementName);
}
function InitLstCpMarque(Obj){
	Obj.length=0;
	var Xml = new ApsXmlFile("../data/compresseurs.xml");
	var Data = Xml.doc.getElementsByTagName("Data")[0];
	Opts = Data.getElementsByTagName("Compresseur");
	for(var NoOpt=0; NoOpt<Opts.length; NoOpt++)
		{Obj.options[Obj.length] = new Option(Opts[NoOpt].getAttribute("Marque"),Opts[NoOpt].getAttribute("Marque"));}
	Obj.value = GetCookie("CpMarque");
}
function InitLstCpRef(Obj, CpMarque){
	Obj.length=0;
	var Xml = new ApsXmlFile("../data/compresseurs.xml");
	var Data = Xml.doc.getElementsByTagName("Data")[0];
	Opts = Data.getElementsByTagName("Compresseur");
	for(var NoCp=0; NoCp<Opts.length; NoCp++){
		if(Opts[NoCp].getAttribute("Marque") == CpMarque){
			Refs = Opts[NoCp].getElementsByTagName("Ref");
			for(var NoRef=0; NoRef<Refs.length; NoRef++)
				{Obj.options[Obj.length] = new Option(Refs[NoRef].firstChild.nodeValue,Refs[NoRef].firstChild.nodeValue);}
		}
	}
	if(Obj.length == 0) {Obj.value = ""; return;}
	if(Obj.length == 1) {Obj.value = Obj.options[0].value; return;}
	if(GetCookie("CpMarque") == CpMarque) {Obj.value = GetCookie("CpRef"); return;}
	Obj.value = "";
}
/* ----------------------------------------------------------------------
	Validation des saisies
---------------------------------------------------------------------- */

function ValidLstFf(Obj){
	Obj.focus();
	if(Obj.value == "")	{throw new Error(Language.GetTxt(101));}
	SetCookie("Ff", Obj.value, 10);
}
function ValidLstTo(Obj, Ff){
	Obj.focus();
	if(Obj.value == "")	{throw new Error(Language.GetTxt(102));}
	SetCookie("To", Obj.value, 10);
}
function ValidLstTk(Obj){
	Obj.focus();
	if(Obj.value == "")	{throw new Error(Language.GetTxt(103));}
	SetCookie("Tk", Obj.value, 10);
}
function ValidTxtQo(Obj){
	Obj.focus();
	Obj.value = Obj.value.replace(/ /g, "");
	if(Obj.value == "") {throw new Error(Language.GetTxt(104));}
	Obj.value = Obj.value.replace(/,/g, ".");
	if(isNaN(Obj.value)){throw new Error(Language.GetTxt(105));}
	SetCookie("Qo", Obj.value, 10);
}
function ValidLstFiAsp(Obj){
	Obj.focus();
	if(Obj.value == "")	{throw new Error(Language.GetTxt(106));}
	SetCookie("FiAsp", Obj.value, 10);
}
function ValidLstFiRef(Obj){
	Obj.focus();
	if(Obj.value == "")	{throw new Error(Language.GetTxt(107));}
	SetCookie("FiRef", Obj.value, 10);
}
function ValidLstFiLiq(Obj){
	Obj.focus();
	if(Obj.value == "")	{throw new Error(Language.GetTxt(108));}
	SetCookie("FiLiq", Obj.value, 10);
}
function ValidLstFiOil(Obj){
	Obj.focus();
	if(Obj.value == "")	{throw new Error(Language.GetTxt(121));}
	SetCookie("FiOil", Obj.value, 10);
}
function ValidTxtMassFf(Obj){
	Obj.focus();
	Obj.value = Obj.value.replace(/ /g, "");
	if(Obj.value == "")	{throw new Error(Language.GetTxt(109));}
	Obj.value = Obj.value.replace(/,/g, ".");
	if(isNaN(Obj.value)) {throw new Error(Language.GetTxt(110));}
	SetCookie("MassFf", Obj.value, 10);
}
function ValidLstCpMarque(Obj){
	Obj.focus();
	if(Obj.value == "")	{throw new Error(Language.GetTxt(122));}
	SetCookie("CpMarque", Obj.value, 10);
}
function ValidLstCpRef(Obj){
	Obj.focus();
	if(Obj.value == "")	{throw new Error(Language.GetTxt(123));}
	SetCookie("CpRef", Obj.value, 10);
}
function ValidTxtCpVol(Obj){
	Obj.focus();
	Obj.value = Obj.value.replace(/ /g, "");
	if(Obj.value == "")	{throw new Error(Language.GetTxt(124));}
	Obj.value = Obj.value.replace(/,/g, ".");
	if(isNaN(Obj.value)) {throw new Error(Language.GetTxt(125));}
	SetCookie("CpVol", Obj.value, 10);
}
function ValidTxtCpNb(Obj){
	Obj.focus();
	Obj.value = Obj.value.replace(/ /g, "");
	if(Obj.value == "")	{throw new Error(Language.GetTxt(126));}
	Obj.value = Obj.value.replace(/,/g, ".");
	if(isNaN(Obj.value)) {throw new Error(Language.GetTxt(127));}
	SetCookie("CpNb", Obj.value, 10);
}

/* ----------------------------------------------------------------------
	Dynamique de la page
---------------------------------------------------------------------- */
function ShowResultPopup(Id) {
	Popups = document.getElementsByTagName("DIV");
	for(var No=0; No<Popups.length; No++) {
		if(Popups[No].className == "ResultPopup")
			{Popups[No].style.display="None";}
	}
	if(Id)
		{document.getElementById(Id).style.display="Block";}
}
function ShowMsg(Msg){
	document.getElementsByTagName("Html")[0].style.cursor = "Wait";
	document.getElementById("Msg").innerHTML = Msg;
	document.getElementById("Msg").style.display="Block";
	window.status = Msg;
}
function HideMsg(){
	document.getElementsByTagName("Html")[0].style.cursor = "Auto";
	document.getElementById("Msg").innerHTML = "";
	document.getElementById("Msg").style.display="None";
	window.status = "";
}
/* ----------------------------------------------------------------------
Manipulation des fichiers de produits

	Objet Product : Met à disposition les caractéristiques d'un produit
	Il se construit à partir de XmlElement : élément XML décrivant 
	le produit incluant les balises <Produit>....</Produit>
---------------------------------------------------------------------- */

ApsXmlFile.prototype.GetProductByNo = function(No)
	{return new Product(this.doc.getElementsByTagName('Produit')[No], this.FileName);}

ApsXmlFile.prototype.GetProductByRef = function(Ref){
	var Products = this.doc.getElementsByTagName('Produit');
	for(var No=0; No<Products.length; No++){
		if(NodeText(Products[No].getElementsByTagName("RefProduit")[0]) == Ref)
			{return new Product(Products[No],this.FileName);}
	}
	throw new Error(Language.GetTxt(18,Array(Ref,this.FileName)));
}
ApsXmlFile.prototype.GetGammeByCode = function(Code){
	var Gammes = this.doc.getElementsByTagName('GammeProduit');
	for(var No=0; No<Gammes.length; No++){
		if(Gammes[No].getAttribute("Id") == Code)
			{return new Gamme(Gammes[No],this.FileName);}
	}
	throw new Error(Language.GetTxt(28,Array(Code,this.FileName)));
}
ApsXmlFile.prototype.GetLength = function() {
	return this.doc.getElementsByTagName('Produit').length;
}
function Product(XmlElement, FileName){
	this.FileName = FileName;

	this.Xml = XmlElement;
	if(!this.Xml)
		{throw new Error(Language.GetTxt(22, FileName));}

	this.CodeProduit = Nz(this.Xml.getAttribute("Id"));		
	if(!this.CodeProduit)
		{throw new Error(Language.GetTxt(23, FileName));}

	this.RefProduit = NodeText(XmlElement.getElementsByTagName("RefProduit")[0]);
	if(!this.RefProduit)
		{throw new Error(Language.GetTxt(24, FileName));}

	this.GammeProduit =  NodeText(XmlElement.getElementsByTagName("GammeProduit")[0]);
	if(!this.GammeProduit)
		{throw new Error(Language.GetTxt(20, Array(this.RefProduit, "GammeProduit", FileName)));}

	this.GetCodeProduit = function(){
		return this.CodeProduit;
	}
	this.GetRefProduit = function(){
		return this.RefProduit;
	}
	this.GetGammeProduit = function(){
		var XmlEl = this.Xml.getElementsByTagName("GammeProduit");
		if(XmlEl.length > 0){return NodeText(XmlEl[0]);}
		throw new Error(Language.GetTxt(20, Array(this.RefProduit, "GammeProduit", this.FileName)));
	}
	this.GetDiamRaccords = function(){
		var XmlEl = this.Xml.getElementsByTagName("DiamRaccords");
		if(XmlEl.length > 0) {return NodeText(XmlEl[0]);}
		throw new Error(Language.GetTxt(20, Array(this.RefProduit, "DiamRaccords", this.FileName)));
	}
	this.GetTypeRaccords = function(){
		var XmlEl = this.Xml.getElementsByTagName("TypeRaccords");
		if(XmlEl.length > 0) {return NodeText(XmlEl[0]);}
		throw new Error(Language.GetTxt(20, Array(this.RefProduit, "TypeRaccords", this.FileName)));
	}
	this.GetQo = function(Ff, To){
		var XmlEls = this.Xml.getElementsByTagName("Qo");
		var OldToMax = 1000;
		var Qo = null;
		for(var No=0; No<XmlEls.length; No++) {
			var FfProd = XmlEls[No].getAttribute("Ff");
			if(!Ff)	
				{Qo = NodeText(XmlEls[No]); break;}
			if(FfProd == Ff)
				{
				if(!To)
					{Qo = NodeText(XmlEls[No]); break;}
				var ToMax = XmlEls[No].getAttribute("ToMax");
				if((To <= (ToMax*1)) && ((ToMax*1) < OldToMax)){
					OldToMax = ToMax;
					Qo = NodeText(XmlEls[No]);
				}
				else if((ToMax == "") && !Qo){
					Qo = NodeText(XmlEls[No]);
				}
			}
		}
		if(Qo) {return parseInt(Qo);}
		throw new Error(Language.GetTxt(20, Array(this.RefProduit, "Qo", this.FileName)));
	}
	this.GetMassFf = function(Ff, Tk){
		var XmlEls = this.Xml.getElementsByTagName("MassFf");
		var OldTkMax = 1000;
		var MassFf = null;
		for(var No=0; No<XmlEls.length; No++) {
			var FfProd = XmlEls[No].getAttribute("Ff");
			if(FfProd == Ff){
				var TkMax = XmlEls[No].getAttribute("TkMax");
				if((Tk <= (TkMax*1)) && ((TkMax*1) < OldTkMax)){
					OldTkMax = TkMax;
					MassFf = NodeText(XmlEls[No]);
				}
				else if((TkMax == "") && !MassFf){
					MassFf = NodeText(XmlEls[No]);
				}
			}
		}
		if(MassFf){return parseInt(MassFf);} 
		throw new Error(Language.GetTxt(20, Array(this.RefProduit, "MassFf", this.FileName)));
	}
	this.GetLibProduit = function(){
		var XmlEls = this.Xml.getElementsByTagName("LibProduit");
		for(var No=0; No<XmlEls.length; No++) {
			if(XmlEls[No].getAttribute("Lang").toUpperCase() == Language.Lang.toUpperCase())
				{return NodeText(XmlEls[No]);}
		}
		throw new Error(Language.GetTxt(20, Array(this.RefProduit, "LibProduit", this.FileName)));
	}
	this.GetDocs = function() {

		var Docs = new Array();
		var XmlEls = this.Xml.getElementsByTagName("Doc");

		for(var No=0; No<XmlEls.length; No++){
			if(XmlEls[No].getAttribute("Lang").toUpperCase() == Language.Lang.toUpperCase())
				{Docs[Docs.length] = new Document(XmlEls[No],this.FileName);}
		}
		return Docs;
	}
	this.GetVolumeMin = function(){
		var XmlEl = this.Xml.getElementsByTagName("VolumeMin");
		if(XmlEl.length > 0) {return parseInt(NodeText(XmlEl[0]));}
		throw new Error(Language.GetTxt(20, Array(this.RefProduit, "VolumeMin", this.FileName)));
	}
	this.GetVolumeMax = function(){
		var XmlEl = this.Xml.getElementsByTagName("VolumeMax");
		if(XmlEl.length > 0) {return parseInt(NodeText(XmlEl[0]));}
		throw new Error(Language.GetTxt(20, Array(this.RefProduit, "VolumeMax", this.FileName)));
	}
	this.GetComplementAsp = function(){
		var XmlEl = this.Xml.getElementsByTagName("ComplementAsp");
		if(XmlEl.length > 0) {return NodeText(XmlEl[0]);}
		return "";
	}
	this.GetComplementLiq = function(){
		var XmlEl = this.Xml.getElementsByTagName("ComplementLiq");
		if(XmlEl.length > 0) {return NodeText(XmlEl[0]);}
		return "";
	}
	this.GetK2 = function(Ff){
		var XmlEls = this.Xml.getElementsByTagName("K2");
		for(var No=0; No<XmlEls.length; No++) {
			if(XmlEls[No].getAttribute("Ff") == Ff)
				{return parseFloat(NodeText(XmlEls[No]));}
		}
		throw new Error(Language.GetTxt(20, Array(this.RefProduit, "K2", this.FileName)));
	}
	this.GetK1 = function(Ff){
		var XmlEls = this.Xml.getElementsByTagName("K1");
		for(var No=0; No<XmlEls.length; No++) {
			if(XmlEls[No].getAttribute("Ff") == Ff)
				{return parseFloat(NodeText(XmlEls[No]));}
		}
		throw new Error(Language.GetTxt(20, Array(this.RefProduit, "K1", this.FileName)));
	}
	this.GetK0 = function(Ff){
		var XmlEls = this.Xml.getElementsByTagName("K0");
		for(var No=0; No<XmlEls.length; No++) {
			if(XmlEls[No].getAttribute("Ff") == Ff)
				{return parseFloat(NodeText(XmlEls[No]));}
		}
		throw new Error(Language.GetTxt(20, Array(this.RefProduit, "K0", this.FileName)));
	}
	this.GetCompresseur = function(CpMarque, CpRef){
		var XmlEls = this.Xml.getElementsByTagName("Compresseur");
		for(var No=0; No<XmlEls.length; No++){
			if(XmlEls[No].getAttribute("Marque") == CpMarque && XmlEls[No].getAttribute("Gamme") == CpRef)
				{return true;}
		}
		return false;
	}
}
/* ----------------------------------------------------------------------
Manipulation des fichiers de produits

	Objet Document : met à disposition les caractéristiques d'un document
	Il se construit à partir de XmlElemente : élément XML décrivant
	le document incluant les balises <Doc>...</Doc>
---------------------------------------------------------------------- */

function Document(XmlElement, FileName) {
	this.FileName = FileName;
	this.Xml = XmlElement;
	if(!this.Xml)
		{throw new Error(Language.GetTxt(22, FileName));}
	this.CodeDoc = Nz(this.Xml.getAttribute("Id"));		
	if(!this.CodeDoc)
		{throw new Error(Language.GetTxt(26, FileName));}
	this.Lang = Nz(this.Xml.getAttribute("Lang"));	
	if(!this.Lang)
		{throw new Error(Language.GetTxt(27, Array(this.CodeDoc, "Lang", this.FileName)));}

	this.GetCodeDoc = function(){
		return this.CodeDoc;
	}
	this.GetLang = function(){
		return Nz(this.Xml.getAttribute("Lang"));
	}
	this.GetLibDoc = function() {
		XmlEl = this.Xml.getElementsByTagName("LibDoc");
		if(XmlEl.length > 0) {return NodeText(XmlEl[0]);}
		throw new Error(Language.GetTxt(27, Array(this.CodeDoc, "LibDoc", this.FileName)));
	}
	this.GetFichierDoc = function() {
		XmlEl = this.Xml.getElementsByTagName("FichierDoc");
		if(XmlEl.length > 0) {return NodeText(XmlEl[0]);}
		throw new Error(Language.GetTxt(27, Array(this.CodeDoc, "FichierDoc", this.FileName)));
	}
}
/* ----------------------------------------------------------------------
Manipulation des fichiers de produits

	Objet Gamme : met à disposition les caractéristiques d'une gamme de produits
	Il se construit tout seul à partir du fichier gammes.xml
---------------------------------------------------------------------- */

function Gamme(XmlElement, FileName){
	this.FileName = FileName;
	this.Xml = XmlElement;
	if(!this.Xml)
		{throw new Error(Language.GetTxt(22, FileName));}
	this.CodeGamme = Nz(this.Xml.getAttribute("Id"));		
	if(!this.CodeGamme)
		{throw new Error(Language.GetTxt(17, FileName));}

	this.GetLibGamme = function(){
		var XmlEls = this.Xml.getElementsByTagName("LibGamme");
		for(var No=0; No<XmlEls.length; No++) {
			if(XmlEls[No].getAttribute("Lang").toUpperCase() == Language.Lang.toUpperCase())
				{return NodeText(XmlEls[No]);}
		}
		throw new Error(Language.GetTxt(21, Array(this.CodeGamme, "LibGamme", this.FileName)));
	}
	this.GetDescription = function(){
		var XmlEls = this.Xml.getElementsByTagName("Description");
		for(var No=0; No<XmlEls.length; No++) {
			if(XmlEls[No].getAttribute("Lang").toUpperCase() == Language.Lang.toUpperCase())
				{return NodeText(XmlEls[No]);}
		}
		throw new Error(Language.GetTxt(21, Array(this.CodeGamme, "Description", this.FileName)));
	}
	this.GetImage = function() {
		XmlEl = this.Xml.getElementsByTagName("Image");
		if(XmlEl.length > 0) {return NodeText(XmlEl[0]);}
		throw new Error(Language.GetTxt(21, Array(this.CodeDoc, "Image", this.FileName)));
	}
	this.GetUrlGamme = function(){
		var XmlEls = this.Xml.getElementsByTagName("UrlGamme");
		for(var No=0; No<XmlEls.length; No++) {
			if(XmlEls[No].getAttribute("Lang").toUpperCase() == Language.Lang.toUpperCase())
				{return NodeText(XmlEls[No]);}
		}
		throw new Error(Language.GetTxt(21, Array(this.CodeGamme, "UrlGamme", this.FileName)));
	}
	this.GetDocs = function() {
		var Docs = new Array();
		var XmlEls = this.Xml.getElementsByTagName("Document");
		for(var No=0; No<XmlEls.length; No++){
			Docs[Docs.length] = new Document(XmlEls[No],this.FileName);
		}
		return Docs;
	}
}
/* ----------------------------------------------------------------------
Affichage des résultat

	L'objet Result conserve les produits sélectionnées
		SetProduct : défini le produit sélectionné
		AddProduct : ajoute un produit à la liste

		CreatePopup affiche la liste de produits dans un 
		DIV nommé xxxxxPopup

		CreateList est un item de la liste de produits
		dans un DIV nommé xxxxxList

		CreateResume Affiche uniquement le produit sélectionné
		dans un DIV nommé xxxxxResume
		
	Mode Debug : affiche les résultats de calcul intermédiaires
	S'active en ajoutant #debug sur une page de saisie des critères.
---------------------------------------------------------------------- */
function Result(Name, Title, Gammes){
	this.Name = Name;
	this.Title = Title;
	this.Gammes = Gammes;
	this.ErrorMsg = "";
	this.InfosMsg = "";
	this.DebugMsg = "";
	this.ShowInList = false;
	this.Qte = 1;
	this.MaxProducts = 10;
	this.Products = new Array();
	this.Docs = new Array();
	this.OnSetProduct = "";

	this.SetProduct = function(CodeProd){
		this.CurrentProduct = undefined;
		for(var N=0; N<this.Products.length; N++){
			if(this.Products[N].GetCodeProduit() == CodeProd)
				{this.CurrentProduct = this.Products[N];}
		}
		if(this.OnSetProduct != "") 
			{setTimeout(this.OnSetProduct,0);}
	}

	this.AddProduct = function(Prod){
		if(this.Products.length < this.MaxProducts){
			this.Products[this.Products.length] = Prod;
			if(!this.CurrentProduct) {this.SetProduct(Prod.GetCodeProduit());}
		}
	}
	this.GetNbProducts = function()
		{return this.Products.length;}
	this.GetNbDocs = function()
		{return this.Docs.length;}
	this.CreatePopup = function() {
		var Html = "";

		Html+= '<h1>'+this.Title+'</h1>';

		if(this.ErrorMsg != "")
			{Html+= '<p>'+this.ErrorMsg+'</p>';}

		if(this.CurrentProduct){
			Html+= '<h2>';
			Html+= this.CurrentProduct.GetRefProduit() + " &nbsp; ";
			Html+= this.CurrentProduct.GetDiamRaccords() + " &nbsp; ";
			Html+= this.CurrentProduct.GetTypeRaccords();
			Html+= '</h2>';
			if(this.CurrentProduct.GetComplementAsp())
				{Html+= '<p>'+this.CurrentProduct.GetComplementAsp()+'</p>';}
			if(this.CurrentProduct.GetComplementLiq())
				{Html+= '<p>'+this.CurrentProduct.GetComplementLiq()+'</p>';}
		}
		else
			{Html+= '<h2>'+Language.GetTxt(32)+'</h2>';}

		if(this.InfosMsg != "")
			{Html+= '<p>'+this.InfosMsg+'</p>';}

		if(this.CurrentProduct && this.Products.length > 0)
			{Html+= '<h3 class="Bouton" onclick="'+this.Name+'.SetProduct();'+this.Name+'.CreatePopup();">'+Language.GetTxt(33)+'</h3>';}		

		if(this.CurrentProduct)
			{var NbAutresProds = 1; var CurrentCodeProduit = this.CurrentProduct.GetCodeProduit();}
		else
			{var NbAutresProds = 0; var CurrentCodeProduit = 0;}
		if(this.Products.length > NbAutresProds){
			Html+= '<h3>'+Language.GetTxt(31)+'</h3>';
			Html+= '<table>';
			for(var N=0; N<this.Products.length; N++){
				if(this.Products[N].GetCodeProduit() != CurrentCodeProduit){
					Html+= '<tr>';
					Html+= '<td><li class="Bouton" onclick="'+this.Name+'.SetProduct('+this.Products[N].GetCodeProduit()+');Recalculs();">'+this.Products[N].GetRefProduit()+' &nbsp; &nbsp;</li></td>';
					Html+= '<td>'+this.Products[N].GetDiamRaccords()+' &nbsp;</td>';
					Html+= '<td>'+this.Products[N].GetTypeRaccords()+' &nbsp;</td>';
					Html+= '</tr>';
				}
			}
			Html+= '</table>';
		}

		if(this.CurrentProduct){
			Html+= '<h3>'+Language.GetTxt(30)+'</h3>';
			Html+= '<li><a class="Bouton" onclick="AffFiche('+this.Name+');">'+Language.GetTxt(35)+'</a></li>';
			var Docs = this.CurrentProduct.GetDocs();
			for(var N=0; N<Docs.length; N++)
				{Html+= '<li><a class="Bouton" href="../documents/'+Docs[N].GetFichierDoc()+'" target="_blank" style="color:#FFFFFF;">'+Docs[N].GetLibDoc()+'</a></li>';}
			Html+= '</ul>';
		}

		if(IsDebug()){
			Html+= '<P class="Debug">'+this.Name+'<br/>'+this.Gammes+'<br/>'+this.DebugMsg+'</p>';
		}
		Html+= '<p>&nbsp;</p>';
		document.getElementById(this.Name + "Popup").innerHTML = Html;

		Html = "";
		if(document.getElementById(this.Name + "Button").style.textAlign.toLowerCase()=="left")
			{var Class="CcLeft";}
		else
			{var Class="CcRight";}

		if(NavIsIe()) {var Ext = ".gif";} else {var Ext = ".png";}
		if(this.ShowInList)
			{Html+= '<img class="'+Class+'" src="../images/carlysoft/cc-on'+Ext+'" alt="'+Language.GetTxt(365)+'" onclick="'+this.Name+'.ShowInList=false;'+this.Name+'.CreatePopup()" /> ';}
		else
			{Html+= '<img class="'+Class+'" src="../images/carlysoft/cc-off'+Ext+'" alt="'+Language.GetTxt(364)+'" onclick="'+this.Name+'.ShowInList=true;'+this.Name+'.CreatePopup()" /> ';}
		Html+= this.Title;
		document.getElementById(this.Name + "Button").innerHTML = Html;
	}
	this.CreateList = function() {
		if(!this.ShowInList)
			{document.getElementById(this.Name + "List").innerHTML = ""; return;}

		if(!this.CurrentProduct)
			{document.getElementById(this.Name + "List").innerHTML = ""; return;}
		
		var Html = "";
		Html+= '<h2>'+this.Title+'</h2>';
		if(this.ErrorMsg != "")
			{Html+= '<p>'+this.ErrorMsg+'</p>';}
		if(this.Products.length > 0){
			Html+= '<p class="RefProduit">'+this.CurrentProduct.GetRefProduit()+' &nbsp;</p>';
			Html+= '<p class="DiamRaccords">'+this.CurrentProduct.GetDiamRaccords()+' &nbsp;</p>';
			Html+= '<p class="TypeRaccords">'+this.CurrentProduct.GetTypeRaccords()+' &nbsp;</p>';
			Html+= '<p class="LibProduit">'+this.CurrentProduct.GetLibProduit()+' &nbsp;</p>';
		}
		else
			{Html+= '<p>'+Language.GetTxt(32)+'</p>';}
		if(this.InfosMsg != "")
			{Html+= '<p class="Infos">'+this.InfosMsg+'</p>';}
		document.getElementById(this.Name + "List").innerHTML = Html;
	}
	this.CreateResume = function() {
		if(!this.CurrentProduct)
			{document.getElementById(this.Name + "Resume").innerHTML = ""; return;}
		var Html = "";
		Html+= '<h2>'+this.CurrentProduct.GetRefProduit()+'</h2>';
		Html+= '<p>'+this.Qte+'</p>';
		document.getElementById(this.Name + "Resume").innerHTML = Html;
	}
	this.CreateFiche = function() {
		var Gammes = new ApsXmlFile("../data/gammes.xml");
		var Gamme = Gammes.GetGammeByCode(this.CurrentProduct.GetGammeProduit());
		var Docs = Gamme.GetDocs();

		Html = "";
		Html+= '<h1>'+this.CurrentProduct.GetRefProduit()+'</h1>';
		Html+= '<h2>'+Gamme.GetLibGamme()+'</h2>';
		Html+= '<p>'+Gamme.GetDescription()+'</p>';
		if(Gamme.GetImage()){
			Html+= '<div class="visuel_produit"><div class="visuel_produit2">';
			Html+= '<img src="../images/image/'+Gamme.GetImage()+'" />';
			Html+= '</div></div>';
		}
		if(Docs.length > 0) {
			Html+='<h2>'+Language.GetTxt(30)+'</h2><div><ul>';
			for(var No=0; No<Docs.length; No++)
				{Html+= '<li><a class="Bouton" href="../documents/'+Docs[N].GetFichierDoc()+'" target="_blank" style="color:#FFFFFF;">'+Docs[N].GetLibDoc()+'</a></li>';}
			Html+='</ul></div>';
		}
		Html+='<p style="Clear:Both">&nbsp;</p>';
		document.getElementById("Fiche").innerHTML = Html;
	}
	this.CreateExport = function(w){ // ## A terminer
		w.document.write(this.Title+';');
		w.document.write(this.CurrentProduct.GetRefProduit()+';');
		w.document.write(this.CurrentProduct.GetDiamRaccords()+';');
		w.document.write(this.CurrentProduct.GetTypeRaccords()+';');
		w.document.write("\r\n");
	}
}
/* ----------------------------------------------------------------------
Utilitaires:
---------------------------------------------------------------------- */
function ShowDoc(DocName,DocFile){
	ServerUrl = URL_CARLYSOFT+"documents/"+DocFile;
	LocalPath = "../documents/"+DocFile;
	W = window.open("about:blank","Document","Width=400,Height=500");
	if(NavIsIe())
		{ShowDocIe(W,DocName,ServerUrl,LocalPath);}
	else
		{ShowDocFf(W,DocName,ServerUrl,LocalPath);}
}
function ShowDocIe(W,DocName,ServerUrl,LocalPath){
	try {W.document.location = ServerUrl;}
	catch(e) {
		try {W.document.location = LocalPath;}
		catch(e) {alert(Language.GetTxt(25,DocName));}
	}
}
function ShowDocFf(W,DocName,ServerUrl,LocalPath){
	try {W.document.location = LocalPath;}
	catch(e) {
		try {W.document.location = ServerUrl;}
		catch(e) {alert(Language.GetTxt(25,DocName));}
	}
}
function Nz(Value) {
	if(Value){return Value;} else {return "";}
}
function NodeText(Node){
	if(!Node) {return "";}
	if(!Node.firstChild) {return "";}
	if(!Node.firstChild.nodeValue) {return "";}
	return Node.firstChild.nodeValue;
}
function IsDebug(){
	return (GetCookie("Debug") != "");
}
function NavIsFf() {
	return (navigator.userAgent.indexOf("Firefox")>=0);
}
function NavIsIe() {
	return (navigator.userAgent.indexOf("MSIE")>=0);
}
function NavIsOpera() {
	return (navigator.userAgent.indexOf("Opera")>=0);
}
function NavIsSafari() {
	return (navigator.userAgent.indexOf("Safari")>=0);
}


