var couleur="";
var nboccurence=0;
var mes="";
var clone_text="";

function randomColor() {
  var chars = "0123456789abcdef";
  var color = "#";
  for (var i=0; i<6; i++) {
    var rnd = Math.floor(16 * Math.random());
    color += chars.charAt(rnd);
  }
  return color;
}




function addListener(element, baseName, handler) {
    if (element.addEventListener)
        element.addEventListener(baseName, handler, false);
    else if (element.attachEvent)
        element.attachEvent('on' + baseName, handler);
} // addListener


   function  nbText(elt,key) {
	if (!elt || Node.TEXT_NODE == !elt.nodeType){
		return 0;
      }
      var affiche="rentre dans nbText \n";
	var el=elt;
	var expr = "";
      var pos=0;
	affiche+="\n key = "+key;
      while (pos!=-1) {
		expr = elt.nodeValue;
		affiche+="\n"+expr;
         	pos=expr.indexOf(key,0);
            affiche+="\n dans la boucle while pos = "+pos;
		affiche+="\npos ="+pos;
         	if (pos>=0) {
    			var suffix = elt.nodeValue.substring(pos+key.length);
			affiche+="\nsuffix ="+suffix;
    			var akSpan = document.createElement('span');
    			akSpan.className = 'trouve';
    			akSpan.style.backgroundColor=couleur;
			nboccurence++;
    			akSpan.appendChild(document.createTextNode(key+nboccurence));
    // On évite node.splitText et node.deleteData sur MSIE...  On manipule
    // nodeValue et on crée le deuxième noeud Texte manuellement.
    			elt.nodeValue = elt.nodeValue.substring(0, pos);
			affiche+="\nprefix ="+elt.nodeValue;
    			var fin=document.createTextNode(suffix);
    			elt.parentNode.insertBefore(fin,elt);
    			elt.parentNode.insertBefore(akSpan,fin);
    			elt.parentNode.insertBefore(elt,akSpan);
			affiche+=" \nil fut s'assurer que j'ai bien le next next ..";
			affiche+="\n valeur du fre = " + elt.nextSibling.nodeValue;
			affiche+="\n valeur du frefre = " + elt.nextSibling.nextSibling.nodeValue;
			return 1;
         	}
      }
	//alert("je ret 0");
	return 0;
 }


function rechercheText(node,value) {
	var avance=0;
	result=0;
      
	if (Node.TEXT_NODE == node.nodeType){
		return nbText(node,value);
        }
	if (Node.ELEMENT_NODE != node.nodeType)
		return 0;
	for (var index = 0; index < node.childNodes.length; ++index){
		if (rechercheText(node.childNodes.item(index),value)){
      		index++;	//on a crée un noeud passe au suivant
		}
	}
	return result;
} // rechercheText




/*
 * Exemple d'utilisation de NodeList.
 */

// Compensation pour MSIE...
if ('undefined' == typeof Node)
    Node = { ELEMENT_NODE: 1, TEXT_NODE: 3 };



//** Tout le reste sert juste à faire une démo de getInnerText... **

function demo() {

	nboccurence=0;
      couleur=randomColor();
      var value=document.forms[0].elements[0].value;
	if (value!=""){
		var text=document.getElementById('fragmentRoot');
// on duplique framentRoot
		clone_text=text.cloneNode(true);

		rechercheText(text,value);
		var results = document.getElementById('results');
		if (results.hasChildNodes())
			results.firstChild.nodeValue = nboccurence;
		else {
			var txt = document.createTextNode(nboccurence);
			results.appendChild(txt);
		}
		results.style.display = '';
	}
	return clone_text;
} // demo

function reset() {
	if (clone_text!=""){
// remet le texte initial
		document.body.replaceChild(clone_text,document.getElementById('fragmentRoot'));

// reset du resultat
		var results = document.getElementById('results');
		if (results.hasChildNodes())
			results.firstChild.nodeValue = "";
		else {
			var txt = document.createTextNode("");
			results.appendChild(txt);
		}
		results.style.display = 'none';
	}

} // reset

function initButton() {
	addListener(document.forms[0].elements[1], 'click', demo);
	addListener(document.forms[0].elements[2], 'click', reset);
} // initButton

function observe(element, event, fx) {
	if (element.addEventListener)
		element.addEventListener(event, fx, false);
	else if (element.attachEvent)
		element.attachEvent('on' + event, fx);
} // observe


observe(window, 'load', initButton);
