﻿//db.js

// Création 26/11/2005 
// Révision 05/12/2005 
// Regroupper les routines nécessaires pour interroger dom et générer des fragments XML à destination des scripts de traitement.

// petite fonction utilitaire pour faire des balises
function bal(s)
{
	return "<" + s + ">";
}



// fonction getAppendForm
// Création 27/11/2005 
// Révision 27/11/2005 
// Cette fonction est chargée de parser un container regrouppant des champs de formulaire.
// Le résultat de ce parse est un fragment XML
// Le format de sortie est :
/*
<root>
	<append>
		<message>
			<nom>Toto Cutugno</nom>
			<email>toto@cutugno</email>
			<msg>Le corps du message</msg> 
		</message>
	</append>
</root>

*/
// acontainer est la coquille regrouppant les champs de type input ou autre
// recname est le nom des enregistrements, comme concert, message, ou info...
// 28/11/2005
function getAppendForm(acontainer,recname)
{
	xml=bal("root");
		// Requête APPEND
		xml=xml+bal("append");
			
			xml=xml+bal(recname);
		
			// L'ensemble des champs
			container=document.getElementById(acontainer);
			xml=xml+extractNode(container.getElementsByTagName('input'));
			xml=xml+extractNode(container.getElementsByTagName('textarea'));
			
			xml=xml+bal("/"+recname);
			
		xml=xml+bal("/append");

	xml=xml+bal("/root");

	return xml;
}



// fonction getUpdateForm
// Création 26/11/2005 
// Révision 27/11/2005 
// Cette fonction est chargée de parser un container regrouppant des champs de formulaire.
// Le résultat de ce parse est un fragment XML
// Le format de sortie est :
/*
<root>
	<update>
		<recno>12</recno>
		<recname>message</recname>
		<fieldset>
			<nom>Toto Cutugno</nom>
			<email>toto@cutugno</email>
			<msg>Le corps du message</msg> 
		</fieldset>
		<collections
			<mots_cle>
				<mot_cle>Un</mot_cle>
				<mot_cle>Deux</mot_cle>
				<mot_cle>Troisième</mot_cle>
			</mots_cle>
		</collections>
	</update>
</root>

*/
// acontainer est la coquille regrouppant les champs de type input ou autre
// recname est le nom des enregistrements, comme concert, message, ou info...
// recno est le n° d'ordre de la fiche
function getUpdateForm(acontainer,recname,recno)
{
	xml=bal("root");
		// Requête UPDATE
		xml=xml+bal("update");
			
			xml=xml+bal("recno");
				xml=xml+recno;
			xml=xml+bal("/recno");

		
			xml=xml+bal("recname");
				xml=xml+recname;
			xml=xml+bal("/recname");
			
			// L'ensemble des champs
			xml = xml + extractForm(acontainer)
			
		xml=xml+bal("/update");

	xml=xml+bal("/root");
	return xml;	
}


// 24/11/2005 Cette fonction va rendre une chaine xml contenant les donnes des champs contenus dans anodeset
// <nom>Toto Cutugno</nom><email>toto@cutugno</email>
function extractNode(anodeset)
{
	xml="";
	for (i=0; i < anodeset.length; i++)
	{
		xml=xml+bal(anodeset[i].id);					
		xml=xml + anodeset[i].value ;
		xml=xml+bal("/" + anodeset[i].id);					
	}	
	
	return xml;
}

function extractSelect(acontainer)
{
	xml="";
	nodeset = acontainer.getElementsByTagName("select")
	//alert(nodeset.length);
	for (i=1; i < nodeset.length; i++)
	{
		current=nodeset[i];
		if (current.id)
		{
			xml=xml+bal(current.id);
			options = current.getElementsByTagName("option");
			alert(options.length);
			for (j=0; j < options.length; j++)		
			{
				// pour être compatible ie et firefox avec le ou exclusif
				cln = (options[j].className || options[j].getAttribute("class"));
				xml=xml+bal(cln);
					xml = xml + options[j].firstChild.nodeValue; // Ceci fonctionne...
				xml=xml+bal("/"+cln);
			}
			xml=xml+bal("/"+current.id);
		}
	}
	//alert("contenu de xml : "+ xml);
	return xml;
}


// 24//11/2005
// Approche vers une unification des traitements de données issues de formulaires...
// Le container est un div identifié, qui contiens des champs.
// Compiler les données dans une chaîne xml avec le format : (par exemple)
//
// <fieldset>
//	<nom>Toto Cutugno</nom>
//	<email>toto@cutugno</email>
//	<msg>Le corps du message</msg> 
// </fieldset>
//
// La fonction renvoie la chaîne xml
// La fonction appelle l'utilitaire bal() et extractNode(anode)
function extractForm(acontainer) // Et rend un fieldset xml
{
	container=document.getElementById(acontainer);
	xml=bal("fieldset");
	xml=xml+extractNode(container.getElementsByTagName('input'));
	xml=xml+extractNode(container.getElementsByTagName('textarea'));
	xml=xml+bal("/fieldset");
	
	xml+=bal("collections");
	xml=xml+extractSelect(container);	// Qui contiennent les collections
	xml+=bal("/collections");

	return xml;
}

// 03/12/2005 Ajouter un chaîne à la collection
// col : id de la collection
// opt : nom des c_item
// avalue : le texte ajouté
// 05/12/2005 Pas de doublons.
function addToCollection(col,opt,avalue)
{
	//alert('dans addToCollection : ' + col + ' ' + opt + ' ' + avalue);
	
	
	thecol=document.getElementById(col);
	theopt=thecol.getElementsByTagName('option');
	cible=-1;
	//alert(cible);
	// Rechercher l'indice de l'élément
	for (i=0;i<theopt.length;i++)
		if (theopt[i].firstChild.nodeValue==avalue)
			cible=i;
	
	if (cible < 0)
	{
		newopt = document.createElement("option");
		aclass = document.createAttribute("class");
		aclass.nodeValue = opt;
		newopt.setAttributeNode(aclass);
		newopt.appendChild(document.createTextNode(avalue));
		thecol.appendChild(newopt);
	}
}

// 05/12/2005 Suprimer un élément de la collection
// col : id de la collection
// opt : nom des c_item
// avalue : le texte ajouté
// Révision 05/12/2005
function removeFromCollection(col,avalue)
{
	thecol=document.getElementById(col);
	theopt=thecol.getElementsByTagName('option');
	cible=-1;
	// Rechercher l'indice de l'élément
	for (i=0;i<theopt.length;i++)
		if (theopt[i].firstChild.nodeValue==avalue)
			cible=i;

	// Si l'indice pointe sr un élément, le suprimer
	if (cible >= 0)
	{
		//alert(cible + ' dans removeFromCollection, supression de :' + theopt[cible].firstChild.nodeValue);
		thecol.removeChild(theopt[cible]);
	}
}

// 05/12/2005 Modifier un élément de la collection
// col : id de la collection
// oldvalue : nom des c_item
// newvalue : le texte ajouté
// Révision 05/12/2005
function replaceInCollection(col,oldvalue,newvalue)
{
	//alert(oldvalue+" "+newvalue);
	thecol=document.getElementById(col);
	theopt=thecol.getElementsByTagName('option');
	cible=-1;
	// Rechercher l'indice de l'élément
	for (i=0;i<theopt.length;i++)
		if (theopt[i].firstChild.nodeValue==oldvalue)
			theopt[i].firstChild.nodeValue=newvalue;
}
