~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to www/media/common/edit_area/elements_functions.js

  • Committer: William Grant
  • Date: 2008-07-07 01:45:11 UTC
  • mfrom: (unknown (missing))
  • Revision ID: wgrant@ugrad.unimelb.edu.au-20080707014511-xyy43p6y8jiqrsh9
Merge killall-editarea branch. We now use CodePress instead, which is
somewhat less slothful.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/****
2
 
 * This page contains some general usefull functions for javascript
3
 
 *
4
 
 ****/  
5
 
        
6
 
        
7
 
        // need to redefine this functiondue to IE problem
8
 
        function getAttribute( elm, aname ) {
9
 
                try{
10
 
                        var avalue = elm.getAttribute( aname );
11
 
                }catch(exept){
12
 
                
13
 
                }
14
 
                if ( ! avalue ) {
15
 
                        for ( var i = 0; i < elm.attributes.length; i ++ ) {
16
 
                                var taName = elm.attributes [i] .name.toLowerCase();
17
 
                                if ( taName == aname ) {
18
 
                                        avalue = elm.attributes [i] .value;
19
 
                                        return avalue;
20
 
                                }
21
 
                        }
22
 
                }
23
 
                return avalue;
24
 
        };
25
 
        
26
 
        // need to redefine this function due to IE problem
27
 
        function setAttribute( elm, attr, val ) {
28
 
                if(attr=="class"){
29
 
                        elm.setAttribute("className", val);
30
 
                        elm.setAttribute("class", val);
31
 
                }else{
32
 
                        elm.setAttribute(attr, val);
33
 
                }
34
 
        };
35
 
        
36
 
        /* return a child element
37
 
                elem: element we are searching in
38
 
                elem_type: type of the eleemnt we are searching (DIV, A, etc...)
39
 
                elem_attribute: attribute of the searched element that must match
40
 
                elem_attribute_match: value that elem_attribute must match
41
 
                option: "all" if must return an array of all children, otherwise return the first match element
42
 
                depth: depth of search (-1 or no set => unlimited)
43
 
        */
44
 
        function getChildren(elem, elem_type, elem_attribute, elem_attribute_match, option, depth)
45
 
        {           
46
 
                if(!option)
47
 
                        var option="single";
48
 
                if(!depth)
49
 
                        var depth=-1;
50
 
                if(elem){
51
 
                        var children= elem.childNodes;
52
 
                        var result=null;
53
 
                        var results= new Array();
54
 
                        for (var x=0;x<children.length;x++) {
55
 
                                strTagName = new String(children[x].tagName);
56
 
                                children_class="?";
57
 
                                if(strTagName!= "undefined"){
58
 
                                        child_attribute= getAttribute(children[x],elem_attribute);
59
 
                                        if((strTagName.toLowerCase()==elem_type.toLowerCase() || elem_type=="") && (elem_attribute=="" || child_attribute==elem_attribute_match)){
60
 
                                                if(option=="all"){
61
 
                                                        results.push(children[x]);
62
 
                                                }else{
63
 
                                                        return children[x];
64
 
                                                }
65
 
                                        }
66
 
                                        if(depth!=0){
67
 
                                                result=getChildren(children[x], elem_type, elem_attribute, elem_attribute_match, option, depth-1);
68
 
                                                if(option=="all"){
69
 
                                                        if(result.length>0){
70
 
                                                                results= results.concat(result);
71
 
                                                        }
72
 
                                                }else if(result!=null){                                                                          
73
 
                                                        return result;
74
 
                                                }
75
 
                                        }
76
 
                                }
77
 
                        }
78
 
                        if(option=="all")
79
 
                           return results;
80
 
                }
81
 
                return null;
82
 
        };       
83
 
        
84
 
        function isChildOf(elem, parent){
85
 
                if(elem){
86
 
                        if(elem==parent)
87
 
                                return true;
88
 
                        while(elem.parentNode != 'undefined'){
89
 
                                return isChildOf(elem.parentNode, parent);
90
 
                        }
91
 
                }
92
 
                return false;
93
 
        };
