/*
 * Fonction qui permet de cacher ou montrer un div dont l'id est passer en paramètre
 */

function DivShowHide(elt,img,way,evt)
{
	var MyDiv;
	var MyImg = "";

	// Ouverture de la DIV sur laquelle on a cliqué
	if(document.getElementById) // DOM3 = IE5, NS6
	{
		MyDiv = document.getElementById(elt);
		if(img!="") MyImg = document.getElementById(img);
		if(MyDiv.style.display == "none")
		{
			MyDiv.style.display = "";
			if(MyImg!="") MyImg.src = way+"moins.gif";
		}
		else
		{
			MyDiv.style.display = "none";
			if(MyImg!="")  MyImg.src = way+"plus.gif";
		}
	}
	else
	{
		MyDiv = elt;
		if(img!="") MyImg = img;
		if(document.layers) // netscape 4
		{
			if(document.MyDiv.display == "none")
			{
				document.MyDiv.display = "";
				if(MyImg!="") MyImg.src = way+"moins.gif";
			}
			else
			{
				document.MyDiv.display = "none";
				if(MyImg!="")  MyImg.src = way+"plus.gif";
			}
		}
		else // IE 4
		{
			if(document.all.MyDiv.style.display == "none")
			{
				document.all.MyDiv.style.display = "";
				if(MyImg!="") MyImg.src = way+"moins.gif";
			}
			else
			{
				document.all.MyDiv.style.display = "none";
				if(MyImg!="")  MyImg.src = way+"plus.gif";
			}
		}
	}
	
	// Recherche de toutes les DIV (par le tableau des images)
	// dont l'ID commence par DET_ pour les fermer et ne traiter que
	// celle passée en paramètre
	for(i=0;i<document.images.length;i++)
	{
		var image = document.images[i];
		var s = document.images[i].id;
		if(s.substring(0,4)=="IMG_" && image.id != img)
		{
			MyDiv = document.getElementById("DET_"+s.substring(4));
			if(MyDiv.style.display != "none")
			{
				MyDiv.style.display = "none";
				image.src = way+"plus.gif";
			}
		}
	}
	
	// Gestion de l'évènement pour rester en place,
	// force le renvoie à faux pour ne pas exécuter l'évènement suivant de la page
	if (IsExplorer())
	{
		if(!evt) evt = window.event;
		evt.returnValue = false;
		return false;
	}
	else
	{
		if(!evt) return true;
		evt.preventDefault(true);
		return false;
	}
}

function emailCheck(emailStr)
{


	var checkTLD=1;
	var knownDomsPat="/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum|fr)$/";
	//var knownDomsPat="";
    var emailPat="/^(.+)@(.+)$/";
    //var emailPat="";
    var specialChars="\\\\(\\\\)><@,;:\\\\\\\\\\\\\\\"\\\\.\\\\[\\\\]";
    //var specialChars="";
    var validChars="\\[^\\\\s" + specialChars + "\\]";
    //var validChars="";
    var quotedUser="(\\\"[^\\\"]*\\\")";
    //var quotedUser="";
    var ipDomainPat="/^\\[(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\]$/";
    //var ipDomainPat="";
    var atom=validChars + '+';
    var word="(" + atom + "|" + quotedUser + ")";
    var userPat=new RegExp("^" + word + "(\\\\." + word + ")*$");
    //var userPat="";
    var domainPat=new RegExp("^" + atom + "(\\\\." + atom +")*$");
    //var domainPat="";
    var matchArray=emailStr.match(emailPat);

    if (matchArray==null)
    {
		alert("L'adresse email semble être incorrecte (veuillez vérifier les caractères '@' et '.')");
        return false;
    }
    var user=matchArray[1];
    var domain=matchArray[2];

    for (i=0; i<user.length; i++)
    {
    	if (user.charCodeAt(i)>127) 
    	{
        	alert("Le nom de l'utilisateur contient des caractères invalides.");
        	return false;
        }
	}
    for (i=0; i<domain.length; i++)
    {
    	if (domain.charCodeAt(i)>127)
    	{
        	alert("Le nom du domaine contient des caractères invalides.");
            return false;
		}
	}

    if (user.match(userPat)==null) 
    {
    	alert("Le nom de l'utilisateur ne semble pas à être correct.");
    	return false;
    }

    var IPArray=domain.match(ipDomainPat);
    if (IPArray!=null) 
    {
    	for (var i=1;i<=4;i++) 
    	{
        	if (IPArray[i]>255)
        	{
            	alert("L'adresse IP ne semble pas correcte !");
                return false;
            }
        }
       return true;
	}

    var atomPat=new RegExp("^" + atom + "$");
    var domArr=domain.split(".");
    var len=domArr.length;
    for (i=0;i<len;i++)
    {
    	if (domArr[i].search(atomPat)==-1)
    	{
        	alert("Le nom du domaine ne semble pas à être correct.");
           	return false;
        }
	}

	if (checkTLD && domArr[domArr.length-1].length!=2 && domArr[domArr.length-1].search(knownDomsPat)==-1)
	{
		alert("L'adresse doit posseder un domaine connu ou un pays de deux lettres.");
		return false;
	}

 	if (len<2)
 	{
    	alert("Pas de nom de domaine dans l'adresse!");
    	return false;
    }

	return true;
}
  
