	////////////////////////////////////////////////////////////////////////////////////
	// Put here all the functions used to manage forms
	////////////////////////////////////////////////////////////////////////////////////
	var f64;
	var firefox = false;
	var OS, browser, version, thestring, place;
	var userAgentDetected = navigator.userAgent.toLowerCase();	
	var defaultBadBrowserMessage = "!!! Bad browser !!!";
	var isBadBrowserForm = true;
	
	// Initialisation Browser informations
	setBrowserInfos();

	////////////////////////////////////////////////////////////////////////////////////	
	function setBrowserInfos( ) {
	
		if (checkIt('konqueror'))
		{
			browser = "Konqueror";
			OS = "Linux";
		}
		else if (checkIt('safari'))
		{ 
			browser = "Safari";
			isBadBrowserForm = false;
		}
		else if (checkIt('omniweb'))
		{
			browser = "OmniWeb";
		}
		else if (checkIt('opera'))
		{
			browser = "Opera";
			isBadBrowserForm = false;
		}
		else if (checkIt('webtv'))
		{
			browser = "WebTV";
		}
		else if (checkIt('icab'))
		{
			browser = "iCab";
		}
		else if (checkIt('msie'))
		{ 
			browser = "Internet Explorer";
			isBadBrowserForm = false;
		}
		else if (!checkIt('compatible'))
		{
			browser = "Netscape Navigator";
			version = userAgentDetected.charAt(8);
			isBadBrowserForm = false;
		}
		else 
		{
			browser = "An unknown browser";
		}
		// Permet de mettre la valeur du champ dans l'innerHTML (à cause de Firefox)
		if ((browser=='Safari') || (browser=='Opera') || (document.getElementById && !document.all)) {
			firefox = true;
		}
	}

	////////////////////////////////////////////////////////////////////////////////////
	function checkIt(string)
	{
		place = userAgentDetected.indexOf(string) + 1;
		thestring = string;
		return place;
	}

	////////////////////////////////////////////////////////////////////////////////////
	// Check if the browser is valid
	////////////////////////////////////////////////////////////////////////////////////
	function checkBrowserValidityForm( ) {
		checkBrowserValidity(defaultBadBrowserMessage);
	}

	////////////////////////////////////////////////////////////////////////////////////	
	function checkBrowserValidity( errorMessage ) {
		if(isBadBrowserForm==true)
		{
			alert(errorMessage);
		}
	}

	////////////////////////////////////////////////////////////////////////////////////
	// returns plaintext from an array of bytesrepresenting dezimal numbers, which
	// represent an UTF-8 encoded text; browser which does not understand unicode
	// like NN401 will show "?"-signs instead
	// expects an array of byterepresenting decimals; returns a string
	////////////////////////////////////////////////////////////////////////////////////
	function utf8d2t(d) {
		var r=new Array; var i=0;
		while(i<d.length) {
			if (d[i]<128) {
				r[r.length]= String.fromCharCode(d[i]); i++;}
			else if((d[i]>191) && (d[i]<224)) {
				r[r.length]= String.fromCharCode(((d[i]&31)<<6) | (d[i+1]&63)); i+=2;}
			else {
				r[r.length]= String.fromCharCode(((d[i]&15)<<12) | ((d[i+1]&63)<<6) | (d[i+2]&63)); i+=3;}
			}
		return r.join("");
	}

	////////////////////////////////////////////////////////////////////////////////////
	function b64arrays() {
		var b64s='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
		b64 = [];f64 =[];
		for (var i=0; i<b64s.length ;i++) {
			b64[i] = b64s.charAt(i);
			f64[b64s.charAt(i)] = i;
		}
	}

	////////////////////////////////////////////////////////////////////////////////////
	function b64t2d(t) {
		b64arrays();
		var d=[]; var i=0;
		// zur decodierung die Umbrueche killen
		t=t.replace(/\n|\r/g,""); t=t.replace(/=/g,"");
		while (i<t.length) {
			d[d.length] = (f64[t.charAt(i)]<<2) | (f64[t.charAt(i+1)]>>4);
			d[d.length] = (((f64[t.charAt(i+1)]&15)<<4) | (f64[t.charAt(i+2)]>>2));
			d[d.length] = (((f64[t.charAt(i+2)]&3)<<6) | (f64[t.charAt(i+3)]));
			i+=4;
		}
		if (t.length%4 == 2)
			d = d.slice(0, d.length-2);
		if (t.length%4 == 3)
			d = d.slice(0, d.length-1);
		return d;
	}

	////////////////////////////////////////////////////////////////////////////////////
	function decodeBase64 (str) {
		return utf8d2t(b64t2d(str));
	}
	
	////////////////////////////////////////////////////////////////////////////////////
	// suppression du lien PRINT lors de la sauvegarde du formulaire et autres actions ...
	////////////////////////////////////////////////////////////////////////////////////
	function saveInnerHTML () {

		// reconnaissance du browser type
		var ns4=document.layers;
		var ns6=document.getElementById && !document.all;
		var ie4=document.all;

		var pattern;
		var str;
		var doc = document.getElementById('innerhtmlblock');

		// rendre les champs DISABLED (non modifiable ; ATTENTION disabled = illisible)
		var tab = doc.getElementsByTagName('INPUT');
		for (var i=0;i<tab.length;i++) {
			var inp = tab[i];
			if ( inp && (inp.type != 'hidden') ) {
				inp.disabled = true;
			}
		}
		tab = doc.getElementsByTagName('TEXTAREA');
		//on prends toujours l'element 0 car le substitute elimine un element dans le tableau a chaque fois
		//var len = tab.length;
		//for (var i=0;i<len;i++) {
		while ( tab ) {
			var inp = tab[0];
			if ( inp ) {
				substitute(inp);
			}
			else {
				break;
			}
		}
		tab = doc.getElementsByTagName('SELECT');
		for (var i=0;i<tab.length;i++) {
			var inp = tab[i];
			inp.disabled = true;
		}
		// remove SCRIPT
		tab = doc.getElementsByTagName('SCRIPT');
		while ( tab ) {
			var inp = tab[0];
			if ( inp ) {
				inp.parentNode.removeChild(inp);
				//tab = doc.getElementsByTagName('SCRIPT');
			}
			else {
				break;
			}
		}
		// suppression de l'icone de PRINT
		tab = document.getElementById('printblock');
		if ( tab ) {
			var inp = tab;
			inp.parentNode.removeChild(inp);
		}
		// suppression du message d'erreur (Données manquantes ou incorrectes)
		tab = document.getElementById('divtodelete');
		if ( tab ) {
			var inp = tab;
			inp.parentNode.removeChild(inp);
		}
		// remplacement des IMG par le text décodé
		// url : http://lblcmsadev:4302/author/main/fr/home/der_tcs/zeitung/shop.ImageText..Sk9VUk5BTCBUT1VSSU5H.TITRE3_MAJ.002E74.FFFFFF...gif
		// 1.- ajouter le TEXT
		tab = doc.getElementsByTagName('IMG');
		for (var i=0;i<tab.length;i++) {
			var inp = tab[i];
			var astr = inp.getAttribute('src');
			if ( astr.lastIndexOf('ImageText..') > -1 ) {
				astr = astr.substring(astr.lastIndexOf('ImageText..') + 'ImageText..'.length);
				// type d'image : TITRE1, TITRE3_MAJ, ...
				var atype = astr.substring(astr.indexOf('.')+1);
				atype = atype.substring(0, atype.indexOf('.'));
				// le titre lui-meme
				astr = astr.substring(0, astr.indexOf('.'));
				var newel;
				if ( atype == 'TITRE1' )
					newel = document.createElement("H2");
				//if ( atype == 'TITRE3_MAJ' )
				else
					newel = document.createElement("H3");
				newel.innerHTML = decodeBase64(astr);
				inp.parentNode.appendChild(newel);
			}
		}
		// 2.- effacer les IMG
		// il faut ruser pour effacer (c'est compliqué, mais c'est à ce prix)
		tab = doc.getElementsByTagName('IMG');
		while ( tab ) {
			var inp = tab[0];
			if ( inp ) {
				inp.parentNode.removeChild(inp);
				//tab = doc.getElementsByTagName('IMG');
			}
			else {
				break;
			}
		}
		str = document.getElementById('innerhtmlblock').innerHTML;

		// deplacer les Personal Data du BAS vers le HAUT du formulaire
		str = movePersonalData(str);
		
		// A FAIRE EN DERNIER
		// remplacement de la font RED par font BLACK causees par donnees manquantes
		pattern = "color=red";
		str = replaceAll(str, pattern, 'color=black');
		// idem avant mais pour firefox
		pattern = 'color="red"';
		str = replaceAll(str, pattern, 'color="black"');
		// idem pour etre sur
		pattern = "color='red'";
		str = replaceAll(str, pattern, 'color=black');
		// idem pour etre sur
		pattern = "COLOR: red";
		str = replaceAll(str, pattern, 'COLOR: black');
		// PGR 20-06-2007
		// Opera version 9.21
		pattern = 'color="#ff0000"';
		str = replaceAll(str, pattern, 'COLOR: black');

		// inserer le CSS en tete
		var style = '';
		// charger le HIDDEN avec le code modifié
		document.getElementById('innerhtmlcode').value = style + str;

		// remettre les champs ENABLED (lisible)
		tab = doc.getElementsByTagName('INPUT');
		for (var i=0;i<tab.length;i++) {
			var inp = tab[i];
			if ( inp && (inp.type != 'hidden') ) {
				inp.disabled = false;
			}
		}
		tab = doc.getElementsByTagName('SELECT');
		for (var i=0;i<tab.length;i++) {
			var inp = tab[i];
			inp.disabled = false;
		}
	}
	
	////////////////////////////////////////////////////////////////////////////////////	
	function substitute (obj) {
		var ns6=document.getElementById && !document.all;
		var astr = obj.value;
		// 1.- créer nu HIDDEN avec la value du TEXTAREA
		var newel = document.createElement("INPUT");
		newel.setAttribute('name', obj.getAttribute('name'));
		newel.setAttribute('id', obj.getAttribute('id'));
		newel.setAttribute('type', 'HIDDEN');
		newel.setAttribute('value', astr);
		obj.parentNode.appendChild(newel);
		// 2.- formater la value
		var tab;
		if ( ns6 ) {
			tab = astr.split("\n");
		}
		else {
			tab = astr.split("\r\n");
		}
		astr = tab.join('<br>');
		// 3.- remplacer le TEXTAREA par SPAN
		newel = document.createElement("SPAN");
		newel.innerHTML = astr;
		obj.parentNode.replaceChild(newel, obj);
	}

	////////////////////////////////////////////////////////////////////////////////////
	//  Remplace toutes les occurences d'une chaine
	////////////////////////////////////////////////////////////////////////////////////
	function replaceAll(str, search, repl) {
	  while (str.indexOf(search) != -1) {
	    str = str.replace(search, repl);
	  }
	  return str;
	}
	
	////////////////////////////////////////////////////////////////////////////////////	
	function movePersonalData (str) {
		// PGR 06-02-07
		// CMS_UAT_000301	
		var obj = document.getElementById('personaldata');
		if ( obj != null ) {
			var pd = obj.innerHTML;
			str = str.replace(pd, '');
			// PGR 20-06-2007
			// dans Safari, l'innerHTML ne contient pas les commentaires javascript
			// on a donc créé une <div> vide pour remplacer (cf surtitre.jsp)
			if ( browser == 'Safari' ) {
			  // en majuscule !!...
			  str = str.replace('<DIV id="replacebypersonaldata"></DIV>', pd);
			}
			else {
			  str = str.replace('<!--replacebypersonaldata-->', pd);
			}
		}
		return str;
	}
	
	////////////////////////////////////////////////////////////////////////////////////
	function setSelected(obj) {
		if ( firefox ) {
			var opts = obj.options;
			var idx = obj.selectedIndex;
			var value = obj.options[obj.selectedIndex].value;
			for(var i=0;i<opts.length;i++) {
				var opt = opts[i];
				var val = opt.value;
				if ( value == val ) {
					opt.setAttribute('selected', 'selected');
				}
			}
		}
	}

	////////////////////////////////////////////////////////////////////////////////////	
	function setChecked(obj) {
		if ( firefox ) {
			obj.removeAttribute('checked');
			if ( obj.checked )
				obj.setAttribute('checked', 'checked');
		}
	}

	////////////////////////////////////////////////////////////////////////////////////	
	function setDefaultValue(obj) {
		if ( firefox ) {
			obj.innerHTML = obj.value;
		}
	}

	////////////////////////////////////////////////////////////////////////////////////	
	function setValue(obj) {
		if ( firefox ) {
			obj.setAttribute('value', obj.value);
		}
	}