94
 
        
95
 
        function getMouseX(e){
96
 
                /*if(document.all)
97
 
                        return event.x + document.body.scrollLeft;
98
 
                else
99
 
                        return e.pageX;*/
100
 
                if(e!=null && typeof(e.pageX)!="undefined"){
101
 
                        return e.pageX;
102
 
                }else{
103
 
                        return (e!=null?e.x:event.x)+ document.documentElement.scrollLeft;
104
 
                }
105
 
                //return (e!=null) ? e.pageX : event.x + document.documentElement.scrollLeft;
106
 
        };
107
 
        
108
 
        function getMouseY(e){
109
 
                /*if(document.all)
110
 
                        return event.y + document.body.scrollTop;
111
 
                else
112
 
                        return e.pageY;*/
113
 
                if(e!=null && typeof(e.pageY)!="undefined"){
114
 
                        return e.pageY;
115
 
                }else{
116
 
                        return (e!=null?e.y:event.y)+ document.documentElement.scrollTop;
117
 
                }
118
 
                //return (e!=null) ? e.pageY : event.y + document.documentElement.scrollTop;
119
 
        };
120
 
        
121
 
        function calculeOffsetLeft(r){
122
 
          return calculeOffset(r,"offsetLeft")
123
 
        };
124
 
        
125
 
        function calculeOffsetTop(r){
126
 
          return calculeOffset(r,"offsetTop")
127
 
        };
128
 
        
129
 
        function calculeOffset(element,attr){
130
 
          var offset=0;
131
 
          while(element){
132
 
                offset+=element[attr];
133
 
                element=element.offsetParent
134
 
          }
135
 
          return offset;
136
 
        };
137
 
        
138
 
        /** return the computed style
139
 
         *      @param: elem: the reference to the element
140
 
         *      @param: prop: the name of the css property       
141
 
         */
142
 
        function get_css_property(elem, prop)
143
 
        {
144
 
                if(document.defaultView)
145
 
                {
146
 
                        return document.defaultView.getComputedStyle(elem, null).getPropertyValue(prop);
147
 
                }
148
 
                else if(elem.currentStyle)
149
 
                {
150
 
                        var prop = prop.replace(/-\D/gi, function(sMatch)
151
 
                        {
152
 
                                return sMatch.charAt(sMatch.length - 1).toUpperCase();
153
 
                        });
154
 
                        return elem.currentStyle[prop];
155
 
                }
156
 
                else return null;
157
 
        }
158
 
        
159
 
/****
160
 
 * Moving an element 
161
 
 ***/  
162
 
        
163
 
        var move_current_element;
164
 
        /* allow to move an element in a window
165
 
                e: the event
166
 
                id: the id of the element
167
 
                frame: the frame of the element 
168
 
                ex of use:
169
 
                        in html:        <img id='move_area_search_replace' onmousedown='return parent.start_move_element(event,"area_search_replace", parent.frames["this_frame_id"]);' .../>  
170
 
                or
171
 
                        in javascript: document.getElementById("my_div").onmousedown= start_move_element
172
 
        */
173
 
        function start_move_element(e, id, frame){
174
 
                var elem_id=(e.target || e.srcElement).id;
175
 
                if(id)
176
 
                        elem_id=id;             
177
 
                if(!frame)
178
 
                        frame=window;
179
 
                if(frame.event)
180
 
                        e=frame.event;
181
 
                        
182
 
                move_current_element= frame.document.getElementById(elem_id);
183
 
                move_current_element.frame=frame;
184
 
                frame.document.onmousemove= move_element;
185
 
                frame.document.onmouseup= end_move_element;
186
 
                /*move_current_element.onmousemove= move_element;
187
 
                move_current_element.onmouseup= end_move_element;*/
188
 
                
189
 
                //alert(move_current_element.frame.document.body.offsetHeight);
190
 
                
191
 
                mouse_x= getMouseX(e);
192
 
                mouse_y= getMouseY(e);
193
 
                //window.status=frame+ " elem: "+elem_id+" elem: "+ move_current_element + " mouse_x: "+mouse_x;
194
 
                move_current_element.start_pos_x = mouse_x - (move_current_element.style.left.replace("px","") || calculeOffsetLeft(move_current_element));
195
 
                move_current_element.start_pos_y = mouse_y - (move_current_element.style.top.replace("px","") || calculeOffsetTop(move_current_element));
196
 
                return false;
197
 
        };