function ExtraitChaine(sTexte,nIndice,sSep)
{
	var str = sTexte;
	var rtr = "";
	var reg = new RegExp("["+sSep+"]","g");
	var tableau = str.split(reg);
	
	if(nIndice-1 > tableau.length)
		rtr = "";
	else
		rtr = tableau[nIndice-1];

	return rtr;
}
  
function getNextElement(field) 
{
	var fieldFound = false;
	var form = field.form;
	var idx = 0;
	var fieldReturn;
	
	for (var e = 0; e < form.elements.length; e++)
	{
		if (fieldFound && form.elements[e].tabIndex > idx && form.elements[e].type != 'hidden' && form.elements[e].type != 'checkbox' && form.elements[e].type != 'radio')
			break;
		// Elément en cours trouvé
		if (field == form.elements[e])
		{
			fieldFound = true;
			idx = form.elements[e].tabIndex;
		}
	}
	if(e >= form.elements.length)
		fieldReturn = field;
	else
		fieldReturn = form.elements[e % form.elements.length];
	return fieldReturn;
}
 
function getSelectionStart(o) 
{
	if (o.createTextRange)
	{
		var r = document.selection.createRange().duplicate();
		r.moveEnd('character', o.value.length);
		if (r.text == '') return o.value.length;
		return o.value.lastIndexOf(r.text);
	}
	else 
		return o.selectionStart;
}

function getSelectionEnd(o) 
{
	if (o.createTextRange) 
	{
		var r = document.selection.createRange().duplicate();
		r.moveStart('character', -o.value.length);
		return r.text.length;
	} 
	else 
		return o.selectionEnd;
}

 
function IsControl(c)
{
	return ( c < " " )
}

function IsDateValide(sDate)
{
	var ladate;
	var unedate;
	var chaineDate;
	var annee;
		
	chaineDate=sDate;
	ladate = (chaineDate).split("/");
	unedate = new Date(eval(ladate[2]),eval(ladate[1])-1,eval(ladate[0]));
	annee = unedate.getYear();
	if ((Math.abs(annee)+"").length < 4)
		annee = annee + 1900;
	return ((unedate.getDate() == eval(ladate[0])) && (unedate.getMonth() == eval(ladate[1])-1) && (annee == eval(ladate[2])));
}

function IsDigit (c)
{
	return ( (c >= "0") && (c <= "9") )
}

function IsExplorer()
{
	return ( navigator.appName=="Microsoft Internet Explorer" )
}

function IsNetscape()
{
	return ( navigator.appName=="Netscape" )
}

function IsFireFox()
{
	return ( navigator.appName=="Netscape" )
}

function IsSigne(c)
{
	return (c=="+") || (c=="-")
}

