text: 	EditArea.prototype.focus = function() {
  		this.textarea.focus();
  		this.textareaFocused=true;
  	};
  
  
  	EditArea.prototype.check_line_selection= function(timer_checkup){
  		//if(do_highlight==false){
  		/*if(this.once!=1){
  			alert("ONCE a"+ this.isResizing);
  			this.once=1;
  		}*/
  		if(!editAreas[this.id])
  			return false;
  		
  		//time=new Date;
  		//t1=t2=t3= time.getTime();
  		
  		if(!this.smooth_selection && !this.do_highlight){
  			//formatArea();
  		}else if(this.textareaFocused && editAreas[this.id]["displayed"]==true && this.isResizing==false){
  			infos= this.get_selection_infos();
  		//	time=new Date;
  		//	t2= time.getTime();
  			
  			//if(this.last_selection["line_start"] != infos["line_start"] || this.last_selection["line_nb"] != infos["line_nb"] || infos["full_text"] != this.last_selection["full_text"]){
  			if(this.last_selection["line_start"] != infos["line_start"] || this.last_selection["line_nb"] != infos["line_nb"] || infos["full_text"] != this.last_selection["full_text"] || this.reload_highlight){
  			// if selection change
  				
  				new_top=this.lineHeight * (infos["line_start"]-1);
  				new_height=Math.max(0, this.lineHeight * infos["line_nb"]);
  				new_width=Math.max(this.textarea.scrollWidth, this.container.clientWidth -50);
  				
  				this.selection_field.style.top=new_top+"px";	
  				this.selection_field.style.width=new_width+"px";
  				this.selection_field.style.height=new_height+"px";	
  				document.getElementById("cursor_pos").style.top=new_top+"px";	
  		
  				if(this.do_highlight==true){
  					var curr_text=infos["full_text"].split("\n");
  					var content="";
  					//alert("length: "+curr_text.length+ " i: "+ Math.max(0,infos["line_start"]-1)+ " end: "+Math.min(curr_text.length, infos["line_start"]+infos["line_nb"]-1)+ " line: "+infos["line_start"]+" [0]: "+curr_text[0]+" [1]: "+curr_text[1]);
  					var start=Math.max(0,infos["line_start"]-1);
  					var end=Math.min(curr_text.length, infos["line_start"]+infos["line_nb"]-1);
  					
  					//curr_text[start]= curr_text[start].substr(0,infos["curr_pos"]-1) +"¤_overline_¤"+ curr_text[start].substr(infos["curr_pos"]-1);
  					for(i=start; i< end; i++){
  						content+= curr_text[i]+"\n";	
  					}
  					
  					content= content.replace(/&/g,"&amp;");
  					content= content.replace(/</g,"&lt;");
  					content= content.replace(/>/g,"&gt;");
  					
  					if(this.nav['isIE'] || this.nav['isOpera'])
  						this.selection_field.innerHTML= "<pre>" + content.replace("\n", "<br/>") + "</pre>";	
  					else
  						this.selection_field.innerHTML=content;
  						
  					if(this.reload_highlight || (infos["full_text"] != this.last_text_to_highlight && (this.last_selection["line_start"]!=infos["line_start"] || this.last_selection["line_nb"]!=infos["line_nb"] || this.last_selection["nb_line"]!=infos["nb_line"]) ) )
  						this.maj_highlight(infos);
  				}		
  			}
  		//	time=new Date;
  		//	t3= time.getTime();
  			
  			// manage bracket finding
  			if(infos["line_start"] != this.last_selection["line_start"] || infos["curr_pos"] != this.last_selection["curr_pos"] || infos["full_text"].length!=this.last_selection["full_text"].length || this.reload_highlight){
  				// move _cursor_pos
  				var selec_char= infos["curr_line"].charAt(infos["curr_pos"]-1);
  				var no_real_move=true;
  				if(infos["line_nb"]==1 && (this.assocBracket[selec_char] || this.revertAssocBracket[selec_char]) ){
  					
  					no_real_move=false;					
  					//findEndBracket(infos["line_start"], infos["curr_pos"], selec_char);
  					if(this.findEndBracket(infos, selec_char) === true){
  						document.getElementById("end_bracket").style.visibility="visible";
  						document.getElementById("cursor_pos").style.visibility="visible";
  						document.getElementById("cursor_pos").innerHTML= selec_char;
  						document.getElementById("end_bracket").innerHTML= (this.assocBracket[selec_char] || this.revertAssocBracket[selec_char]);
  					}else{
  						document.getElementById("end_bracket").style.visibility="hidden";
  						document.getElementById("cursor_pos").style.visibility="hidden";
  					}
  				}else{
  					document.getElementById("cursor_pos").style.visibility="hidden";
  					document.getElementById("end_bracket").style.visibility="hidden";
  				}
  				//alert("move cursor");
  				this.displayToCursorPosition("cursor_pos", infos["line_start"], infos["curr_pos"]-1, infos["curr_line"], no_real_move);
  				if(infos["line_nb"]==1 && infos["line_start"]!=this.last_selection["line_start"])
  					this.scroll_to_view();
  			}
  			this.last_selection=infos;
  		}
  	//	time=new Date;
  	//	tend= time.getTime();
  		//this.debug.value="tps total: "+ (tend-t1) + " tps get_infos: "+ (t2-t1)+ " tps jaune: "+ (t3-t2) +" tps cursor: "+ (tend-t3)+" "+typeof(infos);
  		
  		if(timer_checkup){
  			if(this.do_highlight==true)	//can slow down check speed when highlight mode is on
  				setTimeout("editArea.check_line_selection(true)", 50);
  			else
  				setTimeout("editArea.check_line_selection(true)", 50);
  		}
  	};
  
  
  	EditArea.prototype.get_selection_infos= function(){
  		if(this.nav['isIE'])
  			this.getIESelection();
  		start=this.textarea.selectionStart;
  		end=this.textarea.selectionEnd;		
  		
  		if(this.last_selection["selectionStart"]==start && this.last_selection["selectionEnd"]==end && this.last_selection["full_text"]==this.textarea.value)
  			return this.last_selection;
  			
  		if(this.tabulation!="\t" && this.textarea.value.indexOf("\t")!=-1) 
  		{	// can append only after copy/paste 
  			var len= this.textarea.value.length;
  			this.textarea.value=this.replace_tab(this.textarea.value);
  			start=end= start+(this.textarea.value.length-len);
  			this.area_select(start, 0);
  		}
  		var selections=new Object();
  		selections["selectionStart"]= start;
  		selections["selectionEnd"]= end;		
  		selections["full_text"]= this.textarea.value;
  		selections["line_start"]=1;
  		selections["line_nb"]=1;
  		selections["curr_pos"]=0;
  		selections["curr_line"]="";
  		selections["indexOfCursor"]=0;
  		selections["selec_direction"]= this.last_selection["selec_direction"];
  		
  		//return selections;	
  		
  		var splitTab=selections["full_text"].split("\n");
  		var nbLine=Math.max(0, splitTab.length);		
  		var nbChar=Math.max(0, selections["full_text"].length - (nbLine - 1));	// (remove \n caracters from the count)
  		if(selections["full_text"].indexOf("\r")!=-1)
  			nbChar= nbChar - (nbLine -1);		// (remove \r caracters from the count)
  		selections["nb_line"]=nbLine;		
  		selections["nb_char"]=nbChar;		
  		if(start>0){
  			var str=selections["full_text"].substr(0,start);
  			selections["curr_pos"]= start - str.lastIndexOf("\n");
  			selections["line_start"]=Math.max(1, str.split("\n").length);
  		}else{
  			selections["curr_pos"]=1;
  		}
  		if(end>start){
  			selections["line_nb"]=selections["full_text"].substring(start,end).split("\n").length;
  		}
  		selections["indexOfCursor"]=this.textarea.selectionStart;		
  		selections["curr_line"]=splitTab[Math.max(0,selections["line_start"]-1)];
  		
  		
  		// determine in with direction the direction grow
  		if(selections["selectionStart"]==this.last_selection["selectionStart"]){
  			if(selections["selectionEnd"]>this.last_selection["selectionEnd"])
  				selections["selec_direction"]= "down";
  			else if(selections["selectionEnd"] == this.last_selection["selectionStart"])
  				selections["selec_direction"]= this.last_selection["selec_direction"];
  		}else if(selections["selectionStart"] == this.last_selection["selectionEnd"] && selections["selectionEnd"]>this.last_selection["selectionEnd"]){
  			selections["selec_direction"]= "down";
  		}else{
  			selections["selec_direction"]= "up";
  		}
  			
  		document.getElementById("nbLine").innerHTML= nbLine;		
  		document.getElementById("nbChar").innerHTML= nbChar;		
  		document.getElementById("linePos").innerHTML=selections["line_start"];
  		document.getElementById("currPos").innerHTML=selections["curr_pos"];
  		
  		return selections;		
  	};
  	
  	// set IE position in Firefox mode (textarea.selectionStart and textarea.selectionEnd)
  	EditArea.prototype.getIESelection= function(){	
  		var range = document.selection.createRange();
  		var stored_range = range.duplicate();
  		stored_range.moveToElementText( this.textarea );
  		stored_range.setEndPoint( 'EndToEnd', range );
  		if(stored_range.parentElement() !=this.textarea)
  			return;
  	
  		// the range don't take care of empty lines in the end of the selection
  		var scrollTop= this.result.scrollTop + document.body.scrollTop;
  		
  		var relative_top= range.offsetTop - parent.calculeOffsetTop(this.textarea) + scrollTop;
  		
  		var line_start = Math.round((relative_top / this.lineHeight) +1);
  		
  		var line_nb=Math.round(range.boundingHeight / this.lineHeight);
  					
  		var range_start=stored_range.text.length - range.text.length;
  		var tab=this.textarea.value.substr(0, range_start).split("\n");			
  		range_start+= (line_start - tab.length)*2;		// add missing empty lines to the selection
  		this.textarea.selectionStart = range_start;
  		
  		var range_end=this.textarea.selectionStart + range.text.length;
  		tab=this.textarea.value.substr(0, range_start + range.text.length).split("\n");			
  		range_end+= (line_start + line_nb - 1 - tab.length)*2;
  		
  		this.textarea.selectionEnd = range_end;
  		/*this.textarea.selectionStart = 10;
  		this.textarea.selectionEnd = 50;*/
  	};
  	
  	// select the text for IE (and take care of \r caracters)
  	EditArea.prototype.setIESelection= function(){
  		var nbLineStart=this.textarea.value.substr(0, this.textarea.selectionStart).split("\n").length - 1;
  		var nbLineEnd=this.textarea.value.substr(0, this.textarea.selectionEnd).split("\n").length - 1;
  		var range = document.selection.createRange();
  		range.moveToElementText( this.textarea );
  		range.setEndPoint( 'EndToStart', range );
  		
  		range.moveStart('character', this.textarea.selectionStart - nbLineStart);
  		range.moveEnd('character', this.textarea.selectionEnd - nbLineEnd - (this.textarea.selectionStart - nbLineStart)  );
  		range.select();
  	};
  	
  	EditArea.prototype.tab_selection= function(){
  		if(this.is_tabbing)
  			return;
  		this.is_tabbing=true;
  		//infos=getSelectionInfos();
  		//if( document.selection ){
  		if( this.nav['isIE'] )
  			this.getIESelection();
  		/* Insertion du code de formatage */
  		var start = this.textarea.selectionStart;
  		var end = this.textarea.selectionEnd;
  		var insText = this.textarea.value.substring(start, end);
  		
  		/* Insert tabulation and ajust cursor position */
  		var pos_start=start;
  		var pos_end=end;
  		if (insText.length == 0) {
  			// if only one line selected
  			this.textarea.value = this.textarea.value.substr(0, start) + this.tabulation + this.textarea.value.substr(end);
  			pos_start = start + this.tabulation.length;
  			pos_end=pos_start;
  		} else {
  			start= Math.max(0, this.textarea.value.substr(0, start).lastIndexOf("\n")+1);
  			endText=this.textarea.value.substr(end);
  			startText=this.textarea.value.substr(0, start);
  			tmp= this.textarea.value.substring(start, end).split("\n");
  			insText= this.tabulation+tmp.join("\n"+this.tabulation);
  			this.textarea.value = startText + insText + endText;
  			pos_start = start;
  			pos_end= this.textarea.value.indexOf("\n", startText.length + insText.length);
  			if(pos_end==-1)
  				pos_end=this.textarea.value.length;
  			//pos = start + repdeb.length + insText.length + ;
  		}
  		this.textarea.selectionStart = pos_start;
  		this.textarea.selectionEnd = pos_end;
  		
  		//if( document.selection ){
  		if(this.nav['isIE']){
  			this.setIESelection();
  			setTimeout("editArea.is_tabbing=false;", 100);	// IE can't accept to make 2 tabulation without a little break between both
  		}else
  			this.is_tabbing=false;	
  		
    	};
  	
  	EditArea.prototype.invert_tab_selection= function(){
  		if(this.is_tabbing)
  			return;
  		this.is_tabbing=true;
  		//infos=getSelectionInfos();
  		//if( document.selection ){
  		if(this.nav['isIE'])
  			this.getIESelection();
  		
  		var start = this.textarea.selectionStart;
  		var end = this.textarea.selectionEnd;
  		var insText = this.textarea.value.substring(start, end);
  		
  		/* Tab remove and cursor seleciton adjust */
  		var pos_start=start;
  		var pos_end=end;
  		if (insText.length == 0) {
  			if(this.textarea.value.substring(start-this.tabulation.length, start)==this.tabulation)
  			{
  				this.textarea.value = this.textarea.value.substr(0, start-this.tabulation.length) + this.textarea.value.substr(end);
  				pos_start= Math.max(0, start-this.tabulation.length);
  				pos_end=pos_start;
  			}	
  			/*
  			this.textarea.value = this.textarea.value.substr(0, start) + this.tabulation + insText + this.textarea.value.substr(end);
  			pos_start = start + this.tabulation.length;
  			pos_end=pos_start;*/
  		} else {
  			start= this.textarea.value.substr(0, start).lastIndexOf("\n")+1;
  			endText=this.textarea.value.substr(end);
  			startText=this.textarea.value.substr(0, start);
  			tmp= this.textarea.value.substring(start, end).split("\n");
  			insText="";
  			for(i=0; i<tmp.length; i++){				
  				for(j=0; j<this.tab_nb_char; j++){
  					if(tmp[i].charAt(0)=="\t"){
  						tmp[i]=tmp[i].substr(1);
  						j=this.tab_nb_char;
  					}else if(tmp[i].charAt(0)==" ")
  						tmp[i]=tmp[i].substr(1);
  				}		
  				insText+=tmp[i];
  				if(i<tmp.length-1)
  					insText+="\n";
  			}
  			//insText+="_";
  			this.textarea.value = startText + insText + endText;
  			pos_start = start;
  			pos_end= this.textarea.value.indexOf("\n", startText.length + insText.length);
  			if(pos_end==-1)
  				pos_end=this.textarea.value.length;
  			//pos = start + repdeb.length + insText.length + ;
  		}
  		this.textarea.selectionStart = pos_start;
  		this.textarea.selectionEnd = pos_end;
  		
  		//if( document.selection ){
  		if(this.nav['isIE']){
  			// select the text for IE
  			this.setIESelection();
  			setTimeout("editArea.is_tabbing=false;", 100);	// IE can accept to make 2 tabulation without a little break between both
  		}else
  			this.is_tabbing=false;
    	};
  	
  	EditArea.prototype.press_enter= function(){		
  		if(!this.smooth_selection)
  			return false;
  		if(this.nav['isIE'])
  			this.getIESelection();
  		var scrollTop= this.result.scrollTop;
  		var scrollLeft= this.result.scrollLeft;
  		var start=this.textarea.selectionStart;
  		var end= this.textarea.selectionEnd;
  		var start_last_line= Math.max(0 , this.textarea.value.substring(0, start).lastIndexOf("\n") + 1 );
  		var begin_line= this.textarea.value.substring(start_last_line, start).replace(/^([ \t]*).*/gm, "$1");
  		if(begin_line=="\n" || begin_line=="\r" || begin_line.length==0)
  			return false;
  			
  		if(this.nav['isIE'] || this.nav['isOpera']){
  			begin_line="\r\n"+ begin_line;
  		}else{
  			begin_line="\n"+ begin_line;
  		}	
  		//alert(start_last_line+" strat: "+start +"\n"+this.textarea.value.substring(start_last_line, start)+"\n_"+begin_line+"_")
  		this.textarea.value= this.textarea.value.substring(0, start) + begin_line + this.textarea.value.substring(end);
  		
  		this.area_select(start+ begin_line.length ,0);
  		// during this process IE scroll back to the top of the textarea
  		if(this.nav['isIE']){
  			this.result.scrollTop= scrollTop;
  			this.result.scrollLeft= scrollLeft;
  		}
  		return true;
  		
  	};
  	
  	
  	EditArea.prototype.findEndBracket= function(infos, bracket){
  			
  		var start=infos["indexOfCursor"];
  		var normal_order=true;
  		//curr_text=infos["full_text"].split("\n");
  		if(this.assocBracket[bracket])
  			endBracket=this.assocBracket[bracket];
  		else if(this.revertAssocBracket[bracket]){
  			endBracket=this.revertAssocBracket[bracket];
  			normal_order=false;
  		}	
  		var end=-1;
  		var nbBracketOpen=0;
  		
  		for(var i=start; i<infos["full_text"].length && i>=0; ){
  			if(infos["full_text"].charAt(i)==endBracket){				
  				nbBracketOpen--;
  				if(nbBracketOpen<=0){
  					//i=infos["full_text"].length;
  					end=i;
  					break;
  				}
  			}else if(infos["full_text"].charAt(i)==bracket)
  				nbBracketOpen++;
  			if(normal_order)
  				i++;
  			else
  				i--;
  		}
  		
  		//end=infos["full_text"].indexOf("}", start);
  		if(end==-1)
  			return false;	
  		var endLastLine=infos["full_text"].substr(0, end).lastIndexOf("\n");			
  		if(endLastLine==-1)
  			line=1;
  		else
  			line= infos["full_text"].substr(0, endLastLine).split("\n").length + 1;
  					
  		var curPos= end - endLastLine;
  		
  		this.displayToCursorPosition("end_bracket", line, curPos, infos["full_text"].substring(endLastLine +1, end));
  		return true;
  	};
  	
  	EditArea.prototype.displayToCursorPosition= function(id, start_line, cur_pos, lineContent, no_real_move){
  		var elem= document.getElementById("test_font_size");
  		var dest= document.getElementById(id);
  		var postLeft=0;
  		elem.innerHTML="<pre><span id='test_font_size_inner'>"+lineContent.substr(0, cur_pos).replace(/&/g,"&amp;").replace(/</g,"&lt;")+"</span></pre>";
  		posLeft= 45 + document.getElementById('test_font_size_inner').offsetWidth;
  
  		var posTop=this.lineHeight * (start_line-1);
  	
  		if(no_real_move!=true){	// when the cursor is hidden no need to move him
  			dest.style.top=posTop+"px";
  			dest.style.left=posLeft+"px";		
  		}
  		// usefull for smarter scroll
  		dest.cursor_top=posTop;
  		dest.cursor_left=posLeft;
  		
  	//	document.getElementById(id).style.marginLeft=posLeft+"px";
  		
  	};
  	
  	
  	EditArea.prototype.area_select= function(start, length){
  		this.textarea.focus();
  		
  		start= Math.max(0, Math.min(this.textarea.value.length, start));
  		end= Math.max(start, Math.min(this.textarea.value.length, start+length));
  
  		if(this.nav['isIE']){
  			this.textarea.selectionStart = start;
  			this.textarea.selectionEnd = end;		
  			this.setIESelection();
  		}else{
  			if(this.nav['isOpera']){	// Opera bug when moving selection start and selection end
  				/*this.textarea.selectionEnd = 1;	
  				this.textarea.selectionStart = 0;			
  				this.textarea.selectionEnd = 1;	
  				this.textarea.selectionStart = 0;
  				this.textarea.selectionEnd = 0;	
  				this.textarea.selectionStart = 0;
  				this.textarea.selectionEnd = 0;	
  				this.textarea.selectionStart = 0;*/
  				this.textarea.setSelectionRange(0, 0);
  			}
  			this.textarea.setSelectionRange(start, end);
  		}
  		this.check_line_selection();
  	};
  	
  	
  	EditArea.prototype.area_get_selection= function(){
  		var text="";
  		if( document.selection ){
  			var range = document.selection.createRange();
  			text=range.text;
  		}else{
  			text= this.textarea.value.substring(this.textarea.selectionStart, this.textarea.selectionEnd);
  		}
  		return text;			
  	};
  