function Formatter()
{
	this.fmtPC = fmtPC ;
	this.fmtLineNumber = fmtLineNumber ;
	this.fmtToxClassId = fmtToxClassId ;
	this.fmtToxClass = fmtToxClass ;
	this.fmtFinalResultsLineNumber = fmtFinalResultsLineNumber ;
	this.getSubstanceAnchor = getSubstanceAnchor ;
	this.formatException = formatException ;
	this.format = format ;
	this.getClassAnchor = getClassAnchor ;
	this.getBinaryInteractionAnchor = getBinaryInteractionAnchor ;
	this.fmtBinaryInteraction = fmtBinaryInteraction ;
	function getBinaryInteractionAnchor(bi,displayString)
	{
		//	TODO : Mettre la chaine dans strings.txt.
		return format(STRINGS['anchorBIJS'], getBinaryInteractionHref(bi), displayString);
	}
	
	function getBinaryInteractionHref(bi)
	{
		// pour l'instant on ne tient pas compte de la langue
		return  "docs/" +  bi.externalReference;
	}

	function fmtPC(n) {
		/*
			On formate nombre en pourcentage
		*/
		var tmp ;
		if ( isNaN(n)) 
			tmp = "?" ;
		else
		{
			tmp = Math.round(n * 1000) / 10  ;
		}
		return tmp + "%" ;
	}

	function fmtLineNumber(i)
	{
		// Présentation d'un no de ligne
		return STRINGS['substancePrefix'] + ( i + 1 ) ;
	}

	function getSubstanceAnchor(substance, text)
	{
		return format(STRINGS['anchorSubstanceJS'], language + "/" + substance.externalReference + '.htm', text);
	}



	function fmtFinalResultsLineNumber(posit, substance, takeCarcinogenicityIntoAccount) // public
	{
		if ( arguments.length == 1 )
		{
			var fmt1 = STRINGS['finalResultsHiLiteNo'] ;
			var ln = format( fmt1, 	STRINGS['substancePrefix'], posit + 1 ) ;
			return format( STRINGS['finalResultsPosition'], ln , STRINGS['expNoProductSelected'] );
		} 
		else
		{
			var text = format(STRINGS['finalResultsHiLiteNo'], STRINGS['substancePrefix'],posit+1) ;
			var ln = getSubstanceAnchor( substance, text);
			if( arguments.length == 2 ) return ln ; // just the line number
			var name = getSubstanceAnchor(substance, substance.name) ;
	
			if (substance.isCarcinogenic && takeCarcinogenicityIntoAccount)
			{
				return format(STRINGS['finalResultsPositionCancer'], ln, name, STRINGS['carcinogenic']);
			} else
			{
				return format(STRINGS['finalResultsPosition'], ln, name);
			}
		}		
	}


	function formatException(arg0, arg1) // public
	{
		if ( arguments.length == 0 )
		{
			return STRINGS['carcinogenic'] ;
		}
		if ( arguments.length == 1 )
			return format(STRINGS['patExp01'], STRINGS[arg0]);
		else
			return format(STRINGS['patExp'], arg0, arg1);
	}

	




	function pad(number,length) // private
	{
		var str = '' + number;
		while (str.length < length)
			str = '0' + str;
		return str;
	}

	function format ( fmt, args) // public
	{
		var tmp = fmt ;
		if ( arguments.length == 0 ) return "" ;
		if ( arguments.length == 1 ) return fmt ;
		
		for ( var i = 1 ; i < arguments.length ; i++ )
		{
			var re = new RegExp("\\{" + ( i-1 ) +"\\}","g") ;
		
			tmp = tmp.replace( re, arguments[i]) ;
		}
		return tmp ;
	}

	function fmtToxClassId(toxClass) // public
	{
		// Présentation d'un no de classe
		return getClassAnchor(toxClass, STRINGS['classPrefix'] +  toxClass._id ) ;
	}

	function fmtToxClass(toxClass) // public
	{
		// Présentation d'une classe, no de classe et nom de la classe
		var clsNo = fmtToxClassId(toxClass) ;
		var clsName = getClassAnchor(toxClass, toxClass.name) ;
		return format( STRINGS['finalResultsClassDetails'], clsNo, clsName) ;
	}

	function getClassAnchor(toxClass, text) //  public
	{
		
		return format(STRINGS['anchorToxClassJS'], language + "/c" + pad(toxClass._id,6)+ ".htm" , text);
	}

	function fmtBinaryInteraction(bi)
	{
		var rep = '' ;
		rep += FORMATTER.format
				(
				STRINGS['bin_oneInteraction'] , 
				STRINGS['bin_couple'] ,
				getSubstanceById(bi.s1_id).name ,
				getSubstanceById(bi.s2_id).name ,
				STRINGS['bin_category'] ,
				bi.ic.name,
				STRINGS['bin_analysis']  ,
				getPara(bi.analysis),
				STRINGS['bin_conclusion'] ,
				getPara(bi.conclusion) ,
				FORMATTER.getBinaryInteractionAnchor( bi, STRINGS['bin_seeDocumentation'])) ;
		return rep ;
	}
	
	function getPara(s)
	{

		var ss = s.split( '\n') ;
		var sb = '' ;
		for ( var i = 0 ; i < ss.length ; i++ )
		{
			sb += FORMATTER.format(STRINGS['bin_anaConcParag'],ss[i]);	
		}
		return sb ;
	}




} // FORMATTER

