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,"&"); content= content.replace(//g,">"); if(this.nav['isIE'] || this.nav['isOpera']) this.selection_field.innerHTML= "
" + content.replace("\n", ""; 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
") + "
"+lineContent.substr(0, cur_pos).replace(/
";
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;
};