function OnlyDate(evt)
{
	var car;
	var s;
	var t;
			
	if(!IsExplorer())
	{
		// Flèches ou suppression (pavé numérique) = on sort
		if(evt.which == 0 || evt.which==8)
			return true;
			
		// Caractère saisi
		car = String.fromCharCode(evt.which);		
		// Vérification du format de la date
		s = evt.target.value;
		t = s.length + 1;
		if(t==2 || t==5)
		{
			evt.target.value = s+car+"/";
			evt.preventDefault(true);
			return true;
		}
		if (t==10 && IsDigit(car))
		{
			// Contrôle de la validité de la date
			if(IsDateValide(s+car)) 
			{
				evt.target.value = s+car;
				evt.preventDefault(true);
				// Sort de la zone automatiquement
				elt = getNextElement(evt.target);
				elt.focus();
				elt.select();
				return true;
			}
			else
			{
				evt.preventDefault(true);
				//alert("La date saisie est incorrecte.\nFormat JJ/MM/AAAA");
				return false;
			}
		}
		if(IsDigit(car) || (car=="/"))
		{
			return true;
		}
		else
		{
			evt.preventDefault(true);
			return false;
		}
	}
	if ( IsExplorer() )
	{
		car = String.fromCharCode(evt.keyCode);
		// Vérification du format de la date
		s = evt.srcElement.value;
		t = s.length + 1;
		if(t==2 || t==5)
		{
			evt.srcElement.value = s+car+"/";
			evt.returnValue = false;
			return true;
		}
		if (t==10 && IsDigit(car))
		{
			// Contrôle de la validité de la date
			if(IsDateValide(s+car)) 
			{
				evt.srcElement.value = s+car;
				evt.returnValue = false;
				// Sort automatiquement de la zone et passe à la suivante
				elt = getNextElement(evt.srcElement);
				elt.focus();
				elt.select();
				return true;
			}
			else
			{
				//alert("La date saisie est incorrecte.\nFormat JJ/MM/AAAA");
				evt.returnValue = false;
				return false;
			}
		}
		evt.returnValue = ValRetIE(evt,IsDigit(car) || (car=="/"));
	}
	return true;
}

// IE ou Firefox
function codeTouche(evenement)
{
        for (prop in evenement)
        {
        	// Firefox
        	if(prop == 'which') return(evenement.which);
        }
        // IE
        return(evenement.keyCode);
}

// Autoriser les copier/coller en FireFox
function pressePapierNS6(evenement,touche)
{
        var rePressePapierNS = /[cvxz]/i;

        for (prop in evenement) if (prop == 'ctrlKey') isModifiers = true;
        if (isModifiers) return evenement.ctrlKey && rePressePapierNS.test(touche);
        else return false;
}

// Test des caractères autorisés
function ScanTouche(evenement,CarValides)
{
		// x00 (0) : Home, End, supprime, tabulation et les flèches
		// x08 (8) : Retour arrière
		// xOD (13): Entrée 
        var reCarSpeciaux = /[\x00\x08\x0D\x03\x16\x18\x1A]/;

        var codeDecimal  = codeTouche(evenement);
        var car = String.fromCharCode(codeDecimal);
        var autorisation = CarValides.test(car) || reCarSpeciaux.test(car) || pressePapierNS6(evenement,car);
        return autorisation;
}

// Annule l'évement en fct du navigateur : IE ou Firefox
function StopEvenement(evt) {
	if (IsExplorer()) evt.returnValue=false;
		else evt.preventDefault(true);
	return false;
}

