// CADDIE DU SITE 
// 11/10/2003 - Net-Createurs (www.net-createurs.com)

	var Cde_deb=35;
	var Cde_nrl=1;
	var Cde_max =20;
	var Cde_offset = Cde_deb + Cde_nrl;		//début des fiches "commande" dans le cookie

	function Cde_ajout(n) { 	//-- ajout d'un champ dans la database Cde_db
		this.nom = n;  //nom du champ
	}

	var Cde_db=new Array(); c=0;			//Déf. des champs
	var x="fic,nr,naf,geo,siege,presence,effectif,remeff,remglob,demande,remfin,remloc".split(',');
	for(var i in x) Cde_db[c++] = new Cde_ajout(x[i]);

// ----------------------------------------------------
// ROUTINES PUBLIQUES (utilisables depuis appel externe - modifient cook mais ne le mémorisent pas)
// -- gestion du nr de commande
// Cde_lectnr() = retourne nr de cde (ou "" si pas encore défini)
// Cde_memonr(nr) mémo du numéro de commande "nr"
// -- gestion du caddie
// Cde_lect(i,n) = lecture du champ "n" (son nom) dans la fiche nr i (0..Cde_max)
// Cde_enr(i,n,v) = mémo du contenu "v" dans le champ "n", fiche i. Retourne true si enr OK, ou false sinon
// Cde_dispo() = retourne le premier nr de fiche dispo (0..Cde_max)
// Cde_alert(n) = Alert message 'n' : 0 -> panier plein, 1= err d'enregistrement
// Cde_del(i) = effacement de la fiche i (compresse le reste du caddie). Retourne true si del OK, false sinon
// ----------------------------------------------------


// Retourne le nr de commande
// Caractère de remplissage = "-" (éliminés à la lecture), contenu cadré à droite
	function Cde_lectnr() {
		var cde=cook.substring(Cde_deb,Cde_offset);
		while(cde.length>0 && cde.charAt(0)=="-") cde = cde.substring(1);
		return cde;
	}

// Mémo Nr de commande
	function Cde_memonr(nr) {
		while(nr.length<Cde_nrl) nr="-" + nr;
		cook=cook.substring(0,Cde_deb) + nr.substring(0,Cde_nrl) + cook.substring(Cde_offset);
	}

// -- Retourne le contenu du champ "n", fiche "i" sous forme de chaine
// -- Si n introuvable ou i >= dernière fiche existante, retourne "error!"
	function Cde_lect(i,n) {
		var r="error!";
		var o=Cde_posit(i);	//offset de la fiche i
		if (o !=-1) {
			if (parseFloat(cook.substring(o,o+3)) > 3) {
				o+=3;	//posit sur début des champs
				var j=0, ok=true;
				while (ok) {
					ok= Cde_db[j].nom !=n && j<Cde_db.length-1;
					if (ok) {
						o+= parseFloat(cook.substring(o,o+3));
						j++;
					}
				}
				if (Cde_db[j].nom ==n) {	//Champ trouvé -> lect. valeur
					r=cook.substring(o+3,o+parseFloat(cook.substring(o,o+3)));
				}
			}
		}
		return r;
	}

//   enregistre la valeur "v" dans le champ de nom "n" de la fiche "i" (0..Cde_max).
//	 Si i pointe sur fiche existante -> modif du champ
//	 Si i pointe sur dernière fiche vierge -> création fiche avec autres champs vierges
//	 Si i > dernière fiche, ou champ "n" introuvable, ou longueur de fiche > 999 -> erreur.
// --- Retour : true si OK (cookie modifié), ou false en cas d'erreur (cookie pas modifié)
	function Cde_enr(i,n,v) {
		if(!v) v=''; else v= v.toString();
		var o=Cde_posit(i), ok=false;	//o pointe sur début de fiche i (ou -1 si erreur)
		if (o>=0 && v.length<994) {		//993 maxi (+3 de longueur + 3 de longeur totale = 999)
			var oi=o+3;	//pointe sur début de fiche
			var nouv= parseFloat(cook.substring(o,o+3))==3;  //true si nouvelle fiche
			var l=0,r="",t="",f="";

			// Construction dans f de la fiche, en changeant le champ "n" au passage
			for (i=0; i<Cde_db.length; i++) {
				if (!nouv) {	// fiche existe déjà
					l=parseFloat(cook.substring(oi,oi+3));		//longueur de ce champ
					r=(Cde_db[i].nom==n) ? v : cook.substring(oi+3,oi+l);
					oi+=l;
				}
				else r=(Cde_db[i].nom==n) ? v : "";	//nouvelle fiche
				t="00"+(r.length+3).toString();
				f+=t.substring(t.length-3)+r;		// champ à mémoriser, avec sa longueur
				ok=ok || Cde_db[i].nom==n;
			}

			// -- mémo fiche f
			ok=ok && f.length<997;		// Longueur totale fiche ne peut pas être > 996 + 3 cars.
			if (ok) {
				t="00"+(f.length+3).toString();
				f= t.substring(t.length-3)+f;
				if (nouv) f+="003";	//replace une fiche vierge en fin de fiches
				cook=cook.substring(0,o) + f + cook.substring(o+parseFloat(cook.substring(o,o+3)));
			}
		}
		return ok;
	}

//    retourne nr de la première fiche vierge
// -- (-1 si aucune, 0 .. Cde_max-1 sinon)
	function Cde_dispo() {
		var i=Cde_offset, a=0;
		while (parseFloat(cook.substring(i,i+3))>3) {
			i+= parseFloat(cook.substring(i,i+3));
			a++;
		}
		if (a>= Cde_max) a=-1;
		return a;
	}

// -- message d'alerte
	function Cde_alert(n) {
		var mess;
		if (n==0) {
			mess=  "Votre panier de commande est plein !\nPour enregistrer d'autres commandes, il faut d'abord retirer des articles...";
		}
		else if(n==1) {
			mess= "Une erreur interne est survenue durant l'enregistrement de votre demande.\nMerci de ré-essayer.";
		}
		if(!mess) {
			mess= "Une erreur inconnue est survenue durant l'enregistrement de votre demande.\nMerci de ré-essayer.";
		}
		alert(mess);
	}

//    Efface la fiche "i"
// --- Retour : true si OK, ou false si pb (i >= dernière fic vierge)
	function Cde_del(i) {
		var r="", l=0, ok=false;
		var o=Cde_posit(i,c);	// o pointe sur début de fiche i
		if (o>=0) {
			l=parseFloat(cook.substring(o,o+3));
			if (l>3) {
				cook=cook.substring(0,o)+cook.substring(o+l);
				ok=true;
			}
		}
		return ok;
	}

// --------------------------------------------------------
// ROUTINES INTERNES (ne pas utiliser depuis appel externe)
// --------------------------------------------------------

//-- retourne l'offset de la fiche Nr "i", ou -1 si fiche n'existe pas
// (i<0 -> retourne l'offset de la première)
	function Cde_posit(i) {
		var a=0, j=Cde_offset, ok=true, k=0;
		while (a<i & ok) {
			k=parseFloat(cook.substring(j,j+3));
			ok=(k>3);
			if (ok) {
				j+=k;
				a++;
			}
			else j=-1;
		}
	return j;
	}

