function formToDb (dbTable,formId,destinationFile,divId,submitId,validClassName,errorClassName)
{
	this.formObj 										= document.getElementById(formId);
	this.formObj.dbTable 						= dbTable;
	this.formObj.destinationFile 		= destinationFile;
	this.formObj.divId 							= divId;
	this.errorcolor									= "blue";
	
	if(validClassName)
		this.validClassName						= validClassName;
	
	if(errorClassName)
		this.errorClassName						= errorClassName;
	
	// Desactivation du formulaire
	this.formObj.onsubmit = function () { return false; };
	
	// Loop sur tout les champ et insertion des actions
	for (key=0;key<this.formObj.elements.length;key++)
	{
		var filterType 			= this.formObj.elements[key].getAttribute('filter');
		var formatType 			= this.formObj.elements[key].getAttribute('format');
		var requiredField 	= this.formObj.elements[key].getAttribute('required');
		var memClassName 		= this.formObj.elements[key].className;

		var Pattern = new RegExp( "^num", "gi" );
		if(Pattern.test(filterType) == true) filterType = 'num';


		if((requiredField || filterType) && this.formObj.elements[key].type != "hidden")
		{
			imgNode = document.createElement('IMG');
			if(filterType)
				imgNode.src = '../img/help.gif';
			if(requiredField)
			{
				imgNode.src = '../img/need_orange.gif';
				imgNode.title = 'Saisie obligatoire\n\n';
			}
			
			imgNode.style.align = "absmiddle";
			imgNode.style.cursor = "pointer";
			if(filterType == "alphaname")
			{
				imgNode.title += 'Caractères autorisés : \n';
				imgNode.title += '[a-z] : alphabétiques\n';
				imgNode.title += '[ôéèäëïîâçêû] : accentués\n';
				imgNode.title += '[ ] : espace\n';
				imgNode.title += '[-] : tiret\n';
			}
			if(filterType == "alphanum")
			{
				imgNode.title += 'Caractères autorisés : \n';
				imgNode.title += '[a-z] : alphabétiques\n';
				imgNode.title += '[0-9] : numériques\n';
				imgNode.title += '[ôéèäëïîâçêû] : accentués\n';
				imgNode.title += '[€] : monétaire\n';
				imgNode.title += '[ ] : espace\n';
				imgNode.title += '[-] : tiret\n';
				imgNode.title += '[+] : tiret\n';
				imgNode.title += '[,] : virgule\n';
				imgNode.title += '[.] : point\n';
				imgNode.title += '[\'] : apostrophe\n'; // l'apostrophe
				imgNode.title += '[/] : slash\n';
			}
			if(filterType == "login")
			{
				imgNode.title += 'Caractères autorisés : \n';
				imgNode.title += '[a-z] : alphabétiques\n';
				imgNode.title += '[ôéèäëïîàâçêû] : accentués\n';
				imgNode.title += '[%] : pourcentage\n';
				imgNode.title += '[-] : tiret\n';
			}
			if(filterType == "num")
			{
				var numPattern = new RegExp( "^[0-9]*$", "gi" );
				var attributePattern = new RegExp( "[0-9\-]", "gi" );
				var availableLength = this.formObj.elements[key].getAttribute('filter').substr(3,parseInt(this.formObj.elements[key].getAttribute('filter').length-3));
				
				if(availableLength)
				{
					var range = availableLength.match(attributePattern).join("").split("-");
					imgNode.title += 'Formatage obligatoire : \n';
					imgNode.title += range + ' caractères numériques\n\n';
				}

				imgNode.title += 'Caractères autorisés : \n';
				imgNode.title += '[0-9] : numériques\n';
			}
			if(filterType == "phone")
			{
				imgNode.title += 'Formatage obligatoire : \n';
				imgNode.title += '10 à 11 caractères numériques\n\n';
				imgNode.title += 'Caractères autorisés : \n';
				imgNode.title += '[0-9] : numériques\n';
				imgNode.title += 'Autres caractères autorisés mais effacés par le formatage\n';
			}
			if(filterType == "mail")
			{
				imgNode.title += 'Formatage obligatoire : \n';
				imgNode.title += 'xxxxx@xxxxx.xxx\n\n';
				imgNode.title += 'Caractères autorisés : \n';
				imgNode.title += '[a-z] : alphabétiques\n';
				imgNode.title += '[0-9] : numériques\n';
				imgNode.title += '[@] : arobase\n';
				imgNode.title += '[.] : point\n';
				imgNode.title += '[-] : tiret\n';
				imgNode.title += '[_] : tiret bas\n';
			}
			if(filterType == "web")
			{
				imgNode.title += 'Caractères autorisés : \n';
				imgNode.title += '[a-z] : alphabétiques\n';
				imgNode.title += '[0-9] : numériques\n';
				imgNode.title += '[@] : arobase\n';
				imgNode.title += '[.] : point\n';
				imgNode.title += '[:] : deux point\n';
				imgNode.title += '[-] : tiret\n';
				imgNode.title += '[_] : tiret bas\n';
				imgNode.title += '[?] : point d interrogation\n';
				imgNode.title += '[=] : égal\n';
				imgNode.title += '[&] : et commercial\n';
			}
			if(filterType == "text")
			{
				imgNode.title += 'Caractères autorisés : \n';
				imgNode.title += '[a-z] : alphabétiques\n';
				imgNode.title += '[0-9] : numériques\n';
				imgNode.title += '[ôéèäëïîâçêû] : accentués\n';
				imgNode.title += '[€] : monétaire\n';
				imgNode.title += '[\'] : apostrophe\n';
				imgNode.title += '[ ] : espace\n';
				imgNode.title += '[«] : ouverture guillemets word\n';
				imgNode.title += '[»] : fermeture guillemets word\n';
				imgNode.title += '[@] : arobase\n';
				imgNode.title += '[.] : point\n';
				imgNode.title += '[,] : virgule\n';
				imgNode.title += '[;] : point virgule\n';
				imgNode.title += '[:] : deux point\n';
				imgNode.title += '[-] : tiret\n';
				imgNode.title += '[_] : tiret bas\n';
				imgNode.title += '[?] : point d\'interrogation\n';
				imgNode.title += '[!] : point d\'exclamation\n';
				imgNode.title += '[=] : égal\n';
				imgNode.title += '[&] : et commercial\n';
				imgNode.title += '[+] : plus\n';
				imgNode.title += '[/] : slash\n';
				imgNode.title += '[*] : étoile\n';
			}

			// '
			imgNode.onmousedown = function() { alert(this.title); }
			
			
			diagNode = document.createElement('SPAN');
			diagNode.innerHTML = '&nbsp;';
			diagNode.style.width 						= '16px';
			diagNode.style.height						= '16px';
			//diagNode.style.border						= '1px solid black';
			diagNode.style.verticalAlign		= 'top';
			// Insertion de l image dans le diagNode
			diagNode.appendChild(imgNode);
			// Insertion de diagNode dans le parent aprés le champ
			this.formObj.elements[key].parentNode.insertBefore(diagNode, this.formObj.elements[key].nextSibling);
			// Insertion de diagNode dans le parent avant le champ
			//this.formObj.elements[key].parentNode.insertBefore(diagNode, this.formObj.elements[key]);
		}
		
		
		// si un champ est déjà remplis au démarrage on considère que la valeur émane de la base de données
		// Par conséquent il est considéré comme valide
		if((this.formObj.elements[key].value && requiredField) || !requiredField)
			this.formObj.elements[key].validFill = 1;
		else
			this.formObj.elements[key].validFill = 0;

		if((this.formObj.elements[key].value && filterType) || !filterType)
			this.formObj.elements[key].filterFill = 1;
		else
			this.formObj.elements[key].filterFill = 0;

		if((this.formObj.elements[key].value && formatType) || !formatType)
			this.formObj.elements[key].formatFill = 1;
		else
			this.formObj.elements[key].formatFill = 0;


		
		this.formObj.elements[key].originClassName = memClassName;

		if(this.errorClassName)
			this.formObj.elements[key].errorClassName = this.errorClassName;
		
		if(this.validClassName)
			this.formObj.elements[key].validClassName = this.validClassName;
		
		this.formObj.elements[key].onchange = function()
		{
			if(this.getAttribute('required'))
			{
				// traitement du required
				if(trim(this.value)) this.validFill = 1; else this.validFill = 0;
			}
			
			if(this.getAttribute('filter'))
			{
				// traitement du filtre
				var Pattern = new RegExp( "^num", "gi" );
				
				if(Pattern.test(this.getAttribute('filter')) == true)
				{
					var availableLength = this.getAttribute('filter').substr(3,parseInt(this.getAttribute('filter').length-3));
					this.filterFill = fieldChecknum(this.value,availableLength);
				}
				else if(this.type == 'textarea')
					this.filterFill = fieldChecktext(escape(this.value));
				else
					this.filterFill = eval("fieldCheck" + this.getAttribute('filter').toLowerCase() + "(\"" + addslashes(this.value) + "\")");
				
				if(!trim(this.value))
					this.filterFill = 1;
			}
			
			if(this.getAttribute('format'))
			{
				// traitement du formatage
				this.value =  eval("fieldFormat" +  this.getAttribute('format') + "(\"" + addslashes(this.value) + "\")");
			}
							
			// résultat
			if(this.validClassName && this.errorClassName)
			{
				if(this.validFill == 1 && this.filterFill == 1)
					this.className = this.validClassName;
				else
					this.className = this.errorClassName;
			}
		}
		
		// Validation du formulaire par le bouton type submit
		if(this.formObj.elements[key].type == "submit")
		{
			this.formObj.elements[key].formObj = this.formObj;
			this.formObj.elements[key].onmousedown = this.checkForSubmit;
		}
	}
	
	// Si pas de bouton submit, prendre l'élement passé en argument comme submiter
	if(submitId)
	{
		document.getElementById(submitId).formObj = this.formObj;
		document.getElementById(submitId).onmousedown = this.checkForSubmit;
	}
}

