1098 lines
No EOL
36 KiB
JavaScript
Executable file
1098 lines
No EOL
36 KiB
JavaScript
Executable file
//replace tabulation by the good number of white spaces
|
|
EditArea.prototype.replace_tab= function(text){
|
|
return text.replace(/((\n?)([^\t\n]*)\t)/gi, editArea.smartTab); // slower than simple replace...
|
|
};
|
|
|
|
// call by the replace_tab function
|
|
EditArea.prototype.smartTab= function(){
|
|
val=" ";
|
|
return EditArea.prototype.smartTab.arguments[2] + EditArea.prototype.smartTab.arguments[3] + val.substr(0, editArea.tab_nb_char - (EditArea.prototype.smartTab.arguments[3].length)%editArea.tab_nb_char);
|
|
};
|
|
|
|
EditArea.prototype.show_waiting_screen= function(){
|
|
width= this.editor_area.offsetWidth;
|
|
height= this.editor_area.offsetHeight;
|
|
if(this.nav['isGecko'] || this.nav['isOpera'] || this.nav['isIE']>=7){
|
|
width-=2;
|
|
height-=2;
|
|
}
|
|
this.processing_screen.style.display="block";
|
|
this.processing_screen.style.width= width+"px";
|
|
this.processing_screen.style.height= height+"px";
|
|
this.waiting_screen_displayed= true;
|
|
};
|
|
|
|
EditArea.prototype.hide_waiting_screen= function(){
|
|
this.processing_screen.style.display="none";
|
|
this.waiting_screen_displayed= false;
|
|
};
|
|
|
|
EditArea.prototype.add_style= function(styles){
|
|
if(styles.length>0){
|
|
newcss = document.createElement("style");
|
|
newcss.type="text/css";
|
|
newcss.media="all";
|
|
document.getElementsByTagName("head")[0].appendChild(newcss);
|
|
cssrules = styles.split("}");
|
|
newcss = document.styleSheets[0];
|
|
if(newcss.rules) { //IE
|
|
for(i=cssrules.length-2;i>=0;i--) {
|
|
newrule = cssrules[i].split("{");
|
|
newcss.addRule(newrule[0],newrule[1])
|
|
}
|
|
}
|
|
else if(newcss.cssRules) { //Firefox etc
|
|
for(i=cssrules.length-1;i>=0;i--) {
|
|
if(cssrules[i].indexOf("{")!=-1){
|
|
newcss.insertRule(cssrules[i]+"}",0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
EditArea.prototype.set_font= function(family, size){
|
|
var elems= new Array("textarea", "content_highlight", "cursor_pos", "end_bracket", "selection_field", "line_number");
|
|
if(family && family!="")
|
|
this.settings["font_family"]= family;
|
|
if(size && size>0)
|
|
this.settings["font_size"]=size;
|
|
if(this.nav['isOpera']) // opera can't manage non monospace font
|
|
this.settings['font_family']="monospace";
|
|
var elem_font=$("area_font_size");
|
|
if(elem_font){
|
|
for(var i=0; i<elem_font.length; i++){
|
|
if(elem_font.options[i].value && elem_font.options[i].value == this.settings["font_size"])
|
|
elem_font.options[i].selected=true;
|
|
}
|
|
}
|
|
|
|
// calc line height
|
|
elem = $("test_font_size");
|
|
elem.style.fontFamily= ""+this.settings["font_family"];
|
|
elem.style.fontSize= this.settings["font_size"]+"pt";
|
|
elem.innerHTML="0";
|
|
this.lineHeight= elem.offsetHeight;
|
|
|
|
|
|
for(var i=0; i<elems.length; i++){
|
|
var elem= $(elems[i]);
|
|
elem.style.fontFamily= this.settings["font_family"];
|
|
elem.style.fontSize= this.settings["font_size"]+"pt";
|
|
elem.style.lineHeight= this.lineHeight+"px";
|
|
|
|
}
|
|
if(this.nav['isOpera']){ // opera doesn't update font change to the textarea
|
|
var start=this.textarea.selectionStart;
|
|
var end= this.textarea.selectionEnd;
|
|
var parNod = this.textarea.parentNode, nxtSib = this.textarea.nextSibling;
|
|
parNod.removeChild(this.textarea); parNod.insertBefore(this.textarea, nxtSib);
|
|
this.area_select(start, end-start);
|
|
}
|
|
|
|
this.add_style("pre{font-family:"+this.settings["font_family"]+"}");
|
|
|
|
//alert( getAttribute($("edit_area_test_font_size"), "style"));
|
|
|
|
|
|
//alert("font "+this.textarea.style.font);
|
|
// force update of selection field
|
|
this.last_line_selected=-1;
|
|
//if(this.state=="loaded"){
|
|
this.last_selection= new Array();
|
|
this.resync_highlight();
|
|
//}
|
|
/* this.last_selection["indexOfCursor"]=-1;
|
|
this.last_selection["curr_pos"]=-1;
|
|
this.last_selection["line_start"]=-1;
|
|
this.focus();*/
|
|
//this.check_line_selection(false);
|
|
//alert("line_h"+ this.lineHeight + " this.id: "+this.id+ "(size: "+size+")");
|
|
};
|
|
|
|
EditArea.prototype.change_font_size= function(){
|
|
var size=$("area_font_size").value;
|
|
if(size>0)
|
|
this.set_font("", size);
|
|
};
|
|
|
|
|
|
EditArea.prototype.open_inline_popup= function(popup_id){
|
|
this.close_all_inline_popup();
|
|
var popup= $(popup_id);
|
|
var editor= $("editor");
|
|
|
|
// search matching icon
|
|
for(var i=0; i<this.inlinePopup.length; i++){
|
|
if(this.inlinePopup[i]["popup_id"]==popup_id){
|
|
var icon= $(this.inlinePopup[i]["icon_id"]);
|
|
if(icon){
|
|
this.switchClassSticky(icon, 'editAreaButtonSelected', true);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
// check size
|
|
popup.style.height="auto";
|
|
popup.style.overflow= "visible";
|
|
|
|
if(document.body.offsetHeight< popup.offsetHeight){
|
|
popup.style.height= (document.body.offsetHeight-10)+"px";
|
|
popup.style.overflow= "auto";
|
|
}
|
|
|
|
if(!popup.positionned){
|
|
var new_left= editor.offsetWidth /2 - popup.offsetWidth /2;
|
|
var new_top= editor.offsetHeight /2 - popup.offsetHeight /2;
|
|
//var new_top= area.offsetHeight /2 - popup.offsetHeight /2;
|
|
//var new_left= area.offsetWidth /2 - popup.offsetWidth /2;
|
|
//alert("new_top: ("+new_top+") = calculeOffsetTop(area) ("+calculeOffsetTop(area)+") + area.offsetHeight /2("+ area.offsetHeight /2+") - popup.offsetHeight /2("+popup.offsetHeight /2+") - scrollTop: "+document.body.scrollTop);
|
|
popup.style.left= new_left+"px";
|
|
popup.style.top= new_top+"px";
|
|
popup.positionned=true;
|
|
}
|
|
popup.style.visibility="visible";
|
|
|
|
//popup.style.display="block";
|
|
};
|
|
|
|
EditArea.prototype.close_inline_popup= function(popup_id){
|
|
var popup= $(popup_id);
|
|
// search matching icon
|
|
for(var i=0; i<this.inlinePopup.length; i++){
|
|
if(this.inlinePopup[i]["popup_id"]==popup_id){
|
|
var icon= $(this.inlinePopup[i]["icon_id"]);
|
|
if(icon){
|
|
this.switchClassSticky(icon, 'editAreaButtonNormal', false);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
popup.style.visibility="hidden";
|
|
};
|
|
|
|
EditArea.prototype.close_all_inline_popup= function(e){
|
|
for(var i=0; i<this.inlinePopup.length; i++){
|
|
this.close_inline_popup(this.inlinePopup[i]["popup_id"]);
|
|
}
|
|
this.textarea.focus();
|
|
};
|
|
|
|
EditArea.prototype.show_help= function(){
|
|
|
|
this.open_inline_popup("edit_area_help");
|
|
|
|
};
|
|
|
|
EditArea.prototype.new_document= function(){
|
|
this.textarea.value="";
|
|
this.area_select(0,0);
|
|
};
|
|
|
|
EditArea.prototype.get_all_toolbar_height= function(){
|
|
var area= $("editor");
|
|
var results= parent.getChildren(area, "div", "class", "area_toolbar", "all", "0"); // search only direct children
|
|
//results= results.concat(getChildren(area, "table", "class", "area_toolbar", "all", "0"));
|
|
var height=0;
|
|
for(var i=0; i<results.length; i++){
|
|
height+= results[i].offsetHeight;
|
|
}
|
|
//alert("toolbar height: "+height);
|
|
return height;
|
|
};
|
|
|
|
EditArea.prototype.go_to_line= function(line){
|
|
if(!line)
|
|
{
|
|
var icon= $("go_to_line");
|
|
if(icon != null){
|
|
this.restoreClass(icon);
|
|
this.switchClassSticky(icon, 'editAreaButtonSelected', true);
|
|
}
|
|
|
|
line= prompt(this.get_translation("go_to_line_prompt"));
|
|
if(icon != null)
|
|
this.switchClassSticky(icon, 'editAreaButtonNormal', false);
|
|
}
|
|
if(line && line!=null && line.search(/^[0-9]+$/)!=-1){
|
|
var start=0;
|
|
var lines= this.textarea.value.split("\n");
|
|
if(line > lines.length)
|
|
start= this.textarea.value.length;
|
|
else{
|
|
for(var i=0; i<Math.min(line-1, lines.length); i++)
|
|
start+= lines[i].length + 1;
|
|
}
|
|
this.area_select(start, 0);
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
EditArea.prototype.change_smooth_selection_mode= function(setTo){
|
|
//alert("setTo: "+setTo);
|
|
if(this.do_highlight)
|
|
return;
|
|
|
|
if(setTo != null){
|
|
if(setTo === false)
|
|
this.smooth_selection=true;
|
|
else
|
|
this.smooth_selection=false;
|
|
}
|
|
var icon= $("change_smooth_selection");
|
|
this.textarea.focus();
|
|
if(this.smooth_selection===true){
|
|
//setAttribute(icon, "class", getAttribute(icon, "class").replace(/ selected/g, "") );
|
|
/*setAttribute(icon, "oldClassName", "editAreaButtonNormal" );
|
|
setAttribute(icon, "className", "editAreaButtonNormal" );*/
|
|
//this.restoreClass(icon);
|
|
//this.restoreAndSwitchClass(icon,'editAreaButtonNormal');
|
|
this.switchClassSticky(icon, 'editAreaButtonNormal', false);
|
|
|
|
this.smooth_selection=false;
|
|
this.selection_field.style.display= "none";
|
|
$("cursor_pos").style.display= "none";
|
|
$("end_bracket").style.display= "none";
|
|
}else{
|
|
//setAttribute(icon, "class", getAttribute(icon, "class") + " selected");
|
|
//this.switchClass(icon,'editAreaButtonSelected');
|
|
this.switchClassSticky(icon, 'editAreaButtonSelected', false);
|
|
this.smooth_selection=true;
|
|
this.selection_field.style.display= "block";
|
|
$("cursor_pos").style.display= "block";
|
|
$("end_bracket").style.display= "block";
|
|
}
|
|
};
|
|
|
|
// the auto scroll of the textarea has some lacks when it have to show cursor in the visible area when the textarea size change
|
|
// show specifiy whereas it is the "top" or "bottom" of the selection that is showned
|
|
EditArea.prototype.scroll_to_view= function(show){
|
|
if(!this.smooth_selection)
|
|
return;
|
|
var zone= $("result");
|
|
|
|
//var cursor_pos_top= parseInt($("cursor_pos").style.top.replace("px",""));
|
|
var cursor_pos_top= $("cursor_pos").cursor_top;
|
|
if(show=="bottom")
|
|
cursor_pos_top+= (this.last_selection["line_nb"]-1)* this.lineHeight;
|
|
|
|
var max_height_visible= zone.clientHeight + zone.scrollTop;
|
|
var miss_top= cursor_pos_top + this.lineHeight - max_height_visible;
|
|
if(miss_top>0){
|
|
//alert(miss_top);
|
|
zone.scrollTop= zone.scrollTop + miss_top;
|
|
}else if( zone.scrollTop > cursor_pos_top){
|
|
// when erase all the content -> does'nt scroll back to the top
|
|
//alert("else: "+cursor_pos_top);
|
|
zone.scrollTop= cursor_pos_top;
|
|
}
|
|
//var cursor_pos_left= parseInt($("cursor_pos").style.left.replace("px",""));
|
|
var cursor_pos_left= $("cursor_pos").cursor_left;
|
|
var max_width_visible= zone.clientWidth + zone.scrollLeft;
|
|
var miss_left= cursor_pos_left + 10 - max_width_visible;
|
|
if(miss_left>0){
|
|
zone.scrollLeft= zone.scrollLeft + miss_left + 50;
|
|
}else if( zone.scrollLeft > cursor_pos_left){
|
|
zone.scrollLeft= cursor_pos_left ;
|
|
}else if( zone.scrollLeft == 45){
|
|
// show the line numbers if textarea align to it's left
|
|
zone.scrollLeft=0;
|
|
}
|
|
};
|
|
|
|
EditArea.prototype.check_undo= function(only_once){
|
|
if(!editAreas[this.id])
|
|
return false;
|
|
if(this.textareaFocused && editAreas[this.id]["displayed"]==true){
|
|
var text=this.textarea.value;
|
|
if(this.previous.length<=1)
|
|
this.switchClassSticky($("undo"), 'editAreaButtonDisabled', true);
|
|
|
|
if(!this.previous[this.previous.length-1] || this.previous[this.previous.length-1]["text"] != text){
|
|
this.previous.push({"text": text, "selStart": this.textarea.selectionStart, "selEnd": this.textarea.selectionEnd});
|
|
if(this.previous.length > this.settings["max_undo"]+1)
|
|
this.previous.shift();
|
|
|
|
}
|
|
if(this.previous.length >= 2)
|
|
this.switchClassSticky($("undo"), 'editAreaButtonNormal', false);
|
|
}
|
|
|
|
if(!only_once)
|
|
setTimeout("editArea.check_undo()", 3000);
|
|
};
|
|
|
|
EditArea.prototype.undo= function(){
|
|
//alert("undo"+this.previous.length);
|
|
if(this.previous.length > 0){
|
|
if(this.nav['isIE'])
|
|
this.getIESelection();
|
|
// var pos_cursor=this.textarea.selectionStart;
|
|
this.next.push({"text": this.textarea.value, "selStart": this.textarea.selectionStart, "selEnd": this.textarea.selectionEnd});
|
|
var prev= this.previous.pop();
|
|
if(prev["text"]==this.textarea.value && this.previous.length > 0)
|
|
prev=this.previous.pop();
|
|
this.textarea.value= prev["text"];
|
|
this.last_undo= prev["text"];
|
|
this.area_select(prev["selStart"], prev["selEnd"]-prev["selStart"]);
|
|
this.switchClassSticky($("redo"), 'editAreaButtonNormal', false);
|
|
this.resync_highlight(true);
|
|
//alert("undo"+this.previous.length);
|
|
this.check_file_changes();
|
|
}
|
|
};
|
|
|
|
EditArea.prototype.redo= function(){
|
|
if(this.next.length > 0){
|
|
/*if(this.nav['isIE'])
|
|
this.getIESelection();*/
|
|
//var pos_cursor=this.textarea.selectionStart;
|
|
var next= this.next.pop();
|
|
this.previous.push(next);
|
|
this.textarea.value= next["text"];
|
|
this.last_undo= next["text"];
|
|
this.area_select(next["selStart"], next["selEnd"]-next["selStart"]);
|
|
this.switchClassSticky($("undo"), 'editAreaButtonNormal', false);
|
|
this.resync_highlight(true);
|
|
this.check_file_changes();
|
|
}
|
|
if( this.next.length == 0)
|
|
this.switchClassSticky($("redo"), 'editAreaButtonDisabled', true);
|
|
};
|
|
|
|
EditArea.prototype.check_redo= function(){
|
|
if(editArea.next.length == 0 || editArea.textarea.value!=editArea.last_undo){
|
|
editArea.next= new Array(); // undo the ability to use "redo" button
|
|
editArea.switchClassSticky($("redo"), 'editAreaButtonDisabled', true);
|
|
}
|
|
else
|
|
{
|
|
this.switchClassSticky($("redo"), 'editAreaButtonNormal', false);
|
|
}
|
|
};
|
|
|
|
|
|
// functions that manage icons roll over, disabled, etc...
|
|
EditArea.prototype.switchClass = function(element, class_name, lock_state) {
|
|
var lockChanged = false;
|
|
|
|
if (typeof(lock_state) != "undefined" && element != null) {
|
|
element.classLock = lock_state;
|
|
lockChanged = true;
|
|
}
|
|
|
|
if (element != null && (lockChanged || !element.classLock)) {
|
|
element.oldClassName = element.className;
|
|
element.className = class_name;
|
|
}
|
|
};
|
|
|
|
EditArea.prototype.restoreAndSwitchClass = function(element, class_name) {
|
|
if (element != null && !element.classLock) {
|
|
this.restoreClass(element);
|
|
this.switchClass(element, class_name);
|
|
}
|
|
};
|
|
|
|
EditArea.prototype.restoreClass = function(element) {
|
|
if (element != null && element.oldClassName && !element.classLock) {
|
|
element.className = element.oldClassName;
|
|
element.oldClassName = null;
|
|
}
|
|
};
|
|
|
|
EditArea.prototype.setClassLock = function(element, lock_state) {
|
|
if (element != null)
|
|
element.classLock = lock_state;
|
|
};
|
|
|
|
EditArea.prototype.switchClassSticky = function(element, class_name, lock_state) {
|
|
var lockChanged = false;
|
|
if (typeof(lock_state) != "undefined" && element != null) {
|
|
element.classLock = lock_state;
|
|
lockChanged = true;
|
|
}
|
|
|
|
if (element != null && (lockChanged || !element.classLock)) {
|
|
element.className = class_name;
|
|
element.oldClassName = class_name;
|
|
}
|
|
};
|
|
|
|
//make the "page up" and "page down" buttons works correctly
|
|
EditArea.prototype.scroll_page= function(params){
|
|
var dir= params["dir"];
|
|
var shift_pressed= params["shift"];
|
|
screen_height=$("result").clientHeight;
|
|
var lines= this.textarea.value.split("\n");
|
|
var new_pos=0;
|
|
var length=0;
|
|
var char_left=0;
|
|
var line_nb=0;
|
|
if(dir=="up"){
|
|
//val= Math.max(0, $("result").scrollTop - screen_height);
|
|
//$("result").scrollTop= val;
|
|
var scroll_line= Math.ceil((screen_height -30)/this.lineHeight);
|
|
if(this.last_selection["selec_direction"]=="up"){
|
|
for(line_nb=0; line_nb< Math.min(this.last_selection["line_start"]-scroll_line, lines.length); line_nb++){
|
|
new_pos+= lines[line_nb].length + 1;
|
|
}
|
|
char_left=Math.min(lines[Math.min(lines.length-1, line_nb)].length, this.last_selection["curr_pos"]-1);
|
|
if(shift_pressed)
|
|
length=this.last_selection["selectionEnd"]-new_pos-char_left;
|
|
this.area_select(new_pos+char_left, length);
|
|
view="top";
|
|
}else{
|
|
view="bottom";
|
|
for(line_nb=0; line_nb< Math.min(this.last_selection["line_start"]+this.last_selection["line_nb"]-1-scroll_line, lines.length); line_nb++){
|
|
new_pos+= lines[line_nb].length + 1;
|
|
}
|
|
char_left=Math.min(lines[Math.min(lines.length-1, line_nb)].length, this.last_selection["curr_pos"]-1);
|
|
if(shift_pressed){
|
|
//length=this.last_selection["selectionEnd"]-new_pos-char_left;
|
|
start= Math.min(this.last_selection["selectionStart"], new_pos+char_left);
|
|
length= Math.max(new_pos+char_left, this.last_selection["selectionStart"] )- start ;
|
|
if(new_pos+char_left < this.last_selection["selectionStart"])
|
|
view="top";
|
|
}else
|
|
start=new_pos+char_left;
|
|
this.area_select(start, length);
|
|
|
|
}
|
|
}else{
|
|
//val= Math.max($("result").style.height.replace("px", ""), $("result").scrollTop + screen_height);
|
|
//$("result").scrollTop= val;
|
|
var scroll_line= Math.floor((screen_height-30)/this.lineHeight);
|
|
if(this.last_selection["selec_direction"]=="down"){
|
|
view="bottom";
|
|
for(line_nb=0; line_nb< Math.min(this.last_selection["line_start"]+this.last_selection["line_nb"]-2+scroll_line, lines.length); line_nb++){
|
|
if(line_nb==this.last_selection["line_start"]-1)
|
|
char_left= this.last_selection["selectionStart"] -new_pos;
|
|
new_pos+= lines[line_nb].length + 1;
|
|
|
|
}
|
|
if(shift_pressed){
|
|
length=Math.abs(this.last_selection["selectionStart"]-new_pos);
|
|
length+=Math.min(lines[Math.min(lines.length-1, line_nb)].length, this.last_selection["curr_pos"]);
|
|
//length+=Math.min(lines[Math.min(lines.length-1, line_nb)].length, char_left);
|
|
this.area_select(Math.min(this.last_selection["selectionStart"], new_pos), length);
|
|
}else{
|
|
this.area_select(new_pos+char_left, 0);
|
|
}
|
|
|
|
}else{
|
|
view="top";
|
|
for(line_nb=0; line_nb< Math.min(this.last_selection["line_start"]+scroll_line-1, lines.length, lines.length); line_nb++){
|
|
if(line_nb==this.last_selection["line_start"]-1)
|
|
char_left= this.last_selection["selectionStart"] -new_pos;
|
|
new_pos+= lines[line_nb].length + 1;
|
|
}
|
|
if(shift_pressed){
|
|
length=Math.abs(this.last_selection["selectionEnd"]-new_pos-char_left);
|
|
length+=Math.min(lines[Math.min(lines.length-1, line_nb)].length, this.last_selection["curr_pos"])- char_left-1;
|
|
//length+=Math.min(lines[Math.min(lines.length-1, line_nb)].length, char_left);
|
|
this.area_select(Math.min(this.last_selection["selectionEnd"], new_pos+char_left), length);
|
|
if(new_pos+char_left > this.last_selection["selectionEnd"])
|
|
view="bottom";
|
|
}else{
|
|
this.area_select(new_pos+char_left, 0);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
this.check_line_selection();
|
|
this.scroll_to_view(view);
|
|
};
|
|
|
|
EditArea.prototype.start_resize= function(e){
|
|
parent.editAreaLoader.resize["id"]= editArea.id;
|
|
parent.editAreaLoader.resize["start_x"]= (e)? e.pageX : event.x + document.body.scrollLeft;
|
|
parent.editAreaLoader.resize["start_y"]= (e)? e.pageY : event.y + document.body.scrollTop;
|
|
if(editArea.nav['isIE']){
|
|
editArea.textarea.focus();
|
|
editArea.getIESelection();
|
|
}
|
|
parent.editAreaLoader.resize["selectionStart"]= editArea.textarea.selectionStart;
|
|
parent.editAreaLoader.resize["selectionEnd"]= editArea.textarea.selectionEnd;
|
|
/*parent.editAreaLoader.resize["frame_top"]= parent.calculeOffsetTop(parent.editAreas[editArea.id]["textarea"]);
|
|
/*parent.editAreaLoader.resize["frame_left"]= parent.calculeOffsetLeft(parent.frames[editArea.id]);*/
|
|
parent.editAreaLoader.start_resize_area();
|
|
};
|
|
|
|
EditArea.prototype.toggle_full_screen= function(to){
|
|
if(typeof(to)=="undefined")
|
|
to= !this.fullscreen['isFull'];
|
|
var old= this.fullscreen['isFull'];
|
|
this.fullscreen['isFull']= to;
|
|
var icon= $("fullscreen");
|
|
if(to && to!=old)
|
|
{ // toogle on fullscreen
|
|
var selStart= this.textarea.selectionStart;
|
|
var selEnd= this.textarea.selectionEnd;
|
|
var html= parent.document.getElementsByTagName("html")[0];
|
|
var frame= parent.document.getElementById("frame_"+this.id);
|
|
|
|
this.fullscreen['old_overflow']= parent.get_css_property(html, "overflow");
|
|
this.fullscreen['old_height']= parent.get_css_property(html, "height");
|
|
this.fullscreen['old_width']= parent.get_css_property(html, "width");
|
|
this.fullscreen['old_scrollTop']= html.scrollTop;
|
|
this.fullscreen['old_scrollLeft']= html.scrollLeft;
|
|
this.fullscreen['old_zIndex']= parent.get_css_property(frame, "z-index");
|
|
if(this.nav['isOpera']){
|
|
html.style.height= "100%";
|
|
html.style.width= "100%";
|
|
}
|
|
html.style.overflow= "hidden";
|
|
html.scrollTop=0;
|
|
html.scrollLeft=0;
|
|
|
|
|
|
//html.style.backgroundColor= "#FF0000";
|
|
// alert(screen.height+"\n"+window.innerHeight+"\n"+html.clientHeight+"\n"+window.offsetHeight+"\n"+document.body.offsetHeight);
|
|
|
|
|
|
frame.style.position="absolute";
|
|
frame.style.width= html.clientWidth+"px";
|
|
frame.style.height= html.clientHeight+"px";
|
|
frame.style.display="block";
|
|
frame.style.zIndex="999999";
|
|
frame.style.top="0px";
|
|
frame.style.left="0px";
|
|
|
|
// if the iframe was in a div with position absolute, the top and left are the one of the div,
|
|
// so I fix it by seeing at witch position the iframe start and correcting it
|
|
frame.style.top= "-"+parent.calculeOffsetTop(frame)+"px";
|
|
frame.style.left= "-"+parent.calculeOffsetLeft(frame)+"px";
|
|
|
|
// parent.editAreaLoader.execCommand(this.id, "update_size();");
|
|
// var body=parent.document.getElementsByTagName("body")[0];
|
|
// body.appendChild(frame);
|
|
|
|
this.switchClassSticky(icon, 'editAreaButtonSelected', false);
|
|
this.fullscreen['allow_resize']= this.resize_allowed;
|
|
this.allow_resize(false);
|
|
|
|
//this.area_select(selStart, selEnd-selStart);
|
|
|
|
|
|
// opera can't manage to do a direct size update
|
|
if(this.nav['isFirefox']){
|
|
parent.editAreaLoader.execCommand(this.id, "update_size();");
|
|
this.area_select(selStart, selEnd-selStart);
|
|
this.scroll_to_view();
|
|
this.focus();
|
|
}else{
|
|
setTimeout("parent.editAreaLoader.execCommand('"+ this.id +"', 'update_size();');editArea.focus();", 10);
|
|
}
|
|
|
|
|
|
}
|
|
else if(to!=old)
|
|
{ // toogle off fullscreen
|
|
var selStart= this.textarea.selectionStart;
|
|
var selEnd= this.textarea.selectionEnd;
|
|
|
|
var frame= parent.document.getElementById("frame_"+this.id);
|
|
frame.style.position="static";
|
|
frame.style.zIndex= this.fullscreen['old_zIndex'];
|
|
|
|
var html= parent.document.getElementsByTagName("html")[0];
|
|
// html.style.overflow= this.fullscreen['old_overflow'];
|
|
|
|
if(this.nav['isOpera']){
|
|
html.style.height= "auto";
|
|
html.style.width= "auto";
|
|
html.style.overflow= "auto";
|
|
}else if(this.nav['isIE'] && parent!=top){ // IE doesn't manage html overflow in frames like in normal page...
|
|
html.style.overflow= "auto";
|
|
}
|
|
else
|
|
html.style.overflow= this.fullscreen['old_overflow'];
|
|
html.scrollTop= this.fullscreen['old_scrollTop'];
|
|
html.scrollTop= this.fullscreen['old_scrollLeft'];
|
|
|
|
parent.editAreaLoader.hide(this.id);
|
|
parent.editAreaLoader.show(this.id);
|
|
|
|
this.switchClassSticky(icon, 'editAreaButtonNormal', false);
|
|
if(this.fullscreen['allow_resize'])
|
|
this.allow_resize(this.fullscreen['allow_resize']);
|
|
if(this.nav['isFirefox']){
|
|
this.area_select(selStart, selEnd-selStart);
|
|
setTimeout("editArea.scroll_to_view();", 10);
|
|
}
|
|
|
|
//parent.editAreaLoader.remove_event(parent.window, "resize", editArea.update_size);
|
|
}
|
|
|
|
};
|
|
|
|
EditArea.prototype.allow_resize= function(allow){
|
|
var resize= $("resize_area");
|
|
if(allow){
|
|
|
|
resize.style.visibility="visible";
|
|
parent.editAreaLoader.add_event(resize, "mouseup", editArea.start_resize);
|
|
}else{
|
|
resize.style.visibility="hidden";
|
|
parent.editAreaLoader.remove_event(resize, "mouseup", editArea.start_resize);
|
|
}
|
|
this.resize_allowed= allow;
|
|
};
|
|
|
|
|
|
EditArea.prototype.change_syntax= function(new_syntax, is_waiting){
|
|
// alert("cahnge to "+new_syntax);
|
|
// the syntax is the same
|
|
if(new_syntax==this.settings['syntax'])
|
|
return true;
|
|
|
|
// check that the syntax is one allowed
|
|
var founded= false;
|
|
for(var i=0; i<this.syntax_list.length; i++)
|
|
{
|
|
if(this.syntax_list[i]==new_syntax)
|
|
founded= true;
|
|
}
|
|
|
|
if(founded==true)
|
|
{
|
|
// the reg syntax file is not loaded
|
|
if(!parent.editAreaLoader.load_syntax[new_syntax])
|
|
{
|
|
// load the syntax file and wait for file loading
|
|
if(!is_waiting)
|
|
parent.editAreaLoader.load_script(parent.editAreaLoader.baseURL + "reg_syntax/" + new_syntax + ".js");
|
|
setTimeout("editArea.change_syntax('"+ new_syntax +"', true);", 100);
|
|
this.show_waiting_screen();
|
|
}
|
|
else
|
|
{
|
|
if(!this.allready_used_syntax[new_syntax])
|
|
{ // the syntax has still not been used
|
|
// rebuild syntax definition for new languages
|
|
parent.editAreaLoader.init_syntax_regexp();
|
|
// add style to the new list
|
|
this.add_style(parent.editAreaLoader.syntax[new_syntax]["styles"]);
|
|
this.allready_used_syntax[new_syntax]=true;
|
|
}
|
|
// be sure that the select option is correctly updated
|
|
var sel= $("syntax_selection");
|
|
if(sel && sel.value!=new_syntax)
|
|
{
|
|
for(var i=0; i<sel.length; i++){
|
|
if(sel.options[i].value && sel.options[i].value == new_syntax)
|
|
sel.options[i].selected=true;
|
|
}
|
|
}
|
|
|
|
/* if(this.settings['syntax'].length==0)
|
|
{
|
|
this.switchClassSticky($("highlight"), 'editAreaButtonNormal', false);
|
|
this.switchClassSticky($("reset_highlight"), 'editAreaButtonNormal', false);
|
|
this.change_highlight(true);
|
|
}
|
|
*/
|
|
this.settings['syntax']= new_syntax;
|
|
this.resync_highlight(true);
|
|
this.hide_waiting_screen();
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
|
|
|
|
// check if the file has changed
|
|
EditArea.prototype.set_editable= function(is_editable){
|
|
if(is_editable)
|
|
{
|
|
document.body.className= "";
|
|
this.textarea.readOnly= false;
|
|
this.is_editable= true;
|
|
}
|
|
else
|
|
{
|
|
document.body.className= "non_editable";
|
|
this.textarea.readOnly= true;
|
|
this.is_editable= false;
|
|
}
|
|
|
|
if(editAreas[this.id]["displayed"]==true)
|
|
this.update_size();
|
|
};
|
|
|
|
/***** Wrap mode *****/
|
|
// open a new tab for the given file
|
|
EditArea.prototype.set_wrap_text= function(to){
|
|
this.settings['wrap_text'] = to;
|
|
if( this.settings['wrap_text'] )
|
|
{
|
|
wrap_mode = 'soft';
|
|
this.container.className+= ' wrap_text';
|
|
}
|
|
else
|
|
{
|
|
wrap_mode = 'off';
|
|
this.container.className= this.container.className.replace(/ wrap_text/g, '');
|
|
}
|
|
|
|
|
|
var t= this.textarea;
|
|
t.wrap= wrap_mode;
|
|
t.setAttribute('wrap', wrap_mode);
|
|
// seul IE supporte de changer à la volée le wrap mode du textarea
|
|
if(!this.nav['isIE']){
|
|
var start=t.selectionStart, end= t.selectionEnd;
|
|
var parNod = t.parentNode, nxtSib = t.nextSibling;
|
|
parNod.removeChild(t); parNod.insertBefore(t, nxtSib);
|
|
this.area_select(start, end-start);
|
|
/* // v = s.value;
|
|
n = s.cloneNode(true);
|
|
n.setAttribute("wrap", val);
|
|
s.parentNode.replaceChild(n, s);
|
|
// n.value = v;*/
|
|
}
|
|
};
|
|
/***** tabbed files managing functions *****/
|
|
|
|
// open a new tab for the given file
|
|
EditArea.prototype.open_file= function(settings){
|
|
|
|
if(settings['id']!="undefined")
|
|
{
|
|
var id= settings['id'];
|
|
// create a new file object with defautl values
|
|
var new_file= new Object();
|
|
new_file['id']= id;
|
|
new_file['title']= id;
|
|
new_file['text']= "";
|
|
new_file['last_selection']= "";
|
|
new_file['last_text_to_highlight']= "";
|
|
new_file['last_hightlighted_text']= "";
|
|
new_file['previous']= new Array();
|
|
new_file['next']= new Array();
|
|
new_file['last_undo']= "";
|
|
new_file['smooth_selection']= this.settings['smooth_selection'];
|
|
new_file['do_highlight']= this.settings['start_highlight'];
|
|
new_file['syntax']= this.settings['syntax'];
|
|
new_file['scroll_top']= 0;
|
|
new_file['scroll_left']= 0;
|
|
new_file['selection_start']= 0;
|
|
new_file['selection_end']= 0;
|
|
new_file['edited']= false;
|
|
new_file['font_size']= this.settings["font_size"];
|
|
new_file['font_family']= this.settings["font_family"];
|
|
new_file['toolbar']= {'links':{}, 'selects': {}};
|
|
new_file['compare_edited_text']= new_file['text'];
|
|
|
|
|
|
this.files[id]= new_file;
|
|
this.update_file(id, settings);
|
|
this.files[id]['compare_edited_text']= this.files[id]['text'];
|
|
|
|
|
|
var html_id= 'tab_file_'+encodeURIComponent(id);
|
|
this.filesIdAssoc[html_id]= id;
|
|
this.files[id]['html_id']= html_id;
|
|
|
|
if(!$(this.files[id]['html_id']) && id!="")
|
|
{
|
|
// be sure the tab browsing area is displayed
|
|
this.tab_browsing_area.style.display= "block";
|
|
var elem= document.createElement('li');
|
|
elem.id= this.files[id]['html_id'];
|
|
var close= "<img src=\""+ parent.editAreaLoader.baseURL +"images/close.gif\" title=\""+ this.get_translation('close_tab', 'word') +"\" onclick=\"editArea.execCommand('close_file', editArea.filesIdAssoc['"+ html_id +"']);return false;\" class=\"hidden\" onmouseover=\"this.className=''\" onmouseout=\"this.className='hidden'\" />";
|
|
elem.innerHTML= "<a onclick=\"javascript:editArea.execCommand('switch_to_file', editArea.filesIdAssoc['"+ html_id +"']);\" selec=\"none\"><b><span><strong class=\"edited\">*</strong>"+ this.files[id]['title'] + close +"</span></b></a>";
|
|
$('tab_browsing_list').appendChild(elem);
|
|
var elem= document.createElement('text');
|
|
this.update_size();
|
|
}
|
|
|
|
// open file callback (for plugin)
|
|
if(id!="")
|
|
this.execCommand('file_open', this.files[id]);
|
|
|
|
this.switch_to_file(id, true);
|
|
return true;
|
|
}
|
|
else
|
|
return false;
|
|
};
|
|
|
|
// close the given file
|
|
EditArea.prototype.close_file= function(id){
|
|
if(this.files[id])
|
|
{
|
|
this.save_file(id);
|
|
|
|
// close file callback
|
|
if(this.execCommand('file_close', this.files[id])!==false)
|
|
{
|
|
// remove the tab in the toolbar
|
|
var li= $(this.files[id]['html_id']);
|
|
li.parentNode.removeChild(li);
|
|
// select a new file
|
|
if(id== this.curr_file)
|
|
{
|
|
var next_file= "";
|
|
var is_next= false;
|
|
for(var i in this.files)
|
|
{
|
|
if(is_next)
|
|
{
|
|
next_file= i;
|
|
break;
|
|
}
|
|
else if(i==id)
|
|
is_next= true;
|
|
else
|
|
next_file= i;
|
|
}
|
|
// display the next file
|
|
this.switch_to_file(next_file);
|
|
}
|
|
// clear datas
|
|
delete (this.files[id]);
|
|
this.update_size();
|
|
}
|
|
}
|
|
};
|
|
|
|
// backup current file datas
|
|
EditArea.prototype.save_file= function(id){
|
|
if(this.files[id])
|
|
{
|
|
var save= this.files[id];
|
|
save['last_selection']= this.last_selection;
|
|
save['last_text_to_highlight']= this.last_text_to_highlight;
|
|
save['last_hightlighted_text']= this.last_hightlighted_text;
|
|
save['previous']= this.previous;
|
|
save['next']= this.next;
|
|
save['last_undo']= this.last_undo;
|
|
save['smooth_selection']= this.smooth_selection;
|
|
save['do_highlight']= this.do_highlight;
|
|
save['syntax']= this.settings['syntax'];
|
|
save['text']= this.textarea.value;
|
|
save['scroll_top']= this.result.scrollTop;
|
|
save['scroll_left']= this.result.scrollLeft;
|
|
save['selection_start']= this.last_selection["selectionStart"];
|
|
save['selection_end']= this.last_selection["selectionEnd"];
|
|
save['font_size']= this.settings["font_size"];
|
|
save['font_family']= this.settings["font_family"];
|
|
save['toolbar']= {'links':{}, 'selects': {}};
|
|
// save toolbar buttons state for fileSpecific buttons
|
|
var links= $("toolbar_1").getElementsByTagName("a");
|
|
for(var i=0; i<links.length; i++)
|
|
{
|
|
if(links[i].getAttribute('fileSpecific')=='yes')
|
|
{
|
|
var save_butt= new Object();
|
|
var img= links[i].getElementsByTagName('img')[0];
|
|
save_butt['classLock']= img.classLock;
|
|
save_butt['className']= img.className;
|
|
save_butt['oldClassName']= img.oldClassName;
|
|
|
|
save['toolbar']['links'][links[i].id]= save_butt;
|
|
}
|
|
}
|
|
// save toolbar select state for fileSpecific buttons
|
|
var selects= $("toolbar_1").getElementsByTagName("select");
|
|
for(var i=0; i<selects.length; i++)
|
|
{
|
|
if(selects[i].getAttribute('fileSpecific')=='yes')
|
|
{
|
|
save['toolbar']['selects'][selects[i].id]= selects[i].value;
|
|
}
|
|
}
|
|
|
|
this.files[id]= save;
|
|
|
|
return save;
|
|
}
|
|
else
|
|
return false;
|
|
};
|
|
|
|
// update file_datas
|
|
EditArea.prototype.update_file= function(id, new_values){
|
|
for(var i in new_values)
|
|
{
|
|
this.files[id][i]= new_values[i];
|
|
}
|
|
};
|
|
|
|
// display file datas
|
|
EditArea.prototype.display_file= function(id){
|
|
// check if there is at least one tab file displayed
|
|
if(id=='')
|
|
{
|
|
this.textarea.readOnly= true;
|
|
this.tab_browsing_area.style.display= "none";
|
|
$("no_file_selected").style.display= "block";
|
|
this.result.className= "empty";
|
|
if(!this.files[''])
|
|
this.open_file({id: ''});
|
|
}
|
|
else
|
|
{
|
|
this.result.className= "";
|
|
this.textarea.readOnly= !this.is_editable;
|
|
$("no_file_selected").style.display= "none";
|
|
this.tab_browsing_area.style.display= "block";
|
|
}
|
|
|
|
this.check_redo(true);
|
|
this.check_undo(true);
|
|
this.curr_file= id;
|
|
|
|
// replace selected tab file
|
|
var lis= this.tab_browsing_area.getElementsByTagName('li');
|
|
for(var i=0; i<lis.length; i++)
|
|
{
|
|
if(lis[i].id == this.files[id]['html_id'])
|
|
lis[i].className='selected';
|
|
else
|
|
lis[i].className='';
|
|
}
|
|
|
|
// replace next files datas
|
|
var new_file= this.files[id];
|
|
|
|
// restore text content
|
|
this.textarea.value= new_file['text'];
|
|
|
|
// restore font-size
|
|
this.set_font(new_file['font_family'], new_file['font_size']);
|
|
|
|
// restore selection and scroll
|
|
this.area_select(new_file['last_selection']['selection_start'], new_file['last_selection']['selection_end'] - new_file['last_selection']['selection_start']);
|
|
this.manage_size(true);
|
|
this.result.scrollTop= new_file['scroll_top'];
|
|
this.result.scrollLeft= new_file['scroll_left'];
|
|
|
|
// restore undo, redo
|
|
this.previous= new_file['previous'];
|
|
this.next= new_file['next'];
|
|
this.last_undo= new_file['last_undo'];
|
|
this.check_redo(true);
|
|
this.check_undo(true);
|
|
|
|
// restore highlight
|
|
this.execCommand("change_highlight", new_file['do_highlight']);
|
|
this.execCommand("change_syntax", new_file['syntax']);
|
|
|
|
// smooth mode
|
|
this.execCommand("change_smooth_selection_mode", new_file['smooth_selection']);
|
|
|
|
// restore links state in toolbar
|
|
var links= new_file['toolbar']['links'];
|
|
for(var i in links)
|
|
{
|
|
if(img= $(i).getElementsByTagName('img')[0])
|
|
{
|
|
var save_butt= new Object();
|
|
img.classLock= links[i]['classLock'];
|
|
img.className= links[i]['className'];
|
|
img.oldClassName= links[i]['oldClassName'];
|
|
}
|
|
}
|
|
// restore select state in toolbar
|
|
var selects= new_file['toolbar']['selects'];
|
|
for(var i in selects)
|
|
{
|
|
var options= $(i).options;
|
|
for(var j=0; j<options.length; j++)
|
|
{
|
|
if(options[j].value == selects[i])
|
|
$(i).options[j].selected=true;
|
|
}
|
|
}
|
|
|
|
};
|
|
|
|
// change tab for displaying a new one
|
|
EditArea.prototype.switch_to_file= function(file_to_show, force_refresh){
|
|
if(file_to_show!=this.curr_file || force_refresh)
|
|
{
|
|
this.save_file(this.curr_file);
|
|
if(this.curr_file!='')
|
|
this.execCommand('file_switch_off', this.files[this.curr_file]);
|
|
this.display_file(file_to_show);
|
|
if(file_to_show!='')
|
|
this.execCommand('file_switch_on', this.files[file_to_show]);
|
|
}
|
|
};
|
|
|
|
// get all infos for the given file
|
|
EditArea.prototype.get_file= function(id){
|
|
if(id==this.curr_file)
|
|
this.save_file(id);
|
|
return this.files[id];
|
|
};
|
|
|
|
// get all available files infos
|
|
EditArea.prototype.get_all_files= function(){
|
|
tmp_files= this.files;
|
|
this.save_file(this.curr_file);
|
|
if(tmp_files[''])
|
|
delete(this.files['']);
|
|
return tmp_files;
|
|
};
|
|
|
|
|
|
// check if the file has changed
|
|
EditArea.prototype.check_file_changes= function(){
|
|
|
|
var id= this.curr_file;
|
|
if(this.files[id] && this.files[id]['compare_edited_text']!=undefined)
|
|
{
|
|
if(this.files[id]['compare_edited_text'].length==this.textarea.value.length && this.files[id]['compare_edited_text']==this.textarea.value)
|
|
{
|
|
if(this.files[id]['edited']!= false)
|
|
this.set_file_edited_mode(id, false);
|
|
}
|
|
else
|
|
{
|
|
if(this.files[id]['edited']!= true)
|
|
this.set_file_edited_mode(id, true);
|
|
}
|
|
}
|
|
};
|
|
|
|
// set if the file is edited or not
|
|
EditArea.prototype.set_file_edited_mode= function(id, to){
|
|
// change CSS for edited tab
|
|
if(this.files[id] && $(this.files[id]['html_id']))
|
|
{
|
|
var link= $(this.files[id]['html_id']).getElementsByTagName('a')[0];
|
|
if(to==true)
|
|
{
|
|
link.className= 'edited';
|
|
}
|
|
else
|
|
{
|
|
link.className= '';
|
|
if(id==this.curr_file)
|
|
text= this.textarea.value;
|
|
else
|
|
text= this.files[id]['text'];
|
|
this.files[id]['compare_edited_text']= text;
|
|
}
|
|
|
|
this.files[id]['edited']= to;
|
|
}
|
|
};
|
|
|
|
EditArea.prototype.set_show_line_colors = function(new_value){
|
|
this.show_line_colors = new_value;
|
|
|
|
if( new_value )
|
|
this.selection_field.className += ' show_colors';
|
|
else
|
|
this.selection_field.className = this.selection_field.className.replace( / show_colors/g, '' );
|
|
}; |