// Vérifie le contenu du champs
function ScanChamps(evt,objChamp,typeDon)
{
	//typeDon : Montant, qty, date ...
	var reContenuValide = "";
	var messageErreur = "";
	var messageAvertissement = "";

	if (objChamp.value != "") {
		switch (typeDon) {
		 case 1: //Montant
			 // S'il y a une virgule, on la remplace par un point
			 posVirgule = objChamp.value.indexOf(",",1);
			 if (posVirgule > 0) {
				 objChamp.value=objChamp.value.substring(0,posVirgule)+"."+objChamp.value.substring(posVirgule+",".length);
				 messageAvertissement = "Attention ! Il faut saisir un point et non une virgule pour les décimales";
			 }

			 // numérique avec virgule et signe
			 reContenuValide = /^[+-]?(?:\d+\.?\d*|\d*\.?\d+)$/;
			 messageErreur = "Saisie erronée.\nVous devez saisir un numérique";
			 break;
			 
		 case 3: //Quantité, pourcentage, année, durée ou code postal
			 // S'il y a une virgule, on la remplace par un point
			 posVirgule = objChamp.value.indexOf(",",1);
			 if (posVirgule > 0) {
				 objChamp.value=objChamp.value.substring(0,posVirgule)+"."+objChamp.value.substring(posVirgule+",".length);
				 messageAvertissement = "Attention ! Il faut saisir un point et non une virgule pour les décimales"
			 }
			 
			 var NameChps = objChamp.name; 
			 		 
			 if (NameChps.indexOf("QTY",1) > 0) {
				 // Quantité (4 décimales)
				 reContenuValide = /^[+-]?(?:\d+\.?\d{0,4}|\d*\.?\d{1,4})$/;
				 messageErreur = "Saisie erronée.\nVous devez saisir un numérique (4 décimales possible)";
			 } else if (NameChps.indexOf("PCD",1) > 0){
				 // Pourcentage (2 décimales)
				 reContenuValide = /^[+-]?(?:\d+\.?\d{1,2}|\d*\.?\d{1,2})$/;
				 messageErreur = "Saisie erronée.\nVous devez saisir un pourcentage (2 décimales possible)";
			 } else if (NameChps.indexOf("DTM_602",1) > 0) {
				// Année 4 chiffres supérieurs à 1900
				 reContenuValide = /^(19|20)\d\d/;
				 messageErreur = "Saisie erronée.\nVous devez saisir une année sur 4 chiffres supérieure à 1900";
			 } else if (NameChps.indexOf("DTM_801",1) > 0) {
				// Durée
				 reContenuValide = /^\d\d$/;
				 messageErreur = "Saisie erronée.\nVous devez saisir un numérique supérieur à 100";
			 } else if (NameChps.indexOf("NAD_8",1) > 0) {
				// Code postal
				 reContenuValide = /^(\d{5})$/;
				 messageErreur = "Saisie erronée.\nVous devez saisir un code postal (5 chiffres)";
			 }
			 break;
			 
		 case 2 : //Date
			 if (objChamp.value == "jj/mm/aaaa") {
				//On efface le contenu de la zone préremplie afin de ne pas fausser le test
				 objChamp.value = ""; 
			 } else {
				 reContenuValide = /^(0{0,1}[1-9]|[12]\d|3[01])\/(0{1}[1-9]|1[012])\/(19|20)\d\d$/;
				 messageErreur = "Saisie erronée.\nVous devez saisir une date au format JJ/MM/AAAA";
			 }
			 break;
		}	

		// Test de l'expression régulière
		if (reContenuValide != "" && !reContenuValide.test(objChamp.value))	{
			objChamp.value = '';
			objChamp.focus();
			// Affichage du message d'erreur
			alert(messageErreur);
			messageAvertissement = "";  //Pas d'avertissement, il y a déjà un message d'erreur
			StopEvenement(evt);
			return false;
		} else {
			// Teste si la date correctement saisie et non vide est valide par rapport au calendrier
			if (typeDon == 2 && !IsDateValide(objChamp.value) && objChamp.value != "") {
				objChamp.value = '';
				objChamp.focus();
				alert("La date saisie est incorrecte.\nFormat JJ/MM/AAAA");
				StopEvenement(evt);
			}
		}
		if (messageAvertissement != "") alert(messageAvertissement);
	}
}

function OnlyNumber(evt)
{
	// Autorise que les chiffres de 0 à 9
	var reCarValides = /\d/;
		
	if (!ScanTouche(evt,reCarValides)) return StopEvenement(evt);
}

function OnlyNumberSep(evt)
{
	// Autorise que les chiffres décimaux
	var reCarValides = /^(?:\d+\.?\d*|\d*\.?\d+)$/;
	
	if (!ScanTouche(evt,reCarValides)) return StopEvenement(evt);
}

/*function OnlyNumber(evt)
{
	var car;
	
	if (IsExplorer())
	{
		
		car = String.fromCharCode(evt.keyCode);
		evt.returnValue = ValRetIE(evt,IsDigit(car));
		return true;
	}
	else
	{
		car = String.fromCharCode(evt.which);
		if(!IsDigit(car) && !IsControl(car)) 
		{
			evt.preventDefault(true);
			return false;
		}
		return true;
	}	
}*/

