ConLite/conlite/external/edit_area/search_replace.js

175 Zeilen
5.2 KiB
JavaScript

EditArea.prototype.show_search = function(){
if(_$("area_search_replace").style.visibility=="visible"){
this.hidden_search();
}else{
this.open_inline_popup("area_search_replace");
var text= this.area_get_selection();
var search= text.split("\n")[0];
_$("area_search").value= search;
_$("area_search").focus();
}
};
EditArea.prototype.hidden_search= function(){
/*_$("area_search_replace").style.visibility="hidden";
this.textarea.focus();
var icon= _$("search");
setAttribute(icon, "class", getAttribute(icon, "class").replace(/ selected/g, "") );*/
this.close_inline_popup("area_search_replace");
};
EditArea.prototype.area_search= function(mode){
if(!mode)
mode="search";
_$("area_search_msg").innerHTML="";
var search=_$("area_search").value;
this.textarea.focus();
this.textarea.textareaFocused=true;
var infos= this.get_selection_infos();
var start= infos["selectionStart"];
var pos=-1;
var pos_begin=-1;
var length=search.length;
if(_$("area_search_replace").style.visibility!="visible"){
this.show_search();
return;
}
if(search.length==0){
_$("area_search_msg").innerHTML=this.get_translation("search_field_empty");
return;
}
// advance to the next occurence if no text selected
if(mode!="replace" ){
if(_$("area_search_reg_exp").checked)
start++;
else
start+= search.length;
}
//search
if(_$("area_search_reg_exp").checked){
// regexp search
var opt="m";
if(!_$("area_search_match_case").checked)
opt+="i";
var reg= new RegExp(search, opt);
pos= infos["full_text"].substr(start).search(reg);
pos_begin= infos["full_text"].search(reg);
if(pos!=-1){
pos+=start;
length=infos["full_text"].substr(start).match(reg)[0].length;
}else if(pos_begin!=-1){
length=infos["full_text"].match(reg)[0].length;
}
}else{
if(_$("area_search_match_case").checked){
pos= infos["full_text"].indexOf(search, start);
pos_begin= infos["full_text"].indexOf(search);
}else{
pos= infos["full_text"].toLowerCase().indexOf(search.toLowerCase(), start);
pos_begin= infos["full_text"].toLowerCase().indexOf(search.toLowerCase());
}
}
// interpret result
if(pos==-1 && pos_begin==-1){
_$("area_search_msg").innerHTML="<strong>"+search+"</strong> "+this.get_translation("not_found");
return;
}else if(pos==-1 && pos_begin != -1){
begin= pos_begin;
_$("area_search_msg").innerHTML=this.get_translation("restart_search_at_begin");
}else
begin= pos;
//_$("area_search_msg").innerHTML+="<strong>"+search+"</strong> found at "+begin+" strat at "+start+" pos "+pos+" curs"+ infos["indexOfCursor"]+".";
if(mode=="replace" && pos==infos["indexOfCursor"]){
var replace= _$("area_replace").value;
var new_text="";
if(_$("area_search_reg_exp").checked){
var opt="m";
if(!_$("area_search_match_case").checked)
opt+="i";
var reg= new RegExp(search, opt);
new_text= infos["full_text"].substr(0, begin) + infos["full_text"].substr(start).replace(reg, replace);
}else{
new_text= infos["full_text"].substr(0, begin) + replace + infos["full_text"].substr(begin + length);
}
this.textarea.value=new_text;
this.area_select(begin, length);
this.area_search();
}else
this.area_select(begin, length);
};
EditArea.prototype.area_replace= function(){
this.area_search("replace");
};
EditArea.prototype.area_replace_all= function(){
/* this.area_select(0, 0);
_$("area_search_msg").innerHTML="";
while(_$("area_search_msg").innerHTML==""){
this.area_replace();
}*/
var base_text= this.textarea.value;
var search= _$("area_search").value;
var replace= _$("area_replace").value;
if(search.length==0){
_$("area_search_msg").innerHTML=this.get_translation("search_field_empty");
return ;
}
var new_text="";
var nb_change=0;
if(_$("area_search_reg_exp").checked){
// regExp
var opt="mg";
if(!_$("area_search_match_case").checked)
opt+="i";
var reg= new RegExp(search, opt);
nb_change= infos["full_text"].match(reg).length;
new_text= infos["full_text"].replace(reg, replace);
}else{
if(_$("area_search_match_case").checked){
var tmp_tab=base_text.split(search);
nb_change= tmp_tab.length -1 ;
new_text= tmp_tab.join(replace);
}else{
// case insensitive
var lower_value=base_text.toLowerCase();
var lower_search=search.toLowerCase();
var start=0;
var pos= lower_value.indexOf(lower_search);
while(pos!=-1){
nb_change++;
new_text+= this.textarea.value.substring(start , pos)+replace;
start=pos+ search.length;
pos= lower_value.indexOf(lower_search, pos+1);
}
new_text+= this.textarea.value.substring(start);
}
}
if(new_text==base_text){
_$("area_search_msg").innerHTML="<strong>"+search+"</strong> "+this.get_translation("not_found");
}else{
this.textarea.value= new_text;
_$("area_search_msg").innerHTML="<strong>"+nb_change+"</strong> "+this.get_translation("occurrence_replaced");
// firefox and opera doesn't manage with the focus if it's done directly
//editArea.textarea.focus();editArea.textarea.textareaFocused=true;
setTimeout("editArea.textarea.focus();editArea.textarea.textareaFocused=true;", 100);
}
};