Project

General

Profile

Statistics
| Revision:

root / trunk / web / dojo / dijit / _editor / range.js

History | View | Annotate | Download (9.26 KB)

1
/*
2
        Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
3
        Available via Academic Free License >= 2.1 OR the modified BSD license.
4
        see: http://dojotoolkit.org/license for details
5
*/
6

    
7

    
8
if(!dojo._hasResource["dijit._editor.range"]){
9
dojo._hasResource["dijit._editor.range"]=true;
10
dojo.provide("dijit._editor.range");
11
dijit.range={};
12
dijit.range.getIndex=function(_1,_2){
13
var _3=[],_4=[];
14
var _5=_2;
15
var _6=_1;
16
var _7,n;
17
while(_1!=_5){
18
var i=0;
19
_7=_1.parentNode;
20
while((n=_7.childNodes[i++])){
21
if(n===_1){
22
--i;
23
break;
24
}
25
}
26
_3.unshift(i);
27
_4.unshift(i-_7.childNodes.length);
28
_1=_7;
29
}
30
if(_3.length>0&&_6.nodeType==3){
31
n=_6.previousSibling;
32
while(n&&n.nodeType==3){
33
_3[_3.length-1]--;
34
n=n.previousSibling;
35
}
36
n=_6.nextSibling;
37
while(n&&n.nodeType==3){
38
_4[_4.length-1]++;
39
n=n.nextSibling;
40
}
41
}
42
return {o:_3,r:_4};
43
};
44
dijit.range.getNode=function(_8,_9){
45
if(!dojo.isArray(_8)||_8.length==0){
46
return _9;
47
}
48
var _a=_9;
49
dojo.every(_8,function(i){
50
if(i>=0&&i<_a.childNodes.length){
51
_a=_a.childNodes[i];
52
}else{
53
_a=null;
54
return false;
55
}
56
return true;
57
});
58
return _a;
59
};
60
dijit.range.getCommonAncestor=function(n1,n2,_b){
61
_b=_b||n1.ownerDocument.body;
62
var _c=function(n){
63
var as=[];
64
while(n){
65
as.unshift(n);
66
if(n!==_b){
67
n=n.parentNode;
68
}else{
69
break;
70
}
71
}
72
return as;
73
};
74
var _d=_c(n1);
75
var _e=_c(n2);
76
var m=Math.min(_d.length,_e.length);
77
var _f=_d[0];
78
for(var i=1;i<m;i++){
79
if(_d[i]===_e[i]){
80
_f=_d[i];
81
}else{
82
break;
83
}
84
}
85
return _f;
86
};
87
dijit.range.getAncestor=function(_10,_11,_12){
88
_12=_12||_10.ownerDocument.body;
89
while(_10&&_10!==_12){
90
var _13=_10.nodeName.toUpperCase();
91
if(_11.test(_13)){
92
return _10;
93
}
94
_10=_10.parentNode;
95
}
96
return null;
97
};
98
dijit.range.BlockTagNames=/^(?:P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|DT|DE)$/;
99
dijit.range.getBlockAncestor=function(_14,_15,_16){
100
_16=_16||_14.ownerDocument.body;
101
_15=_15||dijit.range.BlockTagNames;
102
var _17=null,_18;
103
while(_14&&_14!==_16){
104
var _19=_14.nodeName.toUpperCase();
105
if(!_17&&_15.test(_19)){
106
_17=_14;
107
}
108
if(!_18&&(/^(?:BODY|TD|TH|CAPTION)$/).test(_19)){
109
_18=_14;
110
}
111
_14=_14.parentNode;
112
}
113
return {blockNode:_17,blockContainer:_18||_14.ownerDocument.body};
114
};
115
dijit.range.atBeginningOfContainer=function(_1a,_1b,_1c){
116
var _1d=false;
117
var _1e=(_1c==0);
118
if(!_1e&&_1b.nodeType==3){
119
if(/^[\s\xA0]+$/.test(_1b.nodeValue.substr(0,_1c))){
120
_1e=true;
121
}
122
}
123
if(_1e){
124
var _1f=_1b;
125
_1d=true;
126
while(_1f&&_1f!==_1a){
127
if(_1f.previousSibling){
128
_1d=false;
129
break;
130
}
131
_1f=_1f.parentNode;
132
}
133
}
134
return _1d;
135
};
136
dijit.range.atEndOfContainer=function(_20,_21,_22){
137
var _23=false;
138
var _24=(_22==(_21.length||_21.childNodes.length));
139
if(!_24&&_21.nodeType==3){
140
if(/^[\s\xA0]+$/.test(_21.nodeValue.substr(_22))){
141
_24=true;
142
}
143
}
144
if(_24){
145
var _25=_21;
146
_23=true;
147
while(_25&&_25!==_20){
148
if(_25.nextSibling){
149
_23=false;
150
break;
151
}
152
_25=_25.parentNode;
153
}
154
}
155
return _23;
156
};
157
dijit.range.adjacentNoneTextNode=function(_26,_27){
158
var _28=_26;
159
var len=(0-_26.length)||0;
160
var _29=_27?"nextSibling":"previousSibling";
161
while(_28){
162
if(_28.nodeType!=3){
163
break;
164
}
165
len+=_28.length;
166
_28=_28[_29];
167
}
168
return [_28,len];
169
};
170
dijit.range._w3c=Boolean(window["getSelection"]);
171
dijit.range.create=function(win){
172
if(dijit.range._w3c){
173
return (win||dojo.global).document.createRange();
174
}else{
175
return new dijit.range.W3CRange;
176
}
177
};
178
dijit.range.getSelection=function(win,_2a){
179
if(dijit.range._w3c){
180
return win.getSelection();
181
}else{
182
var s=new dijit.range.ie.selection(win);
183
if(!_2a){
184
s._getCurrentSelection();
185
}
186
return s;
187
}
188
};
189
if(!dijit.range._w3c){
190
dijit.range.ie={cachedSelection:{},selection:function(win){
191
this._ranges=[];
192
this.addRange=function(r,_2b){
193
this._ranges.push(r);
194
if(!_2b){
195
r._select();
196
}
197
this.rangeCount=this._ranges.length;
198
};
199
this.removeAllRanges=function(){
200
this._ranges=[];
201
this.rangeCount=0;
202
};
203
var _2c=function(){
204
var r=win.document.selection.createRange();
205
var _2d=win.document.selection.type.toUpperCase();
206
if(_2d=="CONTROL"){
207
return new dijit.range.W3CRange(dijit.range.ie.decomposeControlRange(r));
208
}else{
209
return new dijit.range.W3CRange(dijit.range.ie.decomposeTextRange(r));
210
}
211
};
212
this.getRangeAt=function(i){
213
return this._ranges[i];
214
};
215
this._getCurrentSelection=function(){
216
this.removeAllRanges();
217
var r=_2c();
218
if(r){
219
this.addRange(r,true);
220
}
221
};
222
},decomposeControlRange:function(_2e){
223
var _2f=_2e.item(0),_30=_2e.item(_2e.length-1);
224
var _31=_2f.parentNode,_32=_30.parentNode;
225
var _33=dijit.range.getIndex(_2f,_31).o;
226
var _34=dijit.range.getIndex(_30,_32).o+1;
227
return [_31,_33,_32,_34];
228
},getEndPoint:function(_35,end){
229
var _36=_35.duplicate();
230
_36.collapse(!end);
231
var _37="EndTo"+(end?"End":"Start");
232
var _38=_36.parentElement();
233
var _39,_3a,_3b;
234
if(_38.childNodes.length>0){
235
dojo.every(_38.childNodes,function(_3c,i){
236
var _3d;
237
if(_3c.nodeType!=3){
238
_36.moveToElementText(_3c);
239
if(_36.compareEndPoints(_37,_35)>0){
240
if(_3b&&_3b.nodeType==3){
241
_39=_3b;
242
_3d=true;
243
}else{
244
_39=_38;
245
_3a=i;
246
return false;
247
}
248
}else{
249
if(i==_38.childNodes.length-1){
250
_39=_38;
251
_3a=_38.childNodes.length;
252
return false;
253
}
254
}
255
}else{
256
if(i==_38.childNodes.length-1){
257
_39=_3c;
258
_3d=true;
259
}
260
}
261
if(_3d&&_39){
262
var _3e=dijit.range.adjacentNoneTextNode(_39)[0];
263
if(_3e){
264
_39=_3e.nextSibling;
265
}else{
266
_39=_38.firstChild;
267
}
268
var _3f=dijit.range.adjacentNoneTextNode(_39);
269
_3e=_3f[0];
270
var _40=_3f[1];
271
if(_3e){
272
_36.moveToElementText(_3e);
273
_36.collapse(false);
274
}else{
275
_36.moveToElementText(_38);
276
}
277
_36.setEndPoint(_37,_35);
278
_3a=_36.text.length-_40;
279
return false;
280
}
281
_3b=_3c;
282
return true;
283
});
284
}else{
285
_39=_38;
286
_3a=0;
287
}
288
if(!end&&_39.nodeType==1&&_3a==_39.childNodes.length){
289
var _41=_39.nextSibling;
290
if(_41&&_41.nodeType==3){
291
_39=_41;
292
_3a=0;
293
}
294
}
295
return [_39,_3a];
296
},setEndPoint:function(_42,_43,_44){
297
var _45=_42.duplicate(),_46,len;
298
if(_43.nodeType!=3){
299
if(_44>0){
300
_46=_43.childNodes[_44-1];
301
if(_46){
302
if(_46.nodeType==3){
303
_43=_46;
304
_44=_46.length;
305
}else{
306
if(_46.nextSibling&&_46.nextSibling.nodeType==3){
307
_43=_46.nextSibling;
308
_44=0;
309
}else{
310
_45.moveToElementText(_46.nextSibling?_46:_43);
311
var _47=_46.parentNode;
312
var _48=_47.insertBefore(_46.ownerDocument.createTextNode(" "),_46.nextSibling);
313
_45.collapse(false);
314
_47.removeChild(_48);
315
}
316
}
317
}
318
}else{
319
_45.moveToElementText(_43);
320
_45.collapse(true);
321
}
322
}
323
if(_43.nodeType==3){
324
var _49=dijit.range.adjacentNoneTextNode(_43);
325
var _4a=_49[0];
326
len=_49[1];
327
if(_4a){
328
_45.moveToElementText(_4a);
329
_45.collapse(false);
330
if(_4a.contentEditable!="inherit"){
331
len++;
332
}
333
}else{
334
_45.moveToElementText(_43.parentNode);
335
_45.collapse(true);
336
}
337
_44+=len;
338
if(_44>0){
339
if(_45.move("character",_44)!=_44){
340
console.error("Error when moving!");
341
}
342
}
343
}
344
return _45;
345
},decomposeTextRange:function(_4b){
346
var _4c=dijit.range.ie.getEndPoint(_4b);
347
var _4d=_4c[0],_4e=_4c[1];
348
var _4f=_4c[0],_50=_4c[1];
349
if(_4b.htmlText.length){
350
if(_4b.htmlText==_4b.text){
351
_50=_4e+_4b.text.length;
352
}else{
353
_4c=dijit.range.ie.getEndPoint(_4b,true);
354
_4f=_4c[0],_50=_4c[1];
355
}
356
}
357
return [_4d,_4e,_4f,_50];
358
},setRange:function(_51,_52,_53,_54,_55,_56){
359
var _57=dijit.range.ie.setEndPoint(_51,_52,_53);
360
_51.setEndPoint("StartToStart",_57);
361
if(!_56){
362
var end=dijit.range.ie.setEndPoint(_51,_54,_55);
363
}
364
_51.setEndPoint("EndToEnd",end||_57);
365
return _51;
366
}};
367
dojo.declare("dijit.range.W3CRange",null,{constructor:function(){
368
if(arguments.length>0){
369
this.setStart(arguments[0][0],arguments[0][1]);
370
this.setEnd(arguments[0][2],arguments[0][3]);
371
}else{
372
this.commonAncestorContainer=null;
373
this.startContainer=null;
374
this.startOffset=0;
375
this.endContainer=null;
376
this.endOffset=0;
377
this.collapsed=true;
378
}
379
},_updateInternal:function(){
380
if(this.startContainer!==this.endContainer){
381
this.commonAncestorContainer=dijit.range.getCommonAncestor(this.startContainer,this.endContainer);
382
}else{
383
this.commonAncestorContainer=this.startContainer;
384
}
385
this.collapsed=(this.startContainer===this.endContainer)&&(this.startOffset==this.endOffset);
386
},setStart:function(_58,_59){
387
_59=parseInt(_59);
388
if(this.startContainer===_58&&this.startOffset==_59){
389
return;
390
}
391
delete this._cachedBookmark;
392
this.startContainer=_58;
393
this.startOffset=_59;
394
if(!this.endContainer){
395
this.setEnd(_58,_59);
396
}else{
397
this._updateInternal();
398
}
399
},setEnd:function(_5a,_5b){
400
_5b=parseInt(_5b);
401
if(this.endContainer===_5a&&this.endOffset==_5b){
402
return;
403
}
404
delete this._cachedBookmark;
405
this.endContainer=_5a;
406
this.endOffset=_5b;
407
if(!this.startContainer){
408
this.setStart(_5a,_5b);
409
}else{
410
this._updateInternal();
411
}
412
},setStartAfter:function(_5c,_5d){
413
this._setPoint("setStart",_5c,_5d,1);
414
},setStartBefore:function(_5e,_5f){
415
this._setPoint("setStart",_5e,_5f,0);
416
},setEndAfter:function(_60,_61){
417
this._setPoint("setEnd",_60,_61,1);
418
},setEndBefore:function(_62,_63){
419
this._setPoint("setEnd",_62,_63,0);
420
},_setPoint:function(_64,_65,_66,ext){
421
var _67=dijit.range.getIndex(_65,_65.parentNode).o;
422
this[_64](_65.parentNode,_67.pop()+ext);
423
},_getIERange:function(){
424
var r=(this._body||this.endContainer.ownerDocument.body).createTextRange();
425
dijit.range.ie.setRange(r,this.startContainer,this.startOffset,this.endContainer,this.endOffset,this.collapsed);
426
return r;
427
},getBookmark:function(_68){
428
this._getIERange();
429
return this._cachedBookmark;
430
},_select:function(){
431
var r=this._getIERange();
432
r.select();
433
},deleteContents:function(){
434
var r=this._getIERange();
435
r.pasteHTML("");
436
this.endContainer=this.startContainer;
437
this.endOffset=this.startOffset;
438
this.collapsed=true;
439
},cloneRange:function(){
440
var r=new dijit.range.W3CRange([this.startContainer,this.startOffset,this.endContainer,this.endOffset]);
441
r._body=this._body;
442
return r;
443
},detach:function(){
444
this._body=null;
445
this.commonAncestorContainer=null;
446
this.startContainer=null;
447
this.startOffset=0;
448
this.endContainer=null;
449
this.endOffset=0;
450
this.collapsed=true;
451
}});
452
}
453
}