/*function OnlyNumberSep(evt)
{
	var car;
	if (IsExplorer())
	{
		// Vérification qu'il n'y a pas déjà un séparateur
		s=evt.srcElement.value;
		car = String.fromCharCode(evt.keyCode);
		if (s.indexOf(".")!=-1 && (car=="." || car==","))
		{
			evt.returnValue=false;
			return false;
		}
		if(car==",") 
		{
			evt.srcElement.value = s+".";
			evt.returnValue = false;
			return false;			
		}
		evt.returnValue = ValRetIE(evt,IsDigit(car) || (car==".") || (car==","));
		return true;
	}
	else
	{
		s=evt.target.value;
		car = String.fromCharCode(evt.which);
		// Vérification qu'il n'y a pas déjà un séparateur
		if (s.indexOf(".")!=-1 && (car=="." || car==","))
		{
			evt.preventDefault(true);
			return false;
		}
		if(car==",") 
		{
			evt.target.value = s+".";
			evt.preventDefault(true);
			return false;			
		}
		if(!(IsDigit(car) || (car==",") || (car==".") || IsControl(car))) evt.preventDefault(true);
		return false;
	}	
}*/

function OnlyNumberSign(evt)
{
	var car;
	var s;
	if (IsExplorer())
	{
		// Vérification qu'il n'y a pas déjà un signe (signe moins uniquement)
		s=evt.srcElement.value;
		car = String.fromCharCode(evt.keyCode);
		if (s.indexOf("-")!=-1 && (car=="-"))
		{
			evt.returnValue=false;
			return false;
		}
		// Positionne le signe en premier automatiquement
		if(car=="-")
		{
			evt.srcElement.value = car + s;
			evt.returnValue=false;
			return false;
		}
		else
		{
			evt.returnValue = ValRetIE(evt,IsDigit(car) || (car=="-"));
			return true;
		}
	}
	else
	{
		s=evt.target.value;
		car = String.fromCharCode(evt.which);
		// Vérification qu'il n'y a pas déjà un séparateur
		if (s.indexOf("-")!=-1 && (car=="-"))
		{
			evt.preventDefault(true);
			return false;
		}
		if(car=="-")
		{
			evt.target.value = car + s;
			evt.preventDefault(true);
			return false;
		}
		else
		{
			if(!(IsDigit(car) || (car=="-") || IsControl(car))) evt.preventDefault(true);
			return false;
		}
	}
}

function OnlyNumberSignLimit(evt,nMax)
{
	var car;
	var s;
	if (IsExplorer())
	{
		// Vérification qu'il n'y a pas déjà un séparateur
		s=evt.srcElement.value;
		car = String.fromCharCode(evt.keyCode);
		if (s.indexOf(".")!=-1 && (car=="." || car==","))
		{
			evt.returnValue=false;
			return false;
		}
		if(car==",") 
		{
			evt.srcElement.value = s+".";
			evt.returnValue = false;
			return false;			
		}
		// Vérification du max
		if((s+car) > nMax)
		{
			alert("Valeur maximale autorisée "+nMax+".");
			evt.returnValue=false;
			return false;
		}
		evt.returnValue = ValRetIE(evt,IsDigit(car) || (car=="."));
		return true;
	}
	else
	{
		s=evt.target.value;
		car = String.fromCharCode(evt.which);
		// Vérification qu'il n'y a pas déjà un séparateur
		if (s.indexOf(".")!=-1 && (car=="." || car==","))
		{
			evt.preventDefault(true);
			return false;
		}
		if(car==",") 
		{
			evt.target.value = s+".";
			evt.preventDefault(true);
			return false;			
		}
		if(!(IsDigit(car) || (car==".") || IsControl(car))) evt.preventDefault(true);
		return false;
	}
}