formToDb.prototype.showColor = function ()
{
	alert("checkForSubmit : " + this.errorcolor);
}

formToDb.prototype.checkForSubmit = function ()
{
	var checkError = '';
	var globalInspector = '';
	var urlConstruct = '';
	var regexpPattern = new RegExp( "^[\[].*\]$", "gi" ) ;
	var urlValues = "";
	var resultat = "";
	
	for (key=0;key<this.formObj.elements.length;key++)
	{
		// Recheck complet		
		if(this.formObj.elements[key].getAttribute('required'))
		{
			// traitement du required
			if(trim(this.formObj.elements[key].value)) this.formObj.elements[key].validFill = 1; else this.formObj.elements[key].validFill = 0;
		}
		
		if(this.formObj.elements[key].getAttribute('filter'))
		{
			// traitement du filtre
			var Pattern = new RegExp( "^num", "gi" );
			
			if(Pattern.test(this.formObj.elements[key].getAttribute('filter')) == true)
			{
				var availableLength = this.formObj.elements[key].getAttribute('filter').substr(3,parseInt(this.formObj.elements[key].getAttribute('filter').length-3));
				this.formObj.elements[key].filterFill = fieldChecknum(this.formObj.elements[key].value,availableLength);
			}
			else if(this.formObj.elements[key].type == 'textarea')
			        this.formObj.elements[key].filterFill = fieldChecktext(escape(this.formObj.elements[key].value));
			else
				this.formObj.elements[key].filterFill = eval("fieldCheck" + this.formObj.elements[key].getAttribute('filter').toLowerCase() + "(\"" + addslashes(this.formObj.elements[key].value) + "\")");
    
			if(!trim(this.formObj.elements[key].value))
				this.formObj.elements[key].filterFill = 1;
		}
		
		if(this.formObj.elements[key].getAttribute('format'))
		{
			// traitement du formatage
			this.formObj.elements[key].value = eval("fieldFormat" +  this.formObj.elements[key].getAttribute('format') + "(\"" + addslashes(this.formObj.elements[key].value) + "\")");
		}
		
		// résultat
		if(this.validClassName && this.errorClassName)
		{
			if(this.formObj.elements[key].validFill == 1 && this.formObj.elements[key].filterFill == 1)
				this.formObj.elements[key].className = this.formObj.elements[key].validClassName;
			else
				this.formObj.elements[key].className = this.formObj.elements[key].errorClassName;
		}
    
		
		if((this.formObj.elements[key].type == "text" || this.formObj.elements[key].type == "hidden" || this.formObj.elements[key].type == "textarea") && this.formObj.elements[key].getAttribute('required') && this.formObj.elements[key].validFill == 0)
			checkError += this.formObj.elements[key].name + "\n";
    
		if((this.formObj.elements[key].type == "text" || this.formObj.elements[key].type == "hidden" || this.formObj.elements[key].type == "textarea") && this.formObj.elements[key].getAttribute('filter') && this.formObj.elements[key].filterFill == 0)
			checkError += this.formObj.elements[key].name + "\n";
			
		if(this.formObj.elements[key].type == "select-one" && this.formObj.elements[key].getAttribute('required') && !this.formObj.elements[key].value)
			checkError += this.formObj.elements[key].name + "\n";
		
		globalInspector += this.formObj.elements[key].name + " => " + this.formObj.elements[key].value + " Re:" + this.formObj.elements[key].getAttribute('required') + "/" + this.formObj.elements[key].validFill + " Fi:" + this.formObj.elements[key].getAttribute('filter') + " Fo:" + this.formObj.elements[key].getAttribute('format') + "\n";
		
	}
	
	//alert(globalInspector);
	
	if(checkError)
	{
		alert('------------------------------------------------------------------------------------\nLes champs précédés d une étoile sont obligatoires\n------------------------------------------------------------------------------------\nCertains champs peuvent etre mal saisis.\nPour connaitre les caractères autorisés\ncliquez sur les étoiles oranges à coté de chaque champ\n------------------------------------------------------------------------------------\n')
		return false;
	}
	
	for (key=0;key<this.formObj.elements.length;key++)
	{
		resultat = this.formObj.elements[key].name.match( regexpPattern );
		
		if((this.formObj.elements[key].type == "text" || this.formObj.elements[key].type == "password" || this.formObj.elements[key].type == "textarea" || this.formObj.elements[key].type == "hidden" || ((this.formObj.elements[key].type == "checkbox" || this.formObj.elements[key].type == "radio") && this.formObj.elements[key].checked == 1))  && this.formObj.elements[key].style.visibility != "hidden")
		{
			// Mise en forme des caractères spéciaux
			var valueToStore = this.formObj.elements[key].value;
			
			valueToStore = valueToStore.replace(/\+/g,"&#43");
			valueToStore = valueToStore.replace(/€/g,"&#8364;");
			valueToStore = valueToStore.replace(/’/g,"'");
			valueToStore = valueToStore.replace(/œ/g,"OE");
			
			if(resultat)
				urlValues += "&data" + this.formObj.elements[key].name + "=" + escape(valueToStore);
			else
				urlValues += "&data[" + this.formObj.elements[key].name + "]=" + escape(valueToStore);
		}
		
		if(this.formObj.elements[key].tagName.toLowerCase() == "select")
		{
			if(resultat)
				urlValues += "&data" + this.formObj.elements[key].name + "=" + escape(this.formObj.elements[key][this.formObj.elements[key].selectedIndex].value);
			else
				urlValues += "&data[" + this.formObj.elements[key].name + "]=" + escape(this.formObj.elements[key][this.formObj.elements[key].selectedIndex].value);
		}
	}
	
	urlConstruct += "data[ref]="+this.formObj.dbTable;
	urlConstruct += urlValues;
	
	loadXMLDoc(this.formObj.divId,this.formObj.destinationFile+ '?' + urlConstruct,'0','POST');
	
	return false;
}