198
 
        
199
 
        function end_move_element(e){
200
 
                move_current_element.frame.document.onmousemove= "";
201
 
                move_current_element.frame.document.onmouseup= "";              
202
 
                move_current_element=null;
203
 
        };
204
 
        
205
 
        function move_element(e){
206
 
                /*window.status="move"+frame;
207
 
                window.status="move2"+frame.event;*/
208
 
                if(move_current_element.frame && move_current_element.frame.event)
209
 
                        e=move_current_element.frame.event;
210
 
                var mouse_x=getMouseX(e);
211
 
                var mouse_y=getMouseY(e);
212
 
                var new_top= mouse_y - move_current_element.start_pos_y;
213
 
                var new_left= mouse_x - move_current_element.start_pos_x;
214
 
                
215
 
                var max_left= move_current_element.frame.document.body.offsetWidth- move_current_element.offsetWidth;
216
 
                max_top= move_current_element.frame.document.body.offsetHeight- move_current_element.offsetHeight;
217
 
                new_top= Math.min(Math.max(0, new_top), max_top);
218
 
                new_left= Math.min(Math.max(0, new_left), max_left);
219
 
                
220
 
                move_current_element.style.top= new_top+"px";
221
 
                move_current_element.style.left= new_left+"px";         
222
 
                return false;
223
 
        };
224
 
        
225
 
/***
226
 
 * Managing a textarea (this part need the navigator infos from editAreaLoader
227
 
 ***/ 
228
 
        
229
 
        var nav= editAreaLoader.nav;
230
 
        
231
 
        // allow to get infos on the selection: array(start, end)
232
 
        function getSelectionRange(textarea){
233
 
                //if(nav['isIE'])
234
 
                //      get_IE_selection(textarea);
235
 
                return {"start": textarea.selectionStart, "end": textarea.selectionEnd};
236
 
        };
237
 
        
238
 
        // allow to set the selection
239
 
        function setSelectionRange(textarea, start, end){
240
 
                textarea.focus();
241
 
                
242
 
                start= Math.max(0, Math.min(textarea.value.length, start));
243
 
                end= Math.max(start, Math.min(textarea.value.length, end));
244
 
        
245
 
                if(nav['isOpera']){     // Opera bug when moving selection start and selection end
246
 
                        textarea.selectionEnd = 1;      
247
 
                        textarea.selectionStart = 0;                    
248
 
                        textarea.selectionEnd = 1;      
249
 
                        textarea.selectionStart = 0;            
250
 
                }
251
 
                textarea.selectionStart = start;
252
 
                textarea.selectionEnd = end;            
253
 
                //textarea.setSelectionRange(start, end);
254
 
                
255
 
                if(nav['isIE'])
256
 
                        set_IE_selection(textarea);
257
 
        };
258
 
 
259
 
        
260
 
        // set IE position in Firefox mode (textarea.selectionStart and textarea.selectionEnd). should work as a repeated task