function OnlyNumberSignSep(evt)
{
	var car;
	var s;
	if (IsExplorer())
	{
		// Vérification qu'il n'y a pas déjà un séparateur
		s=evt.srcElement.value;
		car = String.fromCharCode(evt.keyCode);
		if (s.indexOf(".")!=-1 && (car=="." || car==","))
		{
			evt.returnValue=false;
			return false;
		}
		if(car=="." || car==",") 
		{
			evt.srcElement.value = s+".";
			evt.returnValue = false;
			return false;			
		}
		
		// Vérification qu'il n'y a pas déjà un signe moins
		if (s.indexOf("-")!=-1 && car=="-")
		{
			evt.returnValue=false;
			return false;
		}
		// Positionne le signe en premier automatiquement
		if(car=="-")
		{
			evt.srcElement.value = car + s;
			evt.returnValue=false;
			return false;
		}
		
		evt.returnValue = ValRetIE(evt,IsDigit(car) || IsSigne(car) || (car=="."));
		return true;
		
	}
	else
	{
		s=evt.target.value;
		car = String.fromCharCode(evt.which);
		// Vérification qu'il n'y a pas déjà un séparateur
		if (s.indexOf(".")!=-1 && (car=="." || car==","))
		{
			evt.preventDefault(true);
			return false;
		}
		if(car=="." || car==",") 
		{
			evt.target.value = s+".";
			evt.preventDefault(true);
			return false;			
		}
		
		// Vérification qu'il n'y a pas déjà un signe moins
		if (s.indexOf("-")!=-1 && car=="-")
		{
			evt.preventDefault(true);
			return false;
		}
		if(car=="-")
		{
			evt.target.value = car + s;
			evt.preventDefault(true);
			return false;
		}
		
		if(!(IsDigit(car) || IsSigne(car) || (car==".") || IsControl(car))) evt.preventDefault(true);
		return false;

	}	
}

function ToutEnMaj(evt)
{
	var car;
	var pos;
	// code différent pour netscape et ie :
	if ( IsNetscape() || IsFireFox())
	{	// conversion code ascii -> caractère :
		car = String.fromCharCode(evt.which);
		// est-ce que c'est une lettre minuscule :
		if ( ( car>='a' ) && ( car<='z') )
		{	
			// oui => on la convertit en majuscule :
			car = escape(car.toUpperCase());
			// et on se l'envoie :
			evt.target.value=evt.target.value+car;
			// mais on n'accepte pas la minuscule courante :
			evt.preventDefault(true);
		}
	}
	if ( IsExplorer() )
	{	// conversion en caractère :
		car = String.fromCharCode(evt.keyCode);
		// puis passage en majuscule et code ascii :
		evt.keyCode = car.toUpperCase().charCodeAt(0);
	}
	return true;
}

function OpenModalWindow(link,args,options)
{	
	return window.showModalDialog(link,args,options);
}

function OpenWindow(link,title,options)
{
	return window.open(link,title,options);
}

function rgb2hex(r,g,b)
{
	var hexVal = function(n) 
	{
		var data = "0123456789ABCDEF";
		if (n==null) return "00";
		n=parseInt(n); 
		if (n==0 || isNaN(n)) return "00";
		n=Math.round(Math.min(Math.max(0,n),255));
		return data.charAt((n-n%16)/16) + data.charAt(n%16);
	}
	return hexVal(r)+hexVal(g)+hexVal(b);
}

function SansEspace(s) 
{
    return s.replace(/^\s+/, '').replace(/\s+$/, '');
}

function closeChildWindows()
{
	if (childWindows != null)
	{
         for (var i=0;i<childWindows.length;i++)
         {
              childWindows[i].close();
         }
    }

}

function Gauche(s)
{
    return s.replace(/^\s+/, '');
}

function Droite(s)
{
    return s.replace(/\s+$/, '');
}

function ValRetIE(evt,test)
{
	if (test || (evt.keyCode == 13))  //Entrée
	{
		return evt.keyCode;
	}
	return test;
}

/**
 * This array is used to remember mark status of rows in browse mode
 */
var marked_row = new Array;


/**
 * Sets/unsets the pointer and marker in browse mode
 *
 * @param   object    the table row
 * @param   interger  the row number
 * @param   string    the action calling this script (over, out or click)
 * @param   string    the default background color
 * @param   string    the color to use for mouseover
 * @param   string    the color to use for marking a row
 *
 * @return  boolean  whether pointer is set or not
 */

