// -------- methods from Ryan Frishberg [http://www.pageresource.com/dhtml/ryan]

  function accessCSS(layerID){
    if(document.getElementById){
	  return document.getElementById(layerID).style;
	}else if(document.all){
	  return document.all[layerID].style;
	}else if(document.layers){
	  return document.layers[layerID];
	}
  }

  function writeLayer(layerID,txt){
    if(document.getElementById){
	  document.getElementById(layerID).innerHTML=txt;
	}else if(document.all){
	  document.all[layerID].innerHTML=txt;
	}else if(document.layers){
	  with(document.layers[layerID].document){
	    open();
		write(txt);
		close();
	  }
	}
  }

  function getLayerContent(layerID){
    if(document.getElementById){
	  return document.getElementById(layerID).innerHTML;
	}else if(document.all){
	  return document.all[layerID].innerHTML;
	}else if(document.layers){
	  return document.layers[layerID].document;
	}
  }
 

// ---------- method from Pascal Naidon [http://www.les-stooges.org/pascal/art/webdesign]  * Experimental code *

  function multiCol(contenant, texte, cols, gouttiere, separation) {
	
	// Cette methode supppose qu'il existe dans le code HTML un <div> 'contenant' contenant le texte à afficher
	
	if(cols<1) exit;
	var hauteur;
	var debut = 0;
	var fin = 0;
	var largeur = 0;
	var fontsize = 0;
	var alignement = '';
	var hauteurVoulue = 0;
	
	if(accessCSS(contenant).fontSize=='') {
	  fontsize = 14; // default font size
	} else {
	  fontsize = parseInt(accessCSS(contenant).fontSize);
	}
	if(accessCSS(contenant).paddingTop=='') {
	  retraitHaut = 0;
	} else {
	  retraitHaut = parseInt(accessCSS(contenant).paddingTop);
	}
	if(accessCSS(contenant).paddingBottom=='') {
	  retraitBas = 0;
	} else {
	  retraitBas = parseInt(accessCSS(contenant).paddingBottom);
	}
	if(accessCSS(contenant).paddingLeft=='') {
	  retraitGauche = 0;
	} else {
	  retraitGauche = parseInt(accessCSS(contenant).paddingLeft);
	}
	if(accessCSS(contenant).paddingRight=='') {
	  retraitDroit = 0;
	} else {
	  retraitDroit = parseInt(accessCSS(contenant).paddingRight);
	}
    if(accessCSS(contenant).textAlign=='') {
	  alignement = '';
	} else {
	  alignement = accessCSS(contenant).textAlign;
	}
	
	// soit on fixe la hauteur et on déduit le nombre de colonnes
	  //hauteurVoulue = 300;
	  //cols = hauteur/(hauteurVoulue-fonsize);
	
	// soit on fixe le nombre de colonnes et on déduit la hauteur
	  //accessCSS(contenant).width='100%';
	  largeur = Math.round( (xWidth(contenant)-(cols-1)*gouttiere-(retraitGauche+retraitDroit))/cols );
	  style = "position:absolute; top:0px; left:0px;  width:"+largeur+"px; overflow: visible";
	  writeLayer(contenant,"<div id='test' style='"+style+"'>Z</div>");
	  writeLayer('test',texte);
      hauteur = xHeight('test');
	  hauteurVoulue = fontsize+hauteur/cols;
	
	if(typeof(window['MSIE'])!='undefined') { largeur2 = largeur+Math.round(gouttiere/2); } else { largeur2 = largeur; } // pour contourner les problemes CSS avec Internet Explorer !
	colonnes = "";
	for(num=1;num<=cols;num++) {
	  style = "position:absolute; box-sizing: content-box; top:"+retraitHaut+"px; left:"+(retraitGauche+(num-1)*(largeur+gouttiere))+"px;  width:"+largeur2+"px; padding-right:"+Math.round(gouttiere/2)+"px; overflow: visible";
	  if( (separation == true) && (num!=cols) ) {
        style = style+"; border-right: 1px solid #888888";
	  }
	  colonnes = colonnes+"<div id='"+contenant+"col"+num+"' style='"+style+"'>Z</div>";
	}
	writeLayer(contenant,colonnes);
	
	var separateur = "<";
	var balise = "";

	var findutexte = false;
	var contexteOuvre = new Array();
	var contexteFerme = new Array();
	var baliseOuvrante = '';
	var baliseFermante = '';
	
	for(num=1;num<cols;num++) {
	for(i=0;i<=texte.length;i++) {
	  // balises html
	  if((texte.substr(i,1)==separateur) || (i==texte.length)) {
	    debut = fin;
		fin = i;
		switch(separateur) {
		  case ">":
		    // on vient de trouver une balise html
			balise = texte.substr(debut,fin-debut+1).toLowerCase();
			// si c'est une balise ouvrante, on la retient comme contexte
			if( balise.substr(0,3)=='<a ' ) {
			  //contexteOuvre.push(balise); // pas reconnu par IE4
			  //contexteFerme.push('</a>'); 
			  contexteOuvre[contexteOuvre.length]=balise;
			  contexteFerme[contexteFerme.length]='</a>';
			}
			if( balise == '<b>' ) {
			  contexteOuvre[contexteOuvre.length]=balise;
			  contexteFerme[contexteFerme.length]='</b>';
			}
			if( balise == '<strong>' ) {
			  contexteOuvre[contexteOuvre.length]=balise;
			  contexteFerme[contexteFerme.length]='</strong>';
			}
			if( balise == '<i>' ) {
			  contexteOuvre[contexteOuvre.length]=balise;
			  contexteFerme[contexteFerme.length]='</i>';
			}
			if( balise == '<ul>' ) {
			  contexteOuvre[contexteOuvre.length]=balise;
			  contexteFerme[contexteFerme.length]='</ul>';
			}
			if( balise == '<ol>' ) {
			  contexteOuvre[contexteOuvre.length]=balise;
			  contexteFerme[contexteFerme.length]='</ol>';
			}
			if( balise.substr(0,6)=='<font ' ) {
			  contexteOuvre[contexteOuvre.length]=balise;
			  contexteFerme[contexteFerme.length]='</font>';
			}
			if( (balise.substr(0,5)=='<div ') || (balise == '<div>') ) {
			  //contexteOuvre[contexteOuvre.length]=balise;
			  //contexteFerme[contexteFerme.length]='</div>';
			  // on prend les <div >...</div> comme un seul bloc
			  niveau = 1;
			  m = 0;
			  while((niveau!=0) && (m<texte.length-6)) {
			    m++;
			    if(texte.substr(i+m,5).toLowerCase()=='<div ') niveau++;
				if(texte.substr(i+m,6).toLowerCase()=='</div>') niveau--;
			  }
			  i = i+m+5;
			  fin = i;
			}
			if( (balise.substr(0,6)=='<span ') || (balise == '<span>') ) {
			  contexteOuvre[contexteOuvre.length]=balise;
			  contexteFerme[contexteFerme.length]='</span>';
			}
			if( (balise.substr(0,3)=='<p ') || (balise == '<p>') ) {
			  contexteOuvre[contexteOuvre.length]=balise;
			  contexteFerme[contexteFerme.length]='</p>';
			}
			// si c'est une balise fermante, on la retire du contexte (en supposant que le code HTML est correct)
			if( balise.substr(0,2)=='</' ) {
			  //contexteOuvre.pop();
			  //contexteFerme.pop();
			  contexteOuvre.length--;
			  contexteFerme.length--;
			}
			baliseOuvrante = '';
			baliseFermante = '';
			for(m=0;m<contexteOuvre.length;m++) {
			  baliseOuvrante = baliseOuvrante+contexteOuvre[m];
			  baliseFermante = contexteFerme[m]+baliseFermante;
			}
			// DEBUG alert(balise+'\n'+baliseOuvrante);
			  writeLayer(contenant+'col'+num,texte.substr(0,fin-0+1)+baliseFermante); // on inclus le ">" à la fin
	          if(xHeight(contenant+'col'+num)>hauteurVoulue) {
			    // la balise depasse la taille, on s'arrête là.
			    coupure = debut-1; // on exclut le "<" à la fin
			    texte1 = texte.substr(0,coupure-0+1);
			    texte2 = texte.substr(coupure+1,texte.length-coupure);
			    // on sort de la boucle
			    i=texte.length+1;
			  }
		    separateur = "<";
	      break;
		  default:
		    if(texte.substr(i,1)=='<') {
		      // on vient de trouver un bloc texte précédent une balise
			  writeLayer(contenant+'col'+num,texte.substr(0,fin-0)+baliseFermante);  // on exclut le "<" à la fin
	        } else {
			  // on vient de trouver un bloc texte qui va jusqu'à la fin du texte
			  writeLayer(contenant+'col'+num,texte.substr(0,fin-0+1));
			}
			if(xHeight(contenant+'col'+num)>hauteurVoulue) {
			  // le bloc texte dépasse la taille... décomposons-le en phrases.
		      debutPhrase = debut;
			  finPhrase = debut;
		      for(j=debut+1;j<fin;j++) {
		        if( (texte.substr(j,1) == ".") || (texte.substr(j,1) == "!") || (texte.substr(j,1) == "?") || (j==fin-1)) {
			      debutPhrase = finPhrase;
				  finPhrase = j;
			      writeLayer(contenant+'col'+num,texte.substr(0,finPhrase-0+1)+baliseFermante);
				  if(xHeight(contenant+'col'+num)>hauteurVoulue) {
				    // la phrase dépasse la taille... décomposons-la en mots.
				    debutMot = debutPhrase;
				    finMot = debutPhrase;
				    for(k=debutPhrase+1;k<=finPhrase;k++) {
					  if( (texte.substr(k,1) == " ") || (k==finPhrase) ) {
					    debutMot = finMot;
					    finMot = k;
						if(texte.substr(k,1) == " ") {
					      writeLayer(contenant+'col'+num,texte.substr(0,finMot-0)+baliseFermante); // on exclut le " " après le mot
						} else {
						  writeLayer(contenant+'col'+num,texte.substr(0,finMot-0+1)+baliseFermante);
						}
					    if(xHeight(contenant+'col'+num)>hauteurVoulue) {
						  // le mot dépasse la taille... on s'arrête là !
						  coupure = debutMot;
						  if(alignement=='justify') {
						    texte1 = texte.substr(0,coupure-0+1)+' ______________'+baliseFermante;
						  } else {
						    texte1 = texte.substr(0,coupure-0+1)+baliseFermante;
						  }
						  texte2 = baliseOuvrante+texte.substr(coupure+1,texte.length-coupure);
						  // on réinitialise le contexte
						  contexteOuvre.length=0;
			  			  contexteFerme.length=0;
						  // on sort des boucles
						  k = finPhrase+1;
						  j = fin+1;
						  i = texte.length+1;
						}
					  }
					}
				  }
				}
			  }			  
			} else {
			  // le bloc texte ne depasse pas la taille... est-le dernier bloc ?
			  if(i==texte.length) {
			    // ok, on s'arrrête ici
				texte1 = texte;
				findutexte = true;
			  } else { 
			  }
			  // on sait que le prochain bloc sera une balise
			  separateur = ">";
			}
          break;
	    }
      }
	}
	writeLayer(contenant+'col'+num,texte1);
	xHeight(contenant+'col'+num,hauteurVoulue-fontsize/4);
	accessCSS(contenant+'col'+num).overflow = 'hidden';
	texte = texte2;
	}
	// derniere colonne
	writeLayer(contenant+'col'+cols,texte);
	//accessCSS(contenant).width = retraitGauche + retraitDroit + cols*largeur +(cols-1)*gouttiere;
	//xWidth(contenant, retraitGauche + retraitDroit + cols*largeur +(cols-1)*gouttiere);
	xHeight(contenant,retraitHaut+retraitBas+Math.max(xHeight(contenant+'col'+cols),xHeight(contenant+'col1')));
	//accessCSS(contenant).height = retraitHaut+retraitBas+xHeight(contenant+'col'+cols);
  }