261
 
        function get_IE_selection(textarea){
262
 
                        
263
 
                if(textarea && textarea.focused)
264
 
                {       
265
 
                        if(!textarea.ea_line_height)
266
 
                        {       // calculate the lineHeight
267
 
                                var div= document.createElement("div");
268
 
                                div.style.fontFamily= get_css_property(textarea, "font-family");
269
 
                                div.style.fontSize= get_css_property(textarea, "font-size");
270
 
                                div.style.visibility= "hidden";                 
271
 
                                div.innerHTML="0";
272
 
                                document.body.appendChild(div);
273
 
                                textarea.ea_line_height= div.offsetHeight;
274
 
                                document.body.removeChild(div);
275
 
                        }
276
 
                        //textarea.focus();
277
 
                        var range = document.selection.createRange();   
278
 
                        var stored_range = range.duplicate();
279
 
                        stored_range.moveToElementText( textarea );
280
 
                        stored_range.setEndPoint( 'EndToEnd', range );
281
 
                        if(stored_range.parentElement()==textarea){
282
 
                                // the range don't take care of empty lines in the end of the selection
283
 
                                var elem= textarea;
284
 
                                var scrollTop= 0;
285
 
                                while(elem.parentNode){
286
 
                                        scrollTop+= elem.scrollTop;
287
 
                                        elem= elem.parentNode;
288
 
                                }
289
 
                        
290
 
                        //      var scrollTop= textarea.scrollTop + document.body.scrollTop;
291
 
                                
292
 
                        //      var relative_top= range.offsetTop - calculeOffsetTop(textarea) + scrollTop;
293
 
                                var relative_top= range.offsetTop - calculeOffsetTop(textarea)+ scrollTop;
294
 
                        //      alert("rangeoffset: "+ range.offsetTop +"\ncalcoffsetTop: "+ calculeOffsetTop(textarea) +"\nrelativeTop: "+ relative_top);
295
 
                                var line_start = Math.round((relative_top / textarea.ea_line_height) +1);
296
 
                                
297
 
                                var line_nb= Math.round(range.boundingHeight / textarea.ea_line_height);
298
 
                                
299
 
                //              alert("store_range: "+ stored_range.text.length+"\nrange: "+range.text.length+"\nrange_text: "+ range.text);
300
 
                                var range_start= stored_range.text.length - range.text.length;
301
 
                                var tab= textarea.value.substr(0, range_start).split("\n");                     
302
 
                                range_start+= (line_start - tab.length)*2;              // add missing empty lines to the selection
303
 
                                textarea.selectionStart = range_start;
304
 
                                
305
 
                                var range_end= textarea.selectionStart + range.text.length;
306
 
                                tab= textarea.value.substr(0, range_start + range.text.length).split("\n");                     
307
 
                                range_end+= (line_start + line_nb - 1 - tab.length)*2;
308
 
                                textarea.selectionEnd = range_end;
309
 
                        }
310
 
                }
311
 
                setTimeout("get_IE_selection(document.getElementById('"+ textarea.id +"'));", 50);
312
 
        };
313
 
        
314
 
        function IE_textarea_focus(){
315
 
                event.srcElement.focused= true;
316
 
        }
317
 
        
318
 
        function IE_textarea_blur(){
319
 
                event.srcElement.focused= false;
320
 
        }
321
 
        
322
 
        // select the text for IE (take into account the \r difference)
323
 
        function set_IE_selection(textarea){
324
 
                var nbLineStart=textarea.value.substr(0, textarea.selectionStart).split("\n").length - 1;
325
 
                var nbLineEnd=textarea.value.substr(0, textarea.selectionEnd).split("\n").length - 1;
326
 
                var range = document.selection.createRange();
327
 
                range.moveToElementText( textarea );
328
 
                range.setEndPoint( 'EndToStart', range );
329
 
                range.moveStart('character', textarea.selectionStart - nbLineStart);
330
 
                range.moveEnd('character', textarea.selectionEnd - nbLineEnd - (textarea.selectionStart - nbLineStart)  );
331
 
                range.select();
332
 
        };
333
 
        
334
 
        
335
 
        editAreaLoader.waiting_loading["elements_functions.js"]= "loaded";