// FILTERTYPE
// CHECK
// Test fields validity
//

function trim(string) 
{ 
	return string.replace(/(^\s*)|(\s*$)/g,''); 
}

function addslashes(ch) {
	ch = ch.replace(/\\/g,"\\\\")
	ch = ch.replace(/\'/g,"\\'")
	ch = ch.replace(/\’/g,"\\'")
	ch = ch.replace(/\"/g,"\\\'\\\'")
	// l'arbre
	return ch
}

function fieldCheckalphaname(fieldValue)
{
	var alphaPattern = new RegExp( "^[a-zéôèäëïîâêûç \-]*$", "gi" );
	
	if(alphaPattern.test(fieldValue) == true)
		return 1;
	else
		return 0;
}


function fieldChecklogin(fieldValue)
{
	var alphaPattern = new RegExp( "^[a-zéôèäëïîàâêûç%\-]*$", "gi" );
	
	if(alphaPattern.test(fieldValue) == true)
		return 1;
	else
		return 0;
}

function fieldCheckalphanum(fieldValue)
{
	var alphaPattern = new RegExp( "^[0-9a-zéôèàäëïîâêûç€ ,+\/'\-\.]*$", "gi" );
	
	if(alphaPattern.test(fieldValue) == true)
		return 1;
	else
		return 0;
}

//accepte ponctuation
function fieldChecktext(fieldValue)
{
	fieldValue = unescape(fieldValue);
	
	var alphaPattern = new RegExp( "^[0-9a-zôéèàäëïîù%âêûç~@\?’' «»_;,!\-\/*+:.=\\n\\t\\r]*$", "gi" );
	
	if(alphaPattern.test(fieldValue) == true)
		return 1;
	else
		return 0;
}

function fieldChecknum(fieldValue,availableLength)
{
	var numPattern = new RegExp( "^[0-9]*$", "gi" );
	
	var attributePattern = new RegExp( "[0-9\-]", "gi" );
	
	
	if(availableLength)
		var range = availableLength.match(attributePattern).join("").split("-");
	
	fieldValue = trim(fieldValue);
	
	if(numPattern.test(fieldValue) == true && (!availableLength || (availableLength && range.length == 1 && fieldValue.length == range[0]) || (availableLength && range.length == 2 && fieldValue.length >= range[0] && fieldValue.length <= range[1])))
		return 1;
	else
		return 0;
}

function fieldCheckphone(fieldValue)
{
	var regexpPattern = new RegExp( "[0-9]", "gi" );
	
	var resultArray = fieldValue.match(regexpPattern) ;
	
	if(resultArray && resultArray.length >= 10 && resultArray.length <= 11)
		return 1;
	else
		return 0;
}

function fieldCheckmail(fieldValue)
{
	var mailPattern = new RegExp( "^[a-z0-9\-\._]+@[a-z0-9\-\._]{2,}[.][a-z]{2,3}$", "gi" );
	
	fieldValue = trim(fieldValue);
	
	if(mailPattern.test(fieldValue) == true)
		return 1;
	else
		return 0;
}

function fieldCheckweb(fieldValue)
{
	var webPattern = new RegExp( "^[a-z0-9\-/\.:_\?&=]*$", "gi" );
	
	fieldValue = trim(fieldValue);
	
	if(webPattern.test(fieldValue) == true)
		return 1;
	else
		return 0;
}


// FORMATTYPE
// FORMAT
// Fields formatting
//

// name : Format all upper case
function fieldFormatname(fieldValue)
{
	fieldValue = fieldValue.toUpperCase();
	return trim(fieldValue);
}


// forname : Format first letter upper case and space for separation 
function fieldFormatforname(fieldValue)
{
	var fieldValue = trim(fieldValue.toLowerCase());
	var reg = new RegExp("[ \-]+", "g");
	var fieldArray = fieldValue.split(reg);
	
	for(x=0;x<fieldArray.length;x++)
	{
		var initial 				= fieldArray[x].charAt(0).toUpperCase();
		var lastletter 			= fieldArray[x].substr(1,fieldArray[x].length);
		fieldArray[x] 	= initial + lastletter;
	}
	
	var result = fieldArray.join("-");
	
	return result;
}

// phone : Format first letter upper case and space for separation 
function fieldFormatphone(fieldValue)
{
	var regexpPattern = new RegExp( "[0-9]", "gi" );
	var resultArray = fieldValue.match(regexpPattern);
	var result = fieldValue;

	if(resultArray && resultArray.length == 10)
	{
		result = "";
		for(x=0;x<resultArray.length;x++)
		{
			result += resultArray[x];
			if(x%2 && x!=(resultArray.length-1)) result += ".";
		}
	}
	else if(resultArray && resultArray.length == 11)
	{
		result = "";
		result += "+(";
		
		for(x=0;x<resultArray.length;x++)
		{
			result += resultArray[x];
			
			if(x == 1)
				result += ").";
			else if(x == 2)
				result += ".";
			else if(x>2 && (x+1)%2 && x!=(resultArray.length-1))
				result += ".";
		}
	}
	return result;
}

// web : Format all lower case
function fieldFormatmail(fieldValue)
{
	fieldValue = fieldValue.toLowerCase();
	return fieldValue;
}

// mail : Format all lower case
function fieldFormatweb(fieldValue)
{
	if(fieldValue.substr(0, 7) != "http://")
		fieldValue = "http://" + fieldValue;
	fieldValue = fieldValue.toLowerCase();
	return fieldValue;
}
