+++ /dev/null
-/****\r
- * This page contains some general usefull functions for javascript\r
- *\r
- ****/ \r
- \r
- \r
- // need to redefine this functiondue to IE problem\r
- function getAttribute( elm, aName ) {\r
- var aValue,taName,i;\r
- try{\r
- aValue = elm.getAttribute( aName );\r
- }catch(exept){}\r
- \r
- if( ! aValue ){\r
- for( i = 0; i < elm.attributes.length; i ++ ) {\r
- taName = elm.attributes[i] .name.toLowerCase();\r
- if( taName == aName ) {\r
- aValue = elm.attributes[i] .value;\r
- return aValue;\r
- }\r
- }\r
- }\r
- return aValue;\r
- };\r
- \r
- // need to redefine this function due to IE problem\r
- function setAttribute( elm, attr, val ) {\r
- if(attr=="class"){\r
- elm.setAttribute("className", val);\r
- elm.setAttribute("class", val);\r
- }else{\r
- elm.setAttribute(attr, val);\r
- }\r
- };\r
- \r
- /* return a child element\r
- elem: element we are searching in\r
- elem_type: type of the eleemnt we are searching (DIV, A, etc...)\r
- elem_attribute: attribute of the searched element that must match\r
- elem_attribute_match: value that elem_attribute must match\r
- option: "all" if must return an array of all children, otherwise return the first match element\r
- depth: depth of search (-1 or no set => unlimited)\r
- */\r
- function getChildren(elem, elem_type, elem_attribute, elem_attribute_match, option, depth)\r
- { \r
- if(!option)\r
- var option="single";\r
- if(!depth)\r
- var depth=-1;\r
- if(elem){\r
- var children= elem.childNodes;\r
- var result=null;\r
- var results= [];\r
- for (var x=0;x<children.length;x++) {\r
- strTagName = new String(children[x].tagName);\r
- children_class="?";\r
- if(strTagName!= "undefined"){\r
- child_attribute= getAttribute(children[x],elem_attribute);\r
- if((strTagName.toLowerCase()==elem_type.toLowerCase() || elem_type=="") && (elem_attribute=="" || child_attribute==elem_attribute_match)){\r
- if(option=="all"){\r
- results.push(children[x]);\r
- }else{\r
- return children[x];\r
- }\r
- }\r
- if(depth!=0){\r
- result=getChildren(children[x], elem_type, elem_attribute, elem_attribute_match, option, depth-1);\r
- if(option=="all"){\r
- if(result.length>0){\r
- results= results.concat(result);\r
- }\r
- }else if(result!=null){ \r
- return result;\r
- }\r
- }\r
- }\r
- }\r
- if(option=="all")\r
- return results;\r
- }\r
- return null;\r
- }; \r
- \r
- function isChildOf(elem, parent){\r
- if(elem){\r
- if(elem==parent)\r
- return true;\r
- while(elem.parentNode != 'undefined'){\r
- return isChildOf(elem.parentNode, parent);\r
- }\r
- }\r
- return false;\r
- };\r
- \r
- function getMouseX(e){\r
-\r
- if(e!=null && typeof(e.pageX)!="undefined"){\r
- return e.pageX;\r
- }else{\r
- return (e!=null?e.x:event.x)+ document.documentElement.scrollLeft;\r
- }\r
- };\r
- \r
- function getMouseY(e){\r
- if(e!=null && typeof(e.pageY)!="undefined"){\r
- return e.pageY;\r
- }else{\r
- return (e!=null?e.y:event.y)+ document.documentElement.scrollTop;\r
- }\r
- };\r
- \r
- function calculeOffsetLeft(r){\r
- return calculeOffset(r,"offsetLeft")\r
- };\r
- \r
- function calculeOffsetTop(r){\r
- return calculeOffset(r,"offsetTop")\r
- };\r
- \r
- function calculeOffset(element,attr){\r
- var offset=0;\r
- while(element){\r
- offset+=element[attr];\r
- element=element.offsetParent\r
- }\r
- return offset;\r
- };\r
- \r
- /** return the computed style\r
- * @param: elem: the reference to the element\r
- * @param: prop: the name of the css property \r
- */\r
- function get_css_property(elem, prop)\r
- {\r
- if(document.defaultView)\r
- {\r
- return document.defaultView.getComputedStyle(elem, null).getPropertyValue(prop);\r
- }\r
- else if(elem.currentStyle)\r
- {\r
- var prop = prop.replace(/-\D/gi, function(sMatch)\r
- {\r
- return sMatch.charAt(sMatch.length - 1).toUpperCase();\r
- });\r
- return elem.currentStyle[prop];\r
- }\r
- else return null;\r
- }\r
- \r
-/****\r
- * Moving an element \r
- ***/ \r
- \r
- var _mCE; // currently moving element\r
- \r
- /* allow to move an element in a window\r
- e: the event\r
- id: the id of the element\r
- frame: the frame of the element \r
- ex of use:\r
- in html: <img id='move_area_search_replace' onmousedown='return parent.start_move_element(event,"area_search_replace", parent.frames["this_frame_id"]);' .../> \r
- or\r
- in javascript: document.getElementById("my_div").onmousedown= start_move_element\r
- */\r
- function start_move_element(e, id, frame){\r
- var elem_id=(e.target || e.srcElement).id;\r
- if(id)\r
- elem_id=id; \r
- if(!frame)\r
- frame=window;\r
- if(frame.event)\r
- e=frame.event;\r
- \r
- _mCE= frame.document.getElementById(elem_id);\r
- _mCE.frame=frame;\r
- frame.document.onmousemove= move_element;\r
- frame.document.onmouseup= end_move_element;\r
- /*_mCE.onmousemove= move_element;\r
- _mCE.onmouseup= end_move_element;*/\r
- \r
- //alert(_mCE.frame.document.body.offsetHeight);\r
- \r
- mouse_x= getMouseX(e);\r
- mouse_y= getMouseY(e);\r
- //window.status=frame+ " elem: "+elem_id+" elem: "+ _mCE + " mouse_x: "+mouse_x;\r
- _mCE.start_pos_x = mouse_x - (_mCE.style.left.replace("px","") || calculeOffsetLeft(_mCE));\r
- _mCE.start_pos_y = mouse_y - (_mCE.style.top.replace("px","") || calculeOffsetTop(_mCE));\r
- return false;\r
- };\r
- \r
- function end_move_element(e){\r
- _mCE.frame.document.onmousemove= "";\r
- _mCE.frame.document.onmouseup= ""; \r
- _mCE=null;\r
- };\r
- \r
- function move_element(e){\r
- var newTop,newLeft,maxLeft;\r
-\r
- if( _mCE.frame && _mCE.frame.event )\r
- e=_mCE.frame.event;\r
- newTop = getMouseY(e) - _mCE.start_pos_y;\r
- newLeft = getMouseX(e) - _mCE.start_pos_x;\r
- \r
- maxLeft = _mCE.frame.document.body.offsetWidth- _mCE.offsetWidth;\r
- max_top = _mCE.frame.document.body.offsetHeight- _mCE.offsetHeight;\r
- newTop = Math.min(Math.max(0, newTop), max_top);\r
- newLeft = Math.min(Math.max(0, newLeft), maxLeft);\r
- \r
- _mCE.style.top = newTop+"px";\r
- _mCE.style.left = newLeft+"px"; \r
- return false;\r
- };\r
- \r
-/***\r
- * Managing a textarea (this part need the navigator infos from editAreaLoader\r
- ***/ \r
- \r
- var nav= editAreaLoader.nav;\r
- \r
- // allow to get infos on the selection: array(start, end)\r
- function getSelectionRange(textarea){\r
- return {"start": textarea.selectionStart, "end": textarea.selectionEnd};\r
- };\r
- \r
- // allow to set the selection\r
- function setSelectionRange(t, start, end){\r
- t.focus();\r
- \r
- start = Math.max(0, Math.min(t.value.length, start));\r
- end = Math.max(start, Math.min(t.value.length, end));\r
- \r
- if( this.isOpera && this.isOpera < 9.6 ){ // Opera bug when moving selection start and selection end\r
- t.selectionEnd = 1; \r
- t.selectionStart = 0; \r
- t.selectionEnd = 1; \r
- t.selectionStart = 0; \r
- }\r
- t.selectionStart = start;\r
- t.selectionEnd = end; \r
- //textarea.setSelectionRange(start, end);\r
- \r
- if(isIE)\r
- set_IE_selection(t);\r
- };\r
-\r
- \r
- // set IE position in Firefox mode (textarea.selectionStart and textarea.selectionEnd). should work as a repeated task\r
- function get_IE_selection(t){\r
- var d=document,div,range,stored_range,elem,scrollTop,relative_top,line_start,line_nb,range_start,range_end,tab;\r
- if(t && t.focused)\r
- { \r
- if(!t.ea_line_height)\r
- { // calculate the lineHeight\r
- div= d.createElement("div");\r
- div.style.fontFamily= get_css_property(t, "font-family");\r
- div.style.fontSize= get_css_property(t, "font-size");\r
- div.style.visibility= "hidden"; \r
- div.innerHTML="0";\r
- d.body.appendChild(div);\r
- t.ea_line_height= div.offsetHeight;\r
- d.body.removeChild(div);\r
- }\r
- //t.focus();\r
- range = d.selection.createRange();\r
- try\r
- {\r
- stored_range = range.duplicate();\r
- stored_range.moveToElementText( t );\r
- stored_range.setEndPoint( 'EndToEnd', range );\r
- if(stored_range.parentElement() == t){\r
- // the range don't take care of empty lines in the end of the selection\r
- elem = t;\r
- scrollTop = 0;\r
- while(elem.parentNode){\r
- scrollTop+= elem.scrollTop;\r
- elem = elem.parentNode;\r
- }\r
- \r
- // var scrollTop= t.scrollTop + document.body.scrollTop;\r
- \r
- // var relative_top= range.offsetTop - calculeOffsetTop(t) + scrollTop;\r
- relative_top= range.offsetTop - calculeOffsetTop(t)+ scrollTop;\r
- // alert("rangeoffset: "+ range.offsetTop +"\ncalcoffsetTop: "+ calculeOffsetTop(t) +"\nrelativeTop: "+ relative_top);\r
- line_start = Math.round((relative_top / t.ea_line_height) +1);\r
- \r
- line_nb = Math.round(range.boundingHeight / t.ea_line_height);\r
- \r
- range_start = stored_range.text.length - range.text.length;\r
- tab = t.value.substr(0, range_start).split("\n"); \r
- range_start += (line_start - tab.length)*2; // add missing empty lines to the selection\r
- t.selectionStart = range_start;\r
- \r
- range_end = t.selectionStart + range.text.length;\r
- tab = t.value.substr(0, range_start + range.text.length).split("\n"); \r
- range_end += (line_start + line_nb - 1 - tab.length)*2;\r
- t.selectionEnd = range_end;\r
- }\r
- }\r
- catch(e){}\r
- }\r
- setTimeout("get_IE_selection(document.getElementById('"+ t.id +"'));", 50);\r
- };\r
- \r
- function IE_textarea_focus(){\r
- event.srcElement.focused= true;\r
- }\r
- \r
- function IE_textarea_blur(){\r
- event.srcElement.focused= false;\r
- }\r
- \r
- // select the text for IE (take into account the \r difference)\r
- function set_IE_selection( t ){\r
- var nbLineStart,nbLineStart,nbLineEnd,range;\r
- if(!window.closed){ \r
- nbLineStart=t.value.substr(0, t.selectionStart).split("\n").length - 1;\r
- nbLineEnd=t.value.substr(0, t.selectionEnd).split("\n").length - 1;\r
- try\r
- {\r
- range = document.selection.createRange();\r
- range.moveToElementText( t );\r
- range.setEndPoint( 'EndToStart', range );\r
- range.moveStart('character', t.selectionStart - nbLineStart);\r
- range.moveEnd('character', t.selectionEnd - nbLineEnd - (t.selectionStart - nbLineStart) );\r
- range.select();\r
- }\r
- catch(e){}\r
- }\r
- };\r
- \r
- \r
- editAreaLoader.waiting_loading["elements_functions.js"]= "loaded";\r