function setPointer(theRow, theRowNum, theAction, theDefaultColor, thePointerColor, theMarkColor)
{
    var theCells = null;

    // 1. Pointer and mark feature are disabled or the browser can't get the row -> exits
    if ((thePointerColor == '' && theMarkColor == '') || typeof(theRow.style) == 'undefined') 
    {
        return false;
    }

    // 2. Gets the current row and exits if the browser can't get it
    if (typeof(document.getElementsByTagName) != 'undefined') 
   	{
        theCells = theRow.getElementsByTagName('td');
    }
    else if (typeof(theRow.cells) != 'undefined') 
   	{
        theCells = theRow.cells;
    }
    else 
    {
        return false;
    }

    // 3. Gets the current color...
    var rowCellsCnt  = theCells.length;
    var domDetect    = null;
    var currentColor = null;
    var newColor     = null;
    // 3.1 ... with DOM compatible browsers except Opera that does not return
    //         valid values with "getAttribute"
    if (typeof(window.opera) == 'undefined' && typeof(theCells[0].getAttribute) != 'undefined') 
    {
        currentColor = theCells[0].getAttribute('bgcolor');
        domDetect    = true;
    }
    // 3.2 ... with other browsers
    else
    {
        currentColor = theCells[0].style.backgroundColor;
        domDetect    = false;
    } // end 3

    // 4. Defines the new color
    // 4.1 Current color is the default one
    if (currentColor == '' || currentColor.toLowerCase() == theDefaultColor.toLowerCase())
    {
        if (theAction == 'over' && thePointerColor != '') 
        {
            newColor = thePointerColor;
        }
        else if (theAction == 'click' && theMarkColor != '') 
        {
            newColor = theMarkColor;
            marked_row[theRowNum] = true;
        }
	}
    // 4.1.2 Current color is the pointer one
    else if (currentColor.toLowerCase() == thePointerColor.toLowerCase()
             && (typeof(marked_row[theRowNum]) == 'undefined' || !marked_row[theRowNum])) {
        if (theAction == 'out') 
        {
            newColor = theDefaultColor;
        }
        else if (theAction == 'click' && theMarkColor != '') {
            newColor              = theMarkColor;
            marked_row[theRowNum] = true;
        }
    }
    // 4.1.3 Current color is the marker one
    else if (currentColor.toLowerCase() == theMarkColor.toLowerCase()) {
        if (theAction == 'click') {
            newColor              = (thePointerColor != '')
                                  ? thePointerColor
                                  : theDefaultColor;
            marked_row[theRowNum] = (typeof(marked_row[theRowNum]) == 'undefined' || !marked_row[theRowNum])
                                  ? true
                                  : null;
        }
    } // end 4

    // 5. Sets the new color...
    if (newColor) {
        var c = null;
        if (domDetect) // 5.1 ... with DOM compatible browsers except Opera
        {
            for (c = 0; c < rowCellsCnt; c++) 
            {
                theCells[c].setAttribute('bgcolor', newColor, 0);
            }
        }
        else // 5.2 ... with other browsers
        {
            for (c = 0; c < rowCellsCnt; c++)
            {
            	theCells[c].style.backgroundColor = newColor;
            }
        }
    } // end 5

    return true;
} 
// end of the 'setPointer()' function

function tabOnEnter (field, evt) 
{
	var keyCode = null;
	if(IsExplorer())
		keyCode = evt.keyCode;
	else
		keyCode = evt.which;
	if (keyCode != 13)
		return true;
	else 
	{
		var Elt;
		Elt = getNextElement(field);
		Elt.focus();
		Elt.select();
		return false;
	}
}

function ToFloat(v)
{
	if(v.length==0)
		return 0;
	var s="";
	for(var i=0;i<v.length;i++)
	{
		var c=v.substring(i,i+1);
		if((c>='0'&&c<='9')||c=='+'||c=='-'||c==".")
			s+=c;
	}
	return parseFloat(s);
}

function ToString(v)
{
	if((escape(v)=="")||(isNaN(v)))
		return"";
	return ""+eval(v);
}

// Clignotement
function Blink(layerName)
{
	if (NS4 || IE4) 
	{ 
		if(i%2==0)
		{
			eval(layerRef+'["'+layerName+'"]'+
			styleSwitch+'.visibility="visible"');
		}
		else
		{
			eval(layerRef+'["'+layerName+'"]'+
			styleSwitch+'.visibility="hidden"');
		}
	} 
	if(i<1)
	{
		i++;
	} 
	else
	{
		i--
	}
	setTimeout("Blink('"+layerName+"')",blink_speed);
}
