- //replace tabulation by the good number of white spaces\r
- EditArea.prototype.replace_tab= function(text){\r
- return text.replace(/((\n?)([^\t\n]*)\t)/gi, editArea.smartTab); // slower than simple replace... \r
- };\r
- \r
- // call by the replace_tab function\r
- EditArea.prototype.smartTab= function(){\r
- val=" ";\r
- 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);\r
- };\r
- \r
- EditArea.prototype.show_waiting_screen= function(){\r
- width = this.editor_area.offsetWidth;\r
- height = this.editor_area.offsetHeight;\r
- if( !(this.isIE && this.isIE<6) )\r
- {\r
- width -= 2;\r
- height -= 2;\r
- }\r
- this.processing_screen.style.display= "block";\r
- this.processing_screen.style.width = width+"px";\r
- this.processing_screen.style.height = height+"px";\r
- this.waiting_screen_displayed = true;\r
- };\r
- \r
- EditArea.prototype.hide_waiting_screen= function(){\r
- this.processing_screen.style.display="none";\r
- this.waiting_screen_displayed= false;\r
- };\r
- \r
- EditArea.prototype.add_style= function(styles){\r
- if(styles.length>0){\r
- newcss = document.createElement("style");\r
- newcss.type="text/css";\r
- newcss.media="all";\r
- if(newcss.styleSheet){ // IE\r
- newcss.styleSheet.cssText = styles;\r
- } else { // W3C\r
- newcss.appendChild(document.createTextNode(styles));\r
- }\r
- document.getElementsByTagName("head")[0].appendChild(newcss);\r
- }\r
- };\r
- \r
- EditArea.prototype.set_font= function(family, size){\r
- var t=this, a=this.textarea, s=this.settings, elem_font, i, elem;\r
- // list all elements concerned by font changes\r
- var elems= ["textarea", "content_highlight", "cursor_pos", "end_bracket", "selection_field", "selection_field_text", "line_number"];\r
- \r
- if(family && family!="")\r
- s["font_family"]= family;\r
- if(size && size>0)\r
- s["font_size"] = size;\r
- if( t.isOpera && t.isOpera < 9.6 ) // opera<9.6 can't manage non monospace font\r
- s['font_family']="monospace";\r
- \r
- // update the select tag\r
- if( elem_font = _$("area_font_size") )\r
- { \r
- for( i = 0; i < elem_font.length; i++ )\r
- {\r
- if( elem_font.options[i].value && elem_font.options[i].value == s["font_size"] )\r
- elem_font.options[i].selected=true;\r
- }\r
- }\r
- \r
- /*\r
- * somethimes firefox has rendering mistake with non-monospace font for text width in textarea vs in div for changing font size (eg: verdana change between 11pt to 12pt)\r
- * => looks like a browser internal random bug as text width can change while content_highlight is updated\r
- * we'll check if the font-size produce the same text width inside textarea and div and if not, we'll increment the font-size\r
- * \r
- * This is an ugly fix \r
- */ \r
- if( t.isFirefox )\r
- {\r
- var nbTry = 3;\r
- do {\r
- var div1 = document.createElement( 'div' ), text1 = document.createElement( 'textarea' );\r
- var styles = {\r
- width: '40px',\r
- overflow: 'scroll',\r
- zIndex: 50,\r
- visibility: 'hidden',\r
- fontFamily: s["font_family"],\r
- fontSize: s["font_size"]+"pt",\r
- lineHeight: t.lineHeight+"px",\r
- padding: '0',\r
- margin: '0',\r
- border: 'none',\r
- whiteSpace: 'nowrap'\r
- };\r
- var diff, changed = false;\r
- for( i in styles )\r
- {\r
- div1.style[ i ] = styles[i];\r
- text1.style[ i ] = styles[i];\r
- }\r
- // no wrap for this text\r
- text1.wrap = 'off';\r
- text1.setAttribute('wrap', 'off');\r
- t.container.appendChild( div1 );\r
- t.container.appendChild( text1 );\r
- // try to make FF to bug\r
- div1.innerHTML = text1.value = 'azertyuiopqsdfghjklm';\r
- div1.innerHTML = text1.value = text1.value+'wxcvbn^p*รน$!:;,,';\r
- diff = text1.scrollWidth - div1.scrollWidth;
- \r
- // firefox return here a diff of 1 px between equals scrollWidth (can't explain)\r
- if( Math.abs( diff ) >= 2 )\r
- {\r
- s["font_size"]++;\r
- changed = true;\r
- }\r
- t.container.removeChild( div1 );\r
- t.container.removeChild( text1 );\r
- nbTry--;\r
- }while( changed && nbTry > 0 );\r
- }\r
- \r
- \r
- // calc line height\r
- elem = t.test_font_size;\r
- elem.style.fontFamily = ""+s["font_family"];\r
- elem.style.fontSize = s["font_size"]+"pt"; \r
- elem.innerHTML = "0"; \r
- t.lineHeight = elem.offsetHeight;\r
-\r
- // update font for all concerned elements\r
- for( i=0; i<elems.length; i++)\r
- {\r
- elem = _$(elems[i]); \r
- elem.style.fontFamily = s["font_family"];\r
- elem.style.fontSize = s["font_size"]+"pt";\r
- elem.style.lineHeight = t.lineHeight+"px";\r
- }\r
- // define a css for <pre> tags\r
- t.add_style("pre{font-family:"+s["font_family"]+"}");\r
- \r
- // old opera and IE>=8 doesn't update font changes to the textarea\r
- if( ( t.isOpera && t.isOpera < 9.6 ) || t.isIE >= 8 )\r
- {\r
- var parNod = a.parentNode, nxtSib = a.nextSibling, start= a.selectionStart, end= a.selectionEnd;\r
- parNod.removeChild(a);\r
- parNod.insertBefore(a, nxtSib);\r
- t.area_select(start, end-start);\r
- }\r
- \r
- // force update of selection field\r
- this.focus();\r
- this.update_size();\r
- this.check_line_selection();\r
- };\r
- \r
- EditArea.prototype.change_font_size= function(){\r
- var size=_$("area_font_size").value;\r
- if(size>0)\r
- this.set_font("", size); \r
- };\r
- \r
- \r
- EditArea.prototype.open_inline_popup= function(popup_id){\r
- this.close_all_inline_popup();\r
- var popup= _$(popup_id); \r
- var editor= _$("editor");\r
- \r
- // search matching icon\r
- for(var i=0; i<this.inlinePopup.length; i++){\r
- if(this.inlinePopup[i]["popup_id"]==popup_id){\r
- var icon= _$(this.inlinePopup[i]["icon_id"]);\r
- if(icon){\r
- this.switchClassSticky(icon, 'editAreaButtonSelected', true); \r
- break;\r
- }\r
- }\r
- }\r
- // check size\r
- popup.style.height="auto";\r
- popup.style.overflow= "visible";\r
- \r
- if(document.body.offsetHeight< popup.offsetHeight){\r
- popup.style.height= (document.body.offsetHeight-10)+"px";\r
- popup.style.overflow= "auto";\r
- }\r
- \r
- if(!popup.positionned){\r
- var new_left= editor.offsetWidth /2 - popup.offsetWidth /2;\r
- var new_top= editor.offsetHeight /2 - popup.offsetHeight /2;\r
- //var new_top= area.offsetHeight /2 - popup.offsetHeight /2;\r
- //var new_left= area.offsetWidth /2 - popup.offsetWidth /2;\r
- //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);\r
- popup.style.left= new_left+"px";\r
- popup.style.top= new_top+"px";\r
- popup.positionned=true;\r
- }\r
- popup.style.visibility="visible";\r
- \r
- //popup.style.display="block";\r
- };\r
-\r
- EditArea.prototype.close_inline_popup= function(popup_id){\r
- var popup= _$(popup_id); \r
- // search matching icon\r
- for(var i=0; i<this.inlinePopup.length; i++){\r
- if(this.inlinePopup[i]["popup_id"]==popup_id){\r
- var icon= _$(this.inlinePopup[i]["icon_id"]);\r
- if(icon){\r
- this.switchClassSticky(icon, 'editAreaButtonNormal', false); \r
- break;\r
- }\r
- }\r
- }\r
- \r
- popup.style.visibility="hidden"; \r
- };\r
- \r
- EditArea.prototype.close_all_inline_popup= function(e){\r
- for(var i=0; i<this.inlinePopup.length; i++){\r
- this.close_inline_popup(this.inlinePopup[i]["popup_id"]); \r
- }\r
- this.textarea.focus();\r
- };\r
- \r
- EditArea.prototype.show_help= function(){\r
- \r
- this.open_inline_popup("edit_area_help");\r
- \r
- };\r
- \r
- EditArea.prototype.new_document= function(){\r
- this.textarea.value="";\r
- this.area_select(0,0);\r
- };\r
- \r
- EditArea.prototype.get_all_toolbar_height= function(){\r
- var area= _$("editor");\r
- var results= parent.getChildren(area, "div", "class", "area_toolbar", "all", "0"); // search only direct children\r
- //results= results.concat(getChildren(area, "table", "class", "area_toolbar", "all", "0"));\r
- var height=0;\r
- for(var i=0; i<results.length; i++){ \r
- height+= results[i].offsetHeight;\r
- }\r
- //alert("toolbar height: "+height);\r
- return height;\r
- };\r
- \r
- EditArea.prototype.go_to_line= function(line){ \r
- if(!line)\r
- { \r
- var icon= _$("go_to_line");\r
- if(icon != null){\r
- this.restoreClass(icon);\r
- this.switchClassSticky(icon, 'editAreaButtonSelected', true);\r
- }\r
- \r
- line= prompt(this.get_translation("go_to_line_prompt"));\r
- if(icon != null)\r
- this.switchClassSticky(icon, 'editAreaButtonNormal', false);\r
- }\r
- if(line && line!=null && line.search(/^[0-9]+$/)!=-1){\r
- var start=0;\r
- var lines= this.textarea.value.split("\n");\r
- if(line > lines.length)\r
- start= this.textarea.value.length;\r
- else{\r
- for(var i=0; i<Math.min(line-1, lines.length); i++)\r
- start+= lines[i].length + 1;\r
- }\r
- this.area_select(start, 0);\r
- }\r
- \r
- \r
- };\r
- \r
- \r
- EditArea.prototype.change_smooth_selection_mode= function(setTo){\r
- //alert("setTo: "+setTo);\r
- if(this.do_highlight)\r
- return;\r
- \r
- if(setTo != null){\r
- if(setTo === false)\r
- this.smooth_selection=true;\r
- else\r
- this.smooth_selection=false;\r
- }\r
- var icon= _$("change_smooth_selection");\r
- this.textarea.focus();\r
- if(this.smooth_selection===true){\r
- //setAttribute(icon, "class", getAttribute(icon, "class").replace(/ selected/g, "") );\r
- /*setAttribute(icon, "oldClassName", "editAreaButtonNormal" );\r
- setAttribute(icon, "className", "editAreaButtonNormal" );*/\r
- //this.restoreClass(icon);\r
- //this.restoreAndSwitchClass(icon,'editAreaButtonNormal');\r
- this.switchClassSticky(icon, 'editAreaButtonNormal', false);\r
- \r
- this.smooth_selection=false;\r
- this.selection_field.style.display= "none";\r
- _$("cursor_pos").style.display= "none";\r
- _$("end_bracket").style.display= "none";\r
- }else{\r
- //setAttribute(icon, "class", getAttribute(icon, "class") + " selected");\r
- //this.switchClass(icon,'editAreaButtonSelected');\r
- this.switchClassSticky(icon, 'editAreaButtonSelected', false);\r
- this.smooth_selection=true;\r
- this.selection_field.style.display= "block";\r
- _$("cursor_pos").style.display= "block";\r
- _$("end_bracket").style.display= "block";\r
- } \r
- };\r
- \r
- // the auto scroll of the textarea has some lacks when it have to show cursor in the visible area when the textarea size change\r
- // show specifiy whereas it is the "top" or "bottom" of the selection that is showned\r
- EditArea.prototype.scroll_to_view= function(show){\r
- var zone, lineElem;\r
- if(!this.smooth_selection)\r
- return;\r
- zone= _$("result");\r
- \r
- // manage height scroll\r
- var cursor_pos_top= _$("cursor_pos").cursor_top;\r
- if(show=="bottom")\r
- {\r
- //cursor_pos_top+= (this.last_selection["line_nb"]-1)* this.lineHeight;\r
- cursor_pos_top+= this.getLinePosTop( this.last_selection['line_start'] + this.last_selection['line_nb'] - 1 );\r
- }\r
- \r
- var max_height_visible= zone.clientHeight + zone.scrollTop;\r
- var miss_top = cursor_pos_top + this.lineHeight - max_height_visible;\r
- if(miss_top>0){\r
- //alert(miss_top);\r
- zone.scrollTop= zone.scrollTop + miss_top;\r
- }else if( zone.scrollTop > cursor_pos_top){\r
- // when erase all the content -> does'nt scroll back to the top\r
- //alert("else: "+cursor_pos_top);\r
- zone.scrollTop= cursor_pos_top; \r
- }\r
- \r
- // manage left scroll\r
- //var cursor_pos_left= parseInt(_$("cursor_pos").style.left.replace("px",""));\r
- var cursor_pos_left= _$("cursor_pos").cursor_left;\r
- var max_width_visible= zone.clientWidth + zone.scrollLeft;\r
- var miss_left= cursor_pos_left + 10 - max_width_visible;\r
- if(miss_left>0){ \r
- zone.scrollLeft= zone.scrollLeft + miss_left + 50;\r
- }else if( zone.scrollLeft > cursor_pos_left){\r
- zone.scrollLeft= cursor_pos_left ;\r
- }else if( zone.scrollLeft == 45){\r
- // show the line numbers if textarea align to it's left\r
- zone.scrollLeft=0;\r
- }\r
- };\r
- \r
- EditArea.prototype.check_undo= function(only_once){\r
- if(!editAreas[this.id])\r
- return false;\r
- if(this.textareaFocused && editAreas[this.id]["displayed"]==true){\r
- var text=this.textarea.value;\r
- if(this.previous.length<=1)\r
- this.switchClassSticky(_$("undo"), 'editAreaButtonDisabled', true);\r
- \r
- if(!this.previous[this.previous.length-1] || this.previous[this.previous.length-1]["text"] != text){\r
- this.previous.push({"text": text, "selStart": this.textarea.selectionStart, "selEnd": this.textarea.selectionEnd});\r
- if(this.previous.length > this.settings["max_undo"]+1)\r
- this.previous.shift();\r
- \r
- }\r
- if(this.previous.length >= 2)\r
- this.switchClassSticky(_$("undo"), 'editAreaButtonNormal', false); \r
- }\r
-\r
- if(!only_once)\r
- setTimeout("editArea.check_undo()", 3000);\r
- };\r
- \r
- EditArea.prototype.undo= function(){\r
- //alert("undo"+this.previous.length);\r
- if(this.previous.length > 0)\r
- {\r
- this.getIESelection();\r
- // var pos_cursor=this.textarea.selectionStart;\r
- this.next.push( { "text": this.textarea.value, "selStart": this.textarea.selectionStart, "selEnd": this.textarea.selectionEnd } );\r
- var prev= this.previous.pop();\r
- if( prev["text"] == this.textarea.value && this.previous.length > 0 )\r
- prev =this.previous.pop(); \r
- this.textarea.value = prev["text"];\r
- this.last_undo = prev["text"];\r
- this.area_select(prev["selStart"], prev["selEnd"]-prev["selStart"]);\r
- this.switchClassSticky(_$("redo"), 'editAreaButtonNormal', false);\r
- this.resync_highlight(true);\r
- //alert("undo"+this.previous.length);\r
- this.check_file_changes();\r
- }\r
- };\r
- \r
- EditArea.prototype.redo= function(){\r
- if(this.next.length > 0)\r
- {\r
- /*this.getIESelection();*/\r
- //var pos_cursor=this.textarea.selectionStart;\r
- var next= this.next.pop();\r
- this.previous.push(next);\r
- this.textarea.value= next["text"];\r
- this.last_undo= next["text"];\r
- this.area_select(next["selStart"], next["selEnd"]-next["selStart"]);\r
- this.switchClassSticky(_$("undo"), 'editAreaButtonNormal', false);\r
- this.resync_highlight(true);\r
- this.check_file_changes();\r
- }\r
- if( this.next.length == 0)\r
- this.switchClassSticky(_$("redo"), 'editAreaButtonDisabled', true);\r
- };\r
- \r
- EditArea.prototype.check_redo= function(){\r
- if(editArea.next.length == 0 || editArea.textarea.value!=editArea.last_undo){\r
- editArea.next= []; // undo the ability to use "redo" button\r
- editArea.switchClassSticky(_$("redo"), 'editAreaButtonDisabled', true);\r
- }\r
- else\r
- {\r
- this.switchClassSticky(_$("redo"), 'editAreaButtonNormal', false);\r
- }\r
- };\r
- \r
- \r
- // functions that manage icons roll over, disabled, etc...\r
- EditArea.prototype.switchClass = function(element, class_name, lock_state) {\r
- var lockChanged = false;\r
- \r
- if (typeof(lock_state) != "undefined" && element != null) {\r
- element.classLock = lock_state;\r
- lockChanged = true;\r
- }\r
- \r
- if (element != null && (lockChanged || !element.classLock)) {\r
- element.oldClassName = element.className;\r
- element.className = class_name;\r
- }\r
- };\r
- \r
- EditArea.prototype.restoreAndSwitchClass = function(element, class_name) {\r
- if (element != null && !element.classLock) {\r
- this.restoreClass(element);\r
- this.switchClass(element, class_name);\r
- }\r
- };\r
- \r
- EditArea.prototype.restoreClass = function(element) {\r
- if (element != null && element.oldClassName && !element.classLock) {\r
- element.className = element.oldClassName;\r
- element.oldClassName = null;\r
- }\r
- };\r
- \r
- EditArea.prototype.setClassLock = function(element, lock_state) {\r
- if (element != null)\r
- element.classLock = lock_state;\r
- };\r
- \r
- EditArea.prototype.switchClassSticky = function(element, class_name, lock_state) {\r
- var lockChanged = false;\r
- if (typeof(lock_state) != "undefined" && element != null) {\r
- element.classLock = lock_state;\r
- lockChanged = true;\r
- }\r
- \r
- if (element != null && (lockChanged || !element.classLock)) {\r
- element.className = class_name;\r
- element.oldClassName = class_name;\r
- }\r
- };\r
- \r
- //make the "page up" and "page down" buttons works correctly\r
- EditArea.prototype.scroll_page= function(params){\r
- var dir= params["dir"], shift_pressed= params["shift"];\r
- var lines= this.textarea.value.split("\n"); \r
- var new_pos=0, length=0, char_left=0, line_nb=0, curLine=0;\r
- var toScrollAmount = _$("result").clientHeight -30;\r
- var nbLineToScroll = 0, diff= 0;\r
- \r
- if(dir=="up"){\r
- nbLineToScroll = Math.ceil( toScrollAmount / this.lineHeight );\r
- \r
- // fix number of line to scroll\r
- for( i = this.last_selection["line_start"]; i - diff > this.last_selection["line_start"] - nbLineToScroll ; i-- )\r
- {\r
- if( elem = _$('line_'+ i) )\r
- {\r
- diff += Math.floor( ( elem.offsetHeight - 1 ) / this.lineHeight );\r
- }\r
- }\r
- nbLineToScroll -= diff;\r
- \r
- if(this.last_selection["selec_direction"]=="up"){\r
- for(line_nb=0; line_nb< Math.min(this.last_selection["line_start"]-nbLineToScroll, lines.length); line_nb++){\r
- new_pos+= lines[line_nb].length + 1;\r
- }\r
- char_left=Math.min(lines[Math.min(lines.length-1, line_nb)].length, this.last_selection["curr_pos"]-1);\r
- if(shift_pressed)\r
- length=this.last_selection["selectionEnd"]-new_pos-char_left; \r
- this.area_select(new_pos+char_left, length);\r
- view="top";\r
- }else{ \r
- view="bottom";\r
- for(line_nb=0; line_nb< Math.min(this.last_selection["line_start"]+this.last_selection["line_nb"]-1-nbLineToScroll, lines.length); line_nb++){\r
- new_pos+= lines[line_nb].length + 1;\r
- }\r
- char_left=Math.min(lines[Math.min(lines.length-1, line_nb)].length, this.last_selection["curr_pos"]-1);\r
- if(shift_pressed){\r
- //length=this.last_selection["selectionEnd"]-new_pos-char_left; \r
- start= Math.min(this.last_selection["selectionStart"], new_pos+char_left);\r
- length= Math.max(new_pos+char_left, this.last_selection["selectionStart"] )- start ;\r
- if(new_pos+char_left < this.last_selection["selectionStart"])\r
- view="top";\r
- }else\r
- start=new_pos+char_left;\r
- this.area_select(start, length);\r
- \r
- }\r
- }\r
- else\r
- {\r
- var nbLineToScroll= Math.floor( toScrollAmount / this.lineHeight );\r
- // fix number of line to scroll\r
- for( i = this.last_selection["line_start"]; i + diff < this.last_selection["line_start"] + nbLineToScroll ; i++ )\r
- {\r
- if( elem = _$('line_'+ i) )\r
- {\r
- diff += Math.floor( ( elem.offsetHeight - 1 ) / this.lineHeight );\r
- }\r
- }\r
- nbLineToScroll -= diff;\r
- \r
- if(this.last_selection["selec_direction"]=="down"){\r
- view="bottom";\r
- for(line_nb=0; line_nb< Math.min(this.last_selection["line_start"]+this.last_selection["line_nb"]-2+nbLineToScroll, lines.length); line_nb++){\r
- if(line_nb==this.last_selection["line_start"]-1)\r
- char_left= this.last_selection["selectionStart"] -new_pos;\r
- new_pos+= lines[line_nb].length + 1;\r
- \r
- }\r
- if(shift_pressed){\r
- length=Math.abs(this.last_selection["selectionStart"]-new_pos); \r
- length+=Math.min(lines[Math.min(lines.length-1, line_nb)].length, this.last_selection["curr_pos"]);\r
- //length+=Math.min(lines[Math.min(lines.length-1, line_nb)].length, char_left);\r
- this.area_select(Math.min(this.last_selection["selectionStart"], new_pos), length);\r
- }else{\r
- this.area_select(new_pos+char_left, 0);\r
- }\r
- \r
- }else{\r
- view="top";\r
- for(line_nb=0; line_nb< Math.min(this.last_selection["line_start"]+nbLineToScroll-1, lines.length, lines.length); line_nb++){\r
- if(line_nb==this.last_selection["line_start"]-1)\r
- char_left= this.last_selection["selectionStart"] -new_pos;\r
- new_pos+= lines[line_nb].length + 1; \r
- }\r
- if(shift_pressed){\r
- length=Math.abs(this.last_selection["selectionEnd"]-new_pos-char_left); \r
- length+=Math.min(lines[Math.min(lines.length-1, line_nb)].length, this.last_selection["curr_pos"])- char_left-1;\r
- //length+=Math.min(lines[Math.min(lines.length-1, line_nb)].length, char_left);\r
- this.area_select(Math.min(this.last_selection["selectionEnd"], new_pos+char_left), length);\r
- if(new_pos+char_left > this.last_selection["selectionEnd"])\r
- view="bottom";\r
- }else{\r
- this.area_select(new_pos+char_left, 0);\r
- }\r
- \r
- }\r
- }\r
- //console.log( new_pos, char_left, length, nbLineToScroll, toScrollAmount, _$("result").clientHeigh );\r
- this.check_line_selection();\r
- this.scroll_to_view(view);\r
- };\r
- \r
- EditArea.prototype.start_resize= function(e){\r
- parent.editAreaLoader.resize["id"] = editArea.id; \r
- parent.editAreaLoader.resize["start_x"] = (e)? e.pageX : event.x + document.body.scrollLeft; \r
- parent.editAreaLoader.resize["start_y"] = (e)? e.pageY : event.y + document.body.scrollTop;\r
- if(editArea.isIE)\r
- {\r
- editArea.textarea.focus();\r
- editArea.getIESelection();\r
- }\r
- parent.editAreaLoader.resize["selectionStart"] = editArea.textarea.selectionStart;\r
- parent.editAreaLoader.resize["selectionEnd"] = editArea.textarea.selectionEnd;\r
- parent.editAreaLoader.start_resize_area();\r
- };\r
- \r
- EditArea.prototype.toggle_full_screen= function(to){\r
- var t=this, p=parent, a=t.textarea, html, frame, selStart, selEnd, old, icon;\r
- if(typeof(to)=="undefined")\r
- to= !t.fullscreen['isFull'];\r
- old = t.fullscreen['isFull'];\r
- t.fullscreen['isFull']= to;\r
- icon = _$("fullscreen");\r
- selStart = t.textarea.selectionStart;\r
- selEnd = t.textarea.selectionEnd;\r
- html = p.document.getElementsByTagName("html")[0];\r
- frame = p.document.getElementById("frame_"+t.id);\r
- \r
- if(to && to!=old)\r
- { // toogle on fullscreen \r
- \r
- t.fullscreen['old_overflow'] = p.get_css_property(html, "overflow");\r
- t.fullscreen['old_height'] = p.get_css_property(html, "height");\r
- t.fullscreen['old_width'] = p.get_css_property(html, "width");\r
- t.fullscreen['old_scrollTop'] = html.scrollTop;\r
- t.fullscreen['old_scrollLeft'] = html.scrollLeft;\r
- t.fullscreen['old_zIndex'] = p.get_css_property(frame, "z-index");\r
- if(t.isOpera){\r
- html.style.height = "100%";\r
- html.style.width = "100%"; \r
- }\r
- html.style.overflow = "hidden";\r
- html.scrollTop = 0;\r
- html.scrollLeft = 0;\r
- \r
- frame.style.position = "absolute";\r
- frame.style.width = html.clientWidth+"px";\r
- frame.style.height = html.clientHeight+"px";\r
- frame.style.display = "block";\r
- frame.style.zIndex = "999999";\r
- frame.style.top = "0px";\r
- frame.style.left = "0px";\r
- \r
- // if the iframe was in a div with position absolute, the top and left are the one of the div, \r
- // so I fix it by seeing at witch position the iframe start and correcting it\r
- frame.style.top = "-"+p.calculeOffsetTop(frame)+"px";\r
- frame.style.left = "-"+p.calculeOffsetLeft(frame)+"px";\r
- \r
- // parent.editAreaLoader.execCommand(t.id, "update_size();");\r
- // var body=parent.document.getElementsByTagName("body")[0];\r
- // body.appendChild(frame);\r
- \r
- t.switchClassSticky(icon, 'editAreaButtonSelected', false);\r
- t.fullscreen['allow_resize']= t.resize_allowed;\r
- t.allow_resize(false);\r
- \r
- //t.area_select(selStart, selEnd-selStart);\r
- \r
- \r
- // opera can't manage to do a direct size update\r
- if(t.isFirefox){\r
- p.editAreaLoader.execCommand(t.id, "update_size();");\r
- t.area_select(selStart, selEnd-selStart);\r
- t.scroll_to_view();\r
- t.focus();\r
- }else{\r
- setTimeout("p.editAreaLoader.execCommand('"+ t.id +"', 'update_size();');editArea.focus();", 10);\r
- } \r
- \r
- \r
- }\r
- else if(to!=old)\r
- { // toogle off fullscreen\r
- frame.style.position="static";\r
- frame.style.zIndex= t.fullscreen['old_zIndex'];\r
- \r
- if(t.isOpera)\r
- {\r
- html.style.height = "auto"; \r
- html.style.width = "auto";\r
- html.style.overflow = "auto";\r
- }\r
- else if(t.isIE && p!=top)\r
- { // IE doesn't manage html overflow in frames like in normal page... \r
- html.style.overflow = "auto";\r
- }\r
- else\r
- {\r
- html.style.overflow = t.fullscreen['old_overflow'];\r
- }\r
- html.scrollTop = t.fullscreen['old_scrollTop'];\r
- html.scrollLeft = t.fullscreen['old_scrollLeft'];\r
- \r
- p.editAreaLoader.hide(t.id);\r
- p.editAreaLoader.show(t.id);\r
- \r
- t.switchClassSticky(icon, 'editAreaButtonNormal', false);\r
- if(t.fullscreen['allow_resize'])\r
- t.allow_resize(t.fullscreen['allow_resize']);\r
- if(t.isFirefox){\r
- t.area_select(selStart, selEnd-selStart);\r
- setTimeout("editArea.scroll_to_view();", 10);\r
- } \r
- \r
- //p.editAreaLoader.remove_event(p.window, "resize", editArea.update_size);\r
- }\r
- \r
- };\r
- \r
- EditArea.prototype.allow_resize= function(allow){\r
- var resize= _$("resize_area");\r
- if(allow){\r
- \r
- resize.style.visibility="visible";\r
- parent.editAreaLoader.add_event(resize, "mouseup", editArea.start_resize);\r
- }else{\r
- resize.style.visibility="hidden";\r
- parent.editAreaLoader.remove_event(resize, "mouseup", editArea.start_resize);\r
- }\r
- this.resize_allowed= allow;\r
- };\r
- \r
- \r
- EditArea.prototype.change_syntax= function(new_syntax, is_waiting){\r
- // alert("cahnge to "+new_syntax);\r
- // the syntax is the same\r
- if(new_syntax==this.settings['syntax'])\r
- return true;\r
- \r
- // check that the syntax is one allowed\r
- var founded= false;\r
- for(var i=0; i<this.syntax_list.length; i++)\r
- {\r
- if(this.syntax_list[i]==new_syntax)\r
- founded= true;\r
- }\r
- \r
- if(founded==true)\r
- {\r
- // the reg syntax file is not loaded\r
- if(!parent.editAreaLoader.load_syntax[new_syntax])\r
- {\r
- // load the syntax file and wait for file loading\r
- if(!is_waiting)\r
- parent.editAreaLoader.load_script(parent.editAreaLoader.baseURL + "reg_syntax/" + new_syntax + ".js");\r
- setTimeout("editArea.change_syntax('"+ new_syntax +"', true);", 100);\r
- this.show_waiting_screen();\r
- }\r
- else\r
- {\r
- if(!this.allready_used_syntax[new_syntax])\r
- { // the syntax has still not been used\r
- // rebuild syntax definition for new languages\r
- parent.editAreaLoader.init_syntax_regexp();\r
- // add style to the new list\r
- this.add_style(parent.editAreaLoader.syntax[new_syntax]["styles"]);\r
- this.allready_used_syntax[new_syntax]=true;\r
- }\r
- // be sure that the select option is correctly updated\r
- var sel= _$("syntax_selection");\r
- if(sel && sel.value!=new_syntax)\r
- {\r
- for(var i=0; i<sel.length; i++){\r
- if(sel.options[i].value && sel.options[i].value == new_syntax)\r
- sel.options[i].selected=true;\r
- }\r
- }\r
- \r
- /* if(this.settings['syntax'].length==0)\r
- {\r
- this.switchClassSticky(_$("highlight"), 'editAreaButtonNormal', false);\r
- this.switchClassSticky(_$("reset_highlight"), 'editAreaButtonNormal', false);\r
- this.change_highlight(true);\r
- }\r
- */\r
- this.settings['syntax']= new_syntax;\r
- this.resync_highlight(true);\r
- this.hide_waiting_screen();\r
- return true;\r
- }\r
- }\r
- return false;\r
- };\r
- \r
- \r
- // check if the file has changed\r
- EditArea.prototype.set_editable= function(is_editable){\r
- if(is_editable)\r
- {\r
- document.body.className= "";\r
- this.textarea.readOnly= false;\r
- this.is_editable= true;\r
- }\r
- else\r
- {\r
- document.body.className= "non_editable";\r
- this.textarea.readOnly= true;\r
- this.is_editable= false;\r
- }\r
- \r
- if(editAreas[this.id]["displayed"]==true)\r
- this.update_size();\r
- };\r
- \r
- /***** Wrap mode *****/\r
- \r
- // toggling function for set_wrap_mode\r
- EditArea.prototype.toggle_word_wrap= function(){\r
- this.set_word_wrap( !this.settings['word_wrap'] );\r
- };\r
- \r
- \r
- // open a new tab for the given file\r
- EditArea.prototype.set_word_wrap= function(to){\r
- var t=this, a= t.textarea;\r
- \r
- if( t.isOpera )\r
- {\r
- this.settings['word_wrap']= false;\r
- t.switchClassSticky( _$("word_wrap"), 'editAreaButtonDisabled', true );\r
- return false;\r
- }\r
- \r
- if( to )\r
- {\r
- wrap_mode = 'soft';\r
- this.container.className+= ' word_wrap';\r
- this.container.style.width="";\r
- this.content_highlight.style.width="";\r
- a.style.width="100%";\r
- if( t.isIE && t.isIE < 7 ) // IE 6 count 50 px too much\r
- {\r
- a.style.width = ( a.offsetWidth-5 )+"px";\r
- }\r
- \r
- t.switchClassSticky( _$("word_wrap"), 'editAreaButtonSelected', false );\r
- }\r
- else\r
- {\r
- wrap_mode = 'off';\r
- this.container.className = this.container.className.replace(/word_wrap/g, '');\r
- t.switchClassSticky( _$("word_wrap"), 'editAreaButtonNormal', true );\r
- }\r
- this.textarea.previous_scrollWidth = '';\r
- this.textarea.previous_scrollHeight = '';\r
- \r
- a.wrap= wrap_mode;\r
- a.setAttribute('wrap', wrap_mode);\r
- // only IE can change wrap mode on the fly without element reloading\r
- if(!this.isIE)\r
- {\r
- var start=a.selectionStart, end= a.selectionEnd;\r
- var parNod = a.parentNode, nxtSib = a.nextSibling;\r
- parNod.removeChild(a);\r
- parNod.insertBefore(a, nxtSib);\r
- this.area_select(start, end-start);\r
- }\r
- // reset some optimisation\r
- this.settings['word_wrap'] = to;\r
- this.focus();\r
- this.update_size();\r
- this.check_line_selection();\r
- }; \r
- /***** tabbed files managing functions *****/\r
- \r
- // open a new tab for the given file\r
- EditArea.prototype.open_file= function(settings){\r
- \r
- if(settings['id']!="undefined")\r
- {\r
- var id= settings['id'];\r
- // create a new file object with defautl values\r
- var new_file= {};\r
- new_file['id'] = id;\r
- new_file['title'] = id;\r
- new_file['text'] = "";\r
- new_file['last_selection'] = ""; \r
- new_file['last_text_to_highlight'] = "";\r
- new_file['last_hightlighted_text'] = "";\r
- new_file['previous'] = [];\r
- new_file['next'] = [];\r
- new_file['last_undo'] = "";\r
- new_file['smooth_selection'] = this.settings['smooth_selection'];\r
- new_file['do_highlight']= this.settings['start_highlight'];\r
- new_file['syntax'] = this.settings['syntax'];\r
- new_file['scroll_top'] = 0;\r
- new_file['scroll_left'] = 0;\r
- new_file['selection_start']= 0;\r
- new_file['selection_end']= 0;\r
- new_file['edited'] = false;\r
- new_file['font_size'] = this.settings["font_size"];\r
- new_file['font_family'] = this.settings["font_family"];\r
- new_file['word_wrap'] = this.settings["word_wrap"];\r
- new_file['toolbar'] = {'links':{}, 'selects': {}};\r
- new_file['compare_edited_text']= new_file['text'];\r
- \r
- \r
- this.files[id]= new_file;\r
- this.update_file(id, settings);\r
- this.files[id]['compare_edited_text']= this.files[id]['text'];\r
- \r
- \r
- var html_id= 'tab_file_'+encodeURIComponent(id);\r
- this.filesIdAssoc[html_id]= id;\r
- this.files[id]['html_id']= html_id;\r
- \r
- if(!_$(this.files[id]['html_id']) && id!="")\r
- {\r
- // be sure the tab browsing area is displayed\r
- this.tab_browsing_area.style.display= "block";\r
- var elem= document.createElement('li');\r
- elem.id= this.files[id]['html_id'];\r
- 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'\" />";\r
- 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>";\r
- _$('tab_browsing_list').appendChild(elem);\r
- var elem= document.createElement('text');\r
- this.update_size();\r
- }\r
- \r
- // open file callback (for plugin)\r
- if(id!="")\r
- this.execCommand('file_open', this.files[id]);\r
- \r
- this.switch_to_file(id, true);\r
- return true;\r
- }\r
- else\r
- return false;\r
- };\r
- \r
- // close the given file\r
- EditArea.prototype.close_file= function(id){\r
- if(this.files[id])\r
- {\r
- this.save_file(id);\r
- \r
- // close file callback\r
- if(this.execCommand('file_close', this.files[id])!==false)\r
- {\r
- // remove the tab in the toolbar\r
- var li= _$(this.files[id]['html_id']);\r
- li.parentNode.removeChild(li);\r
- // select a new file\r
- if(id== this.curr_file)\r
- {\r
- var next_file= "";\r
- var is_next= false;\r
- for(var i in this.files)\r
- {\r
- if( is_next )\r
- {\r
- next_file = i;\r
- break;\r
- }\r
- else if( i == id )\r
- is_next = true;\r
- else\r
- next_file = i;\r
- }\r
- // display the next file\r
- this.switch_to_file(next_file);\r
- }\r
- // clear datas\r
- delete (this.files[id]);\r
- this.update_size();\r
- } \r
- }\r
- };\r
- \r
- // backup current file datas\r
- EditArea.prototype.save_file= function(id){\r
- var t= this, save, a_links, a_selects, save_butt, img, i;\r
- if(t.files[id])\r
- {\r
- var save= t.files[id];\r
- save['last_selection'] = t.last_selection; \r
- save['last_text_to_highlight'] = t.last_text_to_highlight;\r
- save['last_hightlighted_text'] = t.last_hightlighted_text;\r
- save['previous'] = t.previous;\r
- save['next'] = t.next;\r
- save['last_undo'] = t.last_undo;\r
- save['smooth_selection'] = t.smooth_selection;\r
- save['do_highlight'] = t.do_highlight;\r
- save['syntax'] = t.settings['syntax'];\r
- save['text'] = t.textarea.value;\r
- save['scroll_top'] = t.result.scrollTop;\r
- save['scroll_left'] = t.result.scrollLeft;\r
- save['selection_start'] = t.last_selection["selectionStart"];\r
- save['selection_end'] = t.last_selection["selectionEnd"];\r
- save['font_size'] = t.settings["font_size"];\r
- save['font_family'] = t.settings["font_family"];\r
- save['word_wrap'] = t.settings["word_wrap"];\r
- save['toolbar'] = {'links':{}, 'selects': {}};\r
- \r
- // save toolbar buttons state for fileSpecific buttons\r
- a_links= _$("toolbar_1").getElementsByTagName("a");\r
- for( i=0; i<a_links.length; i++ )\r
- {\r
- if( a_links[i].getAttribute('fileSpecific') == 'yes' )\r
- {\r
- save_butt = {};\r
- img = a_links[i].getElementsByTagName('img')[0];\r
- save_butt['classLock'] = img.classLock;\r
- save_butt['className'] = img.className;\r
- save_butt['oldClassName'] = img.oldClassName;\r
- \r
- save['toolbar']['links'][a_links[i].id]= save_butt;\r
- }\r
- }\r
- \r
- // save toolbar select state for fileSpecific buttons\r
- a_selects= _$("toolbar_1").getElementsByTagName("select");\r
- for( i=0; i<a_selects.length; i++)\r
- {\r
- if(a_selects[i].getAttribute('fileSpecific')=='yes')\r
- {\r
- save['toolbar']['selects'][a_selects[i].id]= a_selects[i].value;\r
- }\r
- }\r
- \r
- t.files[id]= save;\r
- \r
- return save;\r
- }\r
- \r
- return false;\r
- };\r
- \r
- // update file_datas\r
- EditArea.prototype.update_file= function(id, new_values){\r
- for(var i in new_values)\r
- {\r
- this.files[id][i]= new_values[i];\r
- }\r
- };\r
- \r
- // display file datas\r
- EditArea.prototype.display_file= function(id){\r
- var t = this, a= t.textarea, new_file, a_lis, a_selects, a_links, a_options, i, j;\r
- \r
- // we're showing the empty file\r
- if(id=='')\r
- {\r
- a.readOnly= true;\r
- t.tab_browsing_area.style.display= "none";\r
- _$("no_file_selected").style.display= "block";\r
- t.result.className= "empty";\r
- // clear current datas\r
- if(!t.files[''])\r
- {\r
- t.open_file({id: ''});\r
- }\r
- }\r
- // we try to show a non existent file, so we left\r
- else if( typeof( t.files[id] ) == 'undefined' )\r
- {\r
- return false;\r
- }\r
- // display a normal file\r
- else\r
- {\r
- t.result.className= "";\r
- a.readOnly= !t.is_editable;\r
- _$("no_file_selected").style.display= "none";\r
- t.tab_browsing_area.style.display= "block";\r
- }\r
- \r
- // ensure to have last state for undo/redo actions\r
- t.check_redo(true);\r
- t.check_undo(true);\r
- t.curr_file= id;\r
- \r
- // replace selected tab file\r
- a_lis= t.tab_browsing_area.getElementsByTagName('li');\r
- for( i=0; i<a_lis.length; i++)\r
- {\r
- if(a_lis[i].id == t.files[id]['html_id'])\r
- a_lis[i].className='selected';\r
- else\r
- a_lis[i].className='';\r
- }\r
- \r
- // replace next files datas\r
- new_file= t.files[id];\r
- \r
- // restore text content\r
- a.value= new_file['text'];\r
- \r
- // restore font-size\r
- t.set_font(new_file['font_family'], new_file['font_size']);\r
- \r
- // restore selection and scroll\r
- t.area_select(new_file['last_selection']['selection_start'], new_file['last_selection']['selection_end'] - new_file['last_selection']['selection_start']);\r
- t.manage_size(true);\r
- t.result.scrollTop= new_file['scroll_top'];\r
- t.result.scrollLeft= new_file['scroll_left'];\r
- \r
- // restore undo, redo\r
- t.previous= new_file['previous'];\r
- t.next= new_file['next'];\r
- t.last_undo= new_file['last_undo'];\r
- t.check_redo(true);\r
- t.check_undo(true);\r
- \r
- // restore highlight\r
- t.execCommand("change_highlight", new_file['do_highlight']);\r
- t.execCommand("change_syntax", new_file['syntax']);\r
- \r
- // smooth mode\r
- t.execCommand("change_smooth_selection_mode", new_file['smooth_selection']);\r
- \r
- // word_wrap\r
- t.execCommand("set_word_wrap", new_file['word_wrap']);\r
- \r
- // restore links state in toolbar\r
- a_links= new_file['toolbar']['links'];\r
- for( i in a_links)\r
- {\r
- if( img = _$(i).getElementsByTagName('img')[0] )\r
- {\r
- img.classLock = a_links[i]['classLock'];\r
- img.className = a_links[i]['className'];\r
- img.oldClassName= a_links[i]['oldClassName'];\r
- }\r
- }\r
- \r
- // restore select state in toolbar\r
- a_selects = new_file['toolbar']['selects'];\r
- for( i in a_selects)\r
- {\r
- a_options = _$(i).options;\r
- for( j=0; j<a_options.length; j++)\r
- {\r
- if( a_options[j].value == a_selects[i] )\r
- _$(i).options[j].selected=true;\r
- }\r
- }\r
- \r
- };\r
-\r
- // change tab for displaying a new one\r
- EditArea.prototype.switch_to_file= function(file_to_show, force_refresh){\r
- if(file_to_show!=this.curr_file || force_refresh)\r
- {\r
- this.save_file(this.curr_file);\r
- if(this.curr_file!='')\r
- this.execCommand('file_switch_off', this.files[this.curr_file]);\r
- this.display_file(file_to_show);\r
- if(file_to_show!='')\r
- this.execCommand('file_switch_on', this.files[file_to_show]);\r
- }\r
- };\r
-\r
- // get all infos for the given file\r
- EditArea.prototype.get_file= function(id){\r
- if(id==this.curr_file)\r
- this.save_file(id);\r
- return this.files[id];\r
- };\r
- \r
- // get all available files infos\r
- EditArea.prototype.get_all_files= function(){\r
- tmp_files= this.files;\r
- this.save_file(this.curr_file);\r
- if(tmp_files[''])\r
- delete(this.files['']);\r
- return tmp_files;\r
- };\r
- \r
- \r
- // check if the file has changed\r
- EditArea.prototype.check_file_changes= function(){\r
- \r
- var id= this.curr_file;\r
- if(this.files[id] && this.files[id]['compare_edited_text']!=undefined)\r
- {\r
- if(this.files[id]['compare_edited_text'].length==this.textarea.value.length && this.files[id]['compare_edited_text']==this.textarea.value)\r
- {\r
- if(this.files[id]['edited']!= false)\r
- this.set_file_edited_mode(id, false);\r
- }\r
- else\r
- {\r
- if(this.files[id]['edited']!= true)\r
- this.set_file_edited_mode(id, true);\r
- }\r
- }\r
- };\r
- \r
- // set if the file is edited or not\r
- EditArea.prototype.set_file_edited_mode= function(id, to){\r
- // change CSS for edited tab\r
- if(this.files[id] && _$(this.files[id]['html_id']))\r
- {\r
- var link= _$(this.files[id]['html_id']).getElementsByTagName('a')[0];\r
- if(to==true)\r
- {\r
- link.className= 'edited';\r
- }\r
- else\r
- {\r
- link.className= '';\r
- if(id==this.curr_file)\r
- text= this.textarea.value;\r
- else\r
- text= this.files[id]['text'];\r
- this.files[id]['compare_edited_text']= text;\r
- }\r
- \r
- this.files[id]['edited']= to;\r
- }\r
- };\r
-\r
- EditArea.prototype.set_show_line_colors = function(new_value){\r
- this.show_line_colors = new_value;\r
- \r
- if( new_value )\r
- this.selection_field.className += ' show_colors';\r
- else\r
- this.selection_field.className = this.selection_field.className.replace( / show_colors/g, '' );\r
- };
\ No newline at end of file