mirror of
https://git.tt-rss.org/git/tt-rss.git
synced 2025-12-22 18:41:28 +00:00
upgrade Dojo to 1.6.1
This commit is contained in:
@@ -1,453 +1,541 @@
|
||||
/*
|
||||
Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
|
||||
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
|
||||
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||||
see: http://dojotoolkit.org/license for details
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dijit._editor.range"]){
|
||||
dojo._hasResource["dijit._editor.range"]=true;
|
||||
if(!dojo._hasResource["dijit._editor.range"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dijit._editor.range"] = true;
|
||||
dojo.provide("dijit._editor.range");
|
||||
|
||||
|
||||
dijit.range={};
|
||||
dijit.range.getIndex=function(_1,_2){
|
||||
var _3=[],_4=[];
|
||||
var _5=_2;
|
||||
var _6=_1;
|
||||
var _7,n;
|
||||
while(_1!=_5){
|
||||
var i=0;
|
||||
_7=_1.parentNode;
|
||||
while((n=_7.childNodes[i++])){
|
||||
if(n===_1){
|
||||
--i;
|
||||
break;
|
||||
|
||||
dijit.range.getIndex=function(/*DomNode*/node, /*DomNode*/parent){
|
||||
// dojo.profile.start("dijit.range.getIndex");
|
||||
var ret=[], retR=[];
|
||||
var stop = parent;
|
||||
var onode = node;
|
||||
|
||||
var pnode, n;
|
||||
while(node != stop){
|
||||
var i = 0;
|
||||
pnode = node.parentNode;
|
||||
while((n=pnode.childNodes[i++])){
|
||||
if(n === node){
|
||||
--i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
//if(i>=pnode.childNodes.length){
|
||||
//dojo.debug("Error finding index of a node in dijit.range.getIndex");
|
||||
//}
|
||||
ret.unshift(i);
|
||||
retR.unshift(i-pnode.childNodes.length);
|
||||
node = pnode;
|
||||
}
|
||||
|
||||
//normalized() can not be called so often to prevent
|
||||
//invalidating selection/range, so we have to detect
|
||||
//here that any text nodes in a row
|
||||
if(ret.length > 0 && onode.nodeType == 3){
|
||||
n = onode.previousSibling;
|
||||
while(n && n.nodeType == 3){
|
||||
ret[ret.length-1]--;
|
||||
n = n.previousSibling;
|
||||
}
|
||||
n = onode.nextSibling;
|
||||
while(n && n.nodeType == 3){
|
||||
retR[retR.length-1]++;
|
||||
n = n.nextSibling;
|
||||
}
|
||||
}
|
||||
// dojo.profile.end("dijit.range.getIndex");
|
||||
return {o: ret, r:retR};
|
||||
}
|
||||
|
||||
dijit.range.getNode = function(/*Array*/index, /*DomNode*/parent){
|
||||
if(!dojo.isArray(index) || index.length == 0){
|
||||
return parent;
|
||||
}
|
||||
var node = parent;
|
||||
// if(!node)debugger
|
||||
dojo.every(index, function(i){
|
||||
if(i >= 0 && i < node.childNodes.length){
|
||||
node = node.childNodes[i];
|
||||
}else{
|
||||
node = null;
|
||||
//console.debug('Error: can not find node with index',index,'under parent node',parent );
|
||||
return false; //terminate dojo.every
|
||||
}
|
||||
return true; //carry on the every loop
|
||||
});
|
||||
|
||||
return node;
|
||||
}
|
||||
_3.unshift(i);
|
||||
_4.unshift(i-_7.childNodes.length);
|
||||
_1=_7;
|
||||
|
||||
dijit.range.getCommonAncestor = function(n1,n2,root){
|
||||
root = root||n1.ownerDocument.body;
|
||||
var getAncestors = function(n){
|
||||
var as=[];
|
||||
while(n){
|
||||
as.unshift(n);
|
||||
if(n !== root){
|
||||
n = n.parentNode;
|
||||
}else{
|
||||
break;
|
||||
}
|
||||
}
|
||||
return as;
|
||||
};
|
||||
var n1as = getAncestors(n1);
|
||||
var n2as = getAncestors(n2);
|
||||
|
||||
var m = Math.min(n1as.length,n2as.length);
|
||||
var com = n1as[0]; //at least, one element should be in the array: the root (BODY by default)
|
||||
for(var i=1;i<m;i++){
|
||||
if(n1as[i] === n2as[i]){
|
||||
com = n1as[i]
|
||||
}else{
|
||||
break;
|
||||
}
|
||||
}
|
||||
return com;
|
||||
}
|
||||
if(_3.length>0&&_6.nodeType==3){
|
||||
n=_6.previousSibling;
|
||||
while(n&&n.nodeType==3){
|
||||
_3[_3.length-1]--;
|
||||
n=n.previousSibling;
|
||||
|
||||
dijit.range.getAncestor = function(/*DomNode*/node, /*RegEx?*/regex, /*DomNode?*/root){
|
||||
root = root || node.ownerDocument.body;
|
||||
while(node && node !== root){
|
||||
var name = node.nodeName.toUpperCase() ;
|
||||
if(regex.test(name)){
|
||||
return node;
|
||||
}
|
||||
|
||||
node = node.parentNode;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
n=_6.nextSibling;
|
||||
while(n&&n.nodeType==3){
|
||||
_4[_4.length-1]++;
|
||||
n=n.nextSibling;
|
||||
|
||||
dijit.range.BlockTagNames = /^(?:P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|DT|DE)$/;
|
||||
dijit.range.getBlockAncestor = function(/*DomNode*/node, /*RegEx?*/regex, /*DomNode?*/root){
|
||||
root = root || node.ownerDocument.body;
|
||||
regex = regex || dijit.range.BlockTagNames;
|
||||
var block=null, blockContainer;
|
||||
while(node && node !== root){
|
||||
var name = node.nodeName.toUpperCase() ;
|
||||
if(!block && regex.test(name)){
|
||||
block = node;
|
||||
}
|
||||
if(!blockContainer && (/^(?:BODY|TD|TH|CAPTION)$/).test(name)){
|
||||
blockContainer = node;
|
||||
}
|
||||
|
||||
node = node.parentNode;
|
||||
}
|
||||
return {blockNode:block, blockContainer:blockContainer || node.ownerDocument.body};
|
||||
}
|
||||
|
||||
dijit.range.atBeginningOfContainer = function(/*DomNode*/container, /*DomNode*/node, /*Int*/offset){
|
||||
var atBeginning = false;
|
||||
var offsetAtBeginning = (offset == 0);
|
||||
if(!offsetAtBeginning && node.nodeType == 3){ //if this is a text node, check whether the left part is all space
|
||||
if(/^[\s\xA0]+$/.test(node.nodeValue.substr(0,offset))){
|
||||
offsetAtBeginning = true;
|
||||
}
|
||||
}
|
||||
if(offsetAtBeginning){
|
||||
var cnode = node;
|
||||
atBeginning = true;
|
||||
while(cnode && cnode !== container){
|
||||
if(cnode.previousSibling){
|
||||
atBeginning = false;
|
||||
break;
|
||||
}
|
||||
cnode = cnode.parentNode;
|
||||
}
|
||||
}
|
||||
return atBeginning;
|
||||
}
|
||||
return {o:_3,r:_4};
|
||||
};
|
||||
dijit.range.getNode=function(_8,_9){
|
||||
if(!dojo.isArray(_8)||_8.length==0){
|
||||
return _9;
|
||||
|
||||
dijit.range.atEndOfContainer = function(/*DomNode*/container, /*DomNode*/node, /*Int*/offset){
|
||||
var atEnd = false;
|
||||
var offsetAtEnd = (offset == (node.length || node.childNodes.length));
|
||||
if(!offsetAtEnd && node.nodeType == 3){ //if this is a text node, check whether the right part is all space
|
||||
if(/^[\s\xA0]+$/.test(node.nodeValue.substr(offset))){
|
||||
offsetAtEnd = true;
|
||||
}
|
||||
}
|
||||
if(offsetAtEnd){
|
||||
var cnode = node;
|
||||
atEnd = true;
|
||||
while(cnode && cnode !== container){
|
||||
if(cnode.nextSibling){
|
||||
atEnd = false;
|
||||
break;
|
||||
}
|
||||
cnode = cnode.parentNode;
|
||||
}
|
||||
}
|
||||
return atEnd;
|
||||
}
|
||||
var _a=_9;
|
||||
dojo.every(_8,function(i){
|
||||
if(i>=0&&i<_a.childNodes.length){
|
||||
_a=_a.childNodes[i];
|
||||
}else{
|
||||
_a=null;
|
||||
return false;
|
||||
|
||||
dijit.range.adjacentNoneTextNode=function(startnode, next){
|
||||
var node = startnode;
|
||||
var len = (0-startnode.length) || 0;
|
||||
var prop = next?'nextSibling':'previousSibling';
|
||||
while(node){
|
||||
if(node.nodeType!=3){
|
||||
break;
|
||||
}
|
||||
len += node.length
|
||||
node = node[prop];
|
||||
}
|
||||
return [node,len];
|
||||
}
|
||||
return true;
|
||||
});
|
||||
return _a;
|
||||
};
|
||||
dijit.range.getCommonAncestor=function(n1,n2,_b){
|
||||
_b=_b||n1.ownerDocument.body;
|
||||
var _c=function(n){
|
||||
var as=[];
|
||||
while(n){
|
||||
as.unshift(n);
|
||||
if(n!==_b){
|
||||
n=n.parentNode;
|
||||
}else{
|
||||
break;
|
||||
|
||||
dijit.range._w3c = Boolean(window['getSelection']);
|
||||
dijit.range.create = function(/*Window?*/win){
|
||||
if(dijit.range._w3c){
|
||||
return (win || dojo.global).document.createRange();
|
||||
}else{//IE
|
||||
return new dijit.range.W3CRange;
|
||||
}
|
||||
}
|
||||
|
||||
dijit.range.getSelection = function(/*Window*/win, /*Boolean?*/ignoreUpdate){
|
||||
if(dijit.range._w3c){
|
||||
return win.getSelection();
|
||||
}else{//IE
|
||||
var s = new dijit.range.ie.selection(win);
|
||||
if(!ignoreUpdate){
|
||||
s._getCurrentSelection();
|
||||
}
|
||||
return s;
|
||||
}
|
||||
}
|
||||
return as;
|
||||
};
|
||||
var _d=_c(n1);
|
||||
var _e=_c(n2);
|
||||
var m=Math.min(_d.length,_e.length);
|
||||
var _f=_d[0];
|
||||
for(var i=1;i<m;i++){
|
||||
if(_d[i]===_e[i]){
|
||||
_f=_d[i];
|
||||
}else{
|
||||
break;
|
||||
}
|
||||
}
|
||||
return _f;
|
||||
};
|
||||
dijit.range.getAncestor=function(_10,_11,_12){
|
||||
_12=_12||_10.ownerDocument.body;
|
||||
while(_10&&_10!==_12){
|
||||
var _13=_10.nodeName.toUpperCase();
|
||||
if(_11.test(_13)){
|
||||
return _10;
|
||||
}
|
||||
_10=_10.parentNode;
|
||||
}
|
||||
return null;
|
||||
};
|
||||
dijit.range.BlockTagNames=/^(?:P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|DT|DE)$/;
|
||||
dijit.range.getBlockAncestor=function(_14,_15,_16){
|
||||
_16=_16||_14.ownerDocument.body;
|
||||
_15=_15||dijit.range.BlockTagNames;
|
||||
var _17=null,_18;
|
||||
while(_14&&_14!==_16){
|
||||
var _19=_14.nodeName.toUpperCase();
|
||||
if(!_17&&_15.test(_19)){
|
||||
_17=_14;
|
||||
}
|
||||
if(!_18&&(/^(?:BODY|TD|TH|CAPTION)$/).test(_19)){
|
||||
_18=_14;
|
||||
}
|
||||
_14=_14.parentNode;
|
||||
}
|
||||
return {blockNode:_17,blockContainer:_18||_14.ownerDocument.body};
|
||||
};
|
||||
dijit.range.atBeginningOfContainer=function(_1a,_1b,_1c){
|
||||
var _1d=false;
|
||||
var _1e=(_1c==0);
|
||||
if(!_1e&&_1b.nodeType==3){
|
||||
if(/^[\s\xA0]+$/.test(_1b.nodeValue.substr(0,_1c))){
|
||||
_1e=true;
|
||||
}
|
||||
}
|
||||
if(_1e){
|
||||
var _1f=_1b;
|
||||
_1d=true;
|
||||
while(_1f&&_1f!==_1a){
|
||||
if(_1f.previousSibling){
|
||||
_1d=false;
|
||||
break;
|
||||
}
|
||||
_1f=_1f.parentNode;
|
||||
}
|
||||
}
|
||||
return _1d;
|
||||
};
|
||||
dijit.range.atEndOfContainer=function(_20,_21,_22){
|
||||
var _23=false;
|
||||
var _24=(_22==(_21.length||_21.childNodes.length));
|
||||
if(!_24&&_21.nodeType==3){
|
||||
if(/^[\s\xA0]+$/.test(_21.nodeValue.substr(_22))){
|
||||
_24=true;
|
||||
}
|
||||
}
|
||||
if(_24){
|
||||
var _25=_21;
|
||||
_23=true;
|
||||
while(_25&&_25!==_20){
|
||||
if(_25.nextSibling){
|
||||
_23=false;
|
||||
break;
|
||||
}
|
||||
_25=_25.parentNode;
|
||||
}
|
||||
}
|
||||
return _23;
|
||||
};
|
||||
dijit.range.adjacentNoneTextNode=function(_26,_27){
|
||||
var _28=_26;
|
||||
var len=(0-_26.length)||0;
|
||||
var _29=_27?"nextSibling":"previousSibling";
|
||||
while(_28){
|
||||
if(_28.nodeType!=3){
|
||||
break;
|
||||
}
|
||||
len+=_28.length;
|
||||
_28=_28[_29];
|
||||
}
|
||||
return [_28,len];
|
||||
};
|
||||
dijit.range._w3c=Boolean(window["getSelection"]);
|
||||
dijit.range.create=function(win){
|
||||
if(dijit.range._w3c){
|
||||
return (win||dojo.global).document.createRange();
|
||||
}else{
|
||||
return new dijit.range.W3CRange;
|
||||
}
|
||||
};
|
||||
dijit.range.getSelection=function(win,_2a){
|
||||
if(dijit.range._w3c){
|
||||
return win.getSelection();
|
||||
}else{
|
||||
var s=new dijit.range.ie.selection(win);
|
||||
if(!_2a){
|
||||
s._getCurrentSelection();
|
||||
}
|
||||
return s;
|
||||
}
|
||||
};
|
||||
|
||||
if(!dijit.range._w3c){
|
||||
dijit.range.ie={cachedSelection:{},selection:function(win){
|
||||
this._ranges=[];
|
||||
this.addRange=function(r,_2b){
|
||||
this._ranges.push(r);
|
||||
if(!_2b){
|
||||
r._select();
|
||||
dijit.range.ie={
|
||||
cachedSelection: {},
|
||||
selection: function(win){
|
||||
this._ranges = [];
|
||||
this.addRange = function(r, /*boolean*/internal){
|
||||
this._ranges.push(r);
|
||||
if(!internal){
|
||||
r._select();
|
||||
}
|
||||
this.rangeCount = this._ranges.length;
|
||||
};
|
||||
this.removeAllRanges = function(){
|
||||
//don't detach, the range may be used later
|
||||
// for(var i=0;i<this._ranges.length;i++){
|
||||
// this._ranges[i].detach();
|
||||
// }
|
||||
this._ranges = [];
|
||||
this.rangeCount = 0;
|
||||
};
|
||||
var _initCurrentRange = function(){
|
||||
var r = win.document.selection.createRange();
|
||||
var type=win.document.selection.type.toUpperCase();
|
||||
if(type == "CONTROL"){
|
||||
//TODO: multiple range selection(?)
|
||||
return new dijit.range.W3CRange(dijit.range.ie.decomposeControlRange(r));
|
||||
}else{
|
||||
return new dijit.range.W3CRange(dijit.range.ie.decomposeTextRange(r));
|
||||
}
|
||||
};
|
||||
this.getRangeAt = function(i){
|
||||
return this._ranges[i];
|
||||
};
|
||||
this._getCurrentSelection = function(){
|
||||
this.removeAllRanges();
|
||||
var r=_initCurrentRange();
|
||||
if(r){
|
||||
this.addRange(r, true);
|
||||
}
|
||||
};
|
||||
},
|
||||
decomposeControlRange: function(range){
|
||||
var firstnode = range.item(0), lastnode = range.item(range.length-1);
|
||||
var startContainer = firstnode.parentNode, endContainer = lastnode.parentNode;
|
||||
var startOffset = dijit.range.getIndex(firstnode, startContainer).o;
|
||||
var endOffset = dijit.range.getIndex(lastnode, endContainer).o+1;
|
||||
return [startContainer, startOffset,endContainer, endOffset];
|
||||
},
|
||||
getEndPoint: function(range, end){
|
||||
var atmrange = range.duplicate();
|
||||
atmrange.collapse(!end);
|
||||
var cmpstr = 'EndTo' + (end?'End':'Start');
|
||||
var parentNode = atmrange.parentElement();
|
||||
|
||||
var startnode, startOffset, lastNode;
|
||||
if(parentNode.childNodes.length>0){
|
||||
dojo.every(parentNode.childNodes, function(node,i){
|
||||
var calOffset;
|
||||
if(node.nodeType != 3){
|
||||
atmrange.moveToElementText(node);
|
||||
|
||||
if(atmrange.compareEndPoints(cmpstr,range) > 0){
|
||||
//startnode = node.previousSibling;
|
||||
if(lastNode && lastNode.nodeType == 3){
|
||||
//where shall we put the start? in the text node or after?
|
||||
startnode = lastNode;
|
||||
calOffset = true;
|
||||
}else{
|
||||
startnode = parentNode;
|
||||
startOffset = i;
|
||||
return false;
|
||||
}
|
||||
}else{
|
||||
if(i == parentNode.childNodes.length-1){
|
||||
startnode = parentNode;
|
||||
startOffset = parentNode.childNodes.length;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}else{
|
||||
if(i == parentNode.childNodes.length-1){//at the end of this node
|
||||
startnode = node;
|
||||
calOffset = true;
|
||||
}
|
||||
}
|
||||
// try{
|
||||
if(calOffset && startnode){
|
||||
var prevnode = dijit.range.adjacentNoneTextNode(startnode)[0];
|
||||
if(prevnode){
|
||||
startnode = prevnode.nextSibling;
|
||||
}else{
|
||||
startnode = parentNode.firstChild; //firstChild must be a text node
|
||||
}
|
||||
var prevnodeobj = dijit.range.adjacentNoneTextNode(startnode);
|
||||
prevnode = prevnodeobj[0];
|
||||
var lenoffset = prevnodeobj[1];
|
||||
if(prevnode){
|
||||
atmrange.moveToElementText(prevnode);
|
||||
atmrange.collapse(false);
|
||||
}else{
|
||||
atmrange.moveToElementText(parentNode);
|
||||
}
|
||||
atmrange.setEndPoint(cmpstr, range);
|
||||
startOffset = atmrange.text.length-lenoffset;
|
||||
|
||||
return false;
|
||||
}
|
||||
// }catch(e){ debugger }
|
||||
lastNode = node;
|
||||
return true;
|
||||
});
|
||||
}else{
|
||||
startnode = parentNode;
|
||||
startOffset = 0;
|
||||
}
|
||||
|
||||
//if at the end of startnode and we are dealing with start container, then
|
||||
//move the startnode to nextSibling if it is a text node
|
||||
//TODO: do this for end container?
|
||||
if(!end && startnode.nodeType == 1 && startOffset == startnode.childNodes.length){
|
||||
var nextnode=startnode.nextSibling;
|
||||
if(nextnode && nextnode.nodeType == 3){
|
||||
startnode = nextnode;
|
||||
startOffset = 0;
|
||||
}
|
||||
}
|
||||
return [startnode, startOffset];
|
||||
},
|
||||
setEndPoint: function(range, container, offset){
|
||||
//text node
|
||||
var atmrange = range.duplicate(), node, len;
|
||||
if(container.nodeType!=3){ //normal node
|
||||
if(offset > 0){
|
||||
node = container.childNodes[offset-1];
|
||||
if(node){
|
||||
if(node.nodeType == 3){
|
||||
container = node;
|
||||
offset = node.length;
|
||||
//pass through
|
||||
}else{
|
||||
if(node.nextSibling && node.nextSibling.nodeType == 3){
|
||||
container=node.nextSibling;
|
||||
offset=0;
|
||||
//pass through
|
||||
}else{
|
||||
atmrange.moveToElementText(node.nextSibling?node:container);
|
||||
var parent = node.parentNode;
|
||||
var tempNode = parent.insertBefore(node.ownerDocument.createTextNode(' '), node.nextSibling);
|
||||
atmrange.collapse(false);
|
||||
parent.removeChild(tempNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
}else{
|
||||
atmrange.moveToElementText(container);
|
||||
atmrange.collapse(true);
|
||||
}
|
||||
}
|
||||
if(container.nodeType == 3){
|
||||
var prevnodeobj = dijit.range.adjacentNoneTextNode(container);
|
||||
var prevnode = prevnodeobj[0];
|
||||
len = prevnodeobj[1];
|
||||
if(prevnode){
|
||||
atmrange.moveToElementText(prevnode);
|
||||
atmrange.collapse(false);
|
||||
//if contentEditable is not inherit, the above collapse won't make the end point
|
||||
//in the correctly position: it always has a -1 offset, so compensate it
|
||||
if(prevnode.contentEditable!='inherit'){
|
||||
len++;
|
||||
}
|
||||
}else{
|
||||
atmrange.moveToElementText(container.parentNode);
|
||||
atmrange.collapse(true);
|
||||
}
|
||||
|
||||
offset += len;
|
||||
if(offset>0){
|
||||
if(atmrange.move('character',offset) != offset){
|
||||
console.error('Error when moving!');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return atmrange;
|
||||
},
|
||||
decomposeTextRange: function(range){
|
||||
var tmpary = dijit.range.ie.getEndPoint(range);
|
||||
var startContainer = tmpary[0], startOffset = tmpary[1];
|
||||
var endContainer = tmpary[0], endOffset = tmpary[1];
|
||||
|
||||
if(range.htmlText.length){
|
||||
if(range.htmlText == range.text){ //in the same text node
|
||||
endOffset = startOffset+range.text.length;
|
||||
}else{
|
||||
tmpary = dijit.range.ie.getEndPoint(range,true);
|
||||
endContainer = tmpary[0], endOffset = tmpary[1];
|
||||
// if(startContainer.tagName == "BODY"){
|
||||
// startContainer = startContainer.firstChild;
|
||||
// }
|
||||
}
|
||||
}
|
||||
return [startContainer, startOffset, endContainer, endOffset];
|
||||
},
|
||||
setRange: function(range, startContainer,
|
||||
startOffset, endContainer, endOffset, collapsed){
|
||||
var start=dijit.range.ie.setEndPoint(range, startContainer, startOffset);
|
||||
|
||||
range.setEndPoint('StartToStart',start);
|
||||
if(!collapsed){
|
||||
var end=dijit.range.ie.setEndPoint(range, endContainer, endOffset);
|
||||
}
|
||||
range.setEndPoint('EndToEnd',end || start);
|
||||
|
||||
return range;
|
||||
}
|
||||
}
|
||||
|
||||
dojo.declare("dijit.range.W3CRange",null, {
|
||||
constructor: function(){
|
||||
if(arguments.length>0){
|
||||
this.setStart(arguments[0][0],arguments[0][1]);
|
||||
this.setEnd(arguments[0][2],arguments[0][3]);
|
||||
}else{
|
||||
this.commonAncestorContainer = null;
|
||||
this.startContainer = null;
|
||||
this.startOffset = 0;
|
||||
this.endContainer = null;
|
||||
this.endOffset = 0;
|
||||
this.collapsed = true;
|
||||
}
|
||||
},
|
||||
_updateInternal: function(){
|
||||
if(this.startContainer !== this.endContainer){
|
||||
this.commonAncestorContainer = dijit.range.getCommonAncestor(this.startContainer, this.endContainer);
|
||||
}else{
|
||||
this.commonAncestorContainer = this.startContainer;
|
||||
}
|
||||
this.collapsed = (this.startContainer === this.endContainer) && (this.startOffset == this.endOffset);
|
||||
},
|
||||
setStart: function(node, offset){
|
||||
offset=parseInt(offset);
|
||||
if(this.startContainer === node && this.startOffset == offset){
|
||||
return;
|
||||
}
|
||||
delete this._cachedBookmark;
|
||||
|
||||
this.startContainer = node;
|
||||
this.startOffset = offset;
|
||||
if(!this.endContainer){
|
||||
this.setEnd(node, offset);
|
||||
}else{
|
||||
this._updateInternal();
|
||||
}
|
||||
},
|
||||
setEnd: function(node, offset){
|
||||
offset=parseInt(offset);
|
||||
if(this.endContainer === node && this.endOffset == offset){
|
||||
return;
|
||||
}
|
||||
delete this._cachedBookmark;
|
||||
|
||||
this.endContainer = node;
|
||||
this.endOffset = offset;
|
||||
if(!this.startContainer){
|
||||
this.setStart(node, offset);
|
||||
}else{
|
||||
this._updateInternal();
|
||||
}
|
||||
},
|
||||
setStartAfter: function(node, offset){
|
||||
this._setPoint('setStart', node, offset, 1);
|
||||
},
|
||||
setStartBefore: function(node, offset){
|
||||
this._setPoint('setStart', node, offset, 0);
|
||||
},
|
||||
setEndAfter: function(node, offset){
|
||||
this._setPoint('setEnd', node, offset, 1);
|
||||
},
|
||||
setEndBefore: function(node, offset){
|
||||
this._setPoint('setEnd', node, offset, 0);
|
||||
},
|
||||
_setPoint: function(what, node, offset, ext){
|
||||
var index = dijit.range.getIndex(node, node.parentNode).o;
|
||||
this[what](node.parentNode, index.pop()+ext);
|
||||
},
|
||||
_getIERange: function(){
|
||||
var r = (this._body || this.endContainer.ownerDocument.body).createTextRange();
|
||||
dijit.range.ie.setRange(r, this.startContainer, this.startOffset, this.endContainer, this.endOffset, this.collapsed);
|
||||
return r;
|
||||
},
|
||||
getBookmark: function(body){
|
||||
this._getIERange();
|
||||
return this._cachedBookmark;
|
||||
},
|
||||
_select: function(){
|
||||
var r = this._getIERange();
|
||||
r.select();
|
||||
},
|
||||
deleteContents: function(){
|
||||
var r = this._getIERange();
|
||||
r.pasteHTML('');
|
||||
this.endContainer = this.startContainer;
|
||||
this.endOffset = this.startOffset;
|
||||
this.collapsed = true;
|
||||
},
|
||||
cloneRange: function(){
|
||||
var r = new dijit.range.W3CRange([this.startContainer,this.startOffset,
|
||||
this.endContainer,this.endOffset]);
|
||||
r._body = this._body;
|
||||
return r;
|
||||
},
|
||||
detach: function(){
|
||||
this._body = null;
|
||||
this.commonAncestorContainer = null;
|
||||
this.startContainer = null;
|
||||
this.startOffset = 0;
|
||||
this.endContainer = null;
|
||||
this.endOffset = 0;
|
||||
this.collapsed = true;
|
||||
}
|
||||
this.rangeCount=this._ranges.length;
|
||||
};
|
||||
this.removeAllRanges=function(){
|
||||
this._ranges=[];
|
||||
this.rangeCount=0;
|
||||
};
|
||||
var _2c=function(){
|
||||
var r=win.document.selection.createRange();
|
||||
var _2d=win.document.selection.type.toUpperCase();
|
||||
if(_2d=="CONTROL"){
|
||||
return new dijit.range.W3CRange(dijit.range.ie.decomposeControlRange(r));
|
||||
}else{
|
||||
return new dijit.range.W3CRange(dijit.range.ie.decomposeTextRange(r));
|
||||
}
|
||||
};
|
||||
this.getRangeAt=function(i){
|
||||
return this._ranges[i];
|
||||
};
|
||||
this._getCurrentSelection=function(){
|
||||
this.removeAllRanges();
|
||||
var r=_2c();
|
||||
if(r){
|
||||
this.addRange(r,true);
|
||||
}
|
||||
};
|
||||
},decomposeControlRange:function(_2e){
|
||||
var _2f=_2e.item(0),_30=_2e.item(_2e.length-1);
|
||||
var _31=_2f.parentNode,_32=_30.parentNode;
|
||||
var _33=dijit.range.getIndex(_2f,_31).o;
|
||||
var _34=dijit.range.getIndex(_30,_32).o+1;
|
||||
return [_31,_33,_32,_34];
|
||||
},getEndPoint:function(_35,end){
|
||||
var _36=_35.duplicate();
|
||||
_36.collapse(!end);
|
||||
var _37="EndTo"+(end?"End":"Start");
|
||||
var _38=_36.parentElement();
|
||||
var _39,_3a,_3b;
|
||||
if(_38.childNodes.length>0){
|
||||
dojo.every(_38.childNodes,function(_3c,i){
|
||||
var _3d;
|
||||
if(_3c.nodeType!=3){
|
||||
_36.moveToElementText(_3c);
|
||||
if(_36.compareEndPoints(_37,_35)>0){
|
||||
if(_3b&&_3b.nodeType==3){
|
||||
_39=_3b;
|
||||
_3d=true;
|
||||
}else{
|
||||
_39=_38;
|
||||
_3a=i;
|
||||
return false;
|
||||
}
|
||||
}else{
|
||||
if(i==_38.childNodes.length-1){
|
||||
_39=_38;
|
||||
_3a=_38.childNodes.length;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}else{
|
||||
if(i==_38.childNodes.length-1){
|
||||
_39=_3c;
|
||||
_3d=true;
|
||||
}
|
||||
}
|
||||
if(_3d&&_39){
|
||||
var _3e=dijit.range.adjacentNoneTextNode(_39)[0];
|
||||
if(_3e){
|
||||
_39=_3e.nextSibling;
|
||||
}else{
|
||||
_39=_38.firstChild;
|
||||
}
|
||||
var _3f=dijit.range.adjacentNoneTextNode(_39);
|
||||
_3e=_3f[0];
|
||||
var _40=_3f[1];
|
||||
if(_3e){
|
||||
_36.moveToElementText(_3e);
|
||||
_36.collapse(false);
|
||||
}else{
|
||||
_36.moveToElementText(_38);
|
||||
}
|
||||
_36.setEndPoint(_37,_35);
|
||||
_3a=_36.text.length-_40;
|
||||
return false;
|
||||
}
|
||||
_3b=_3c;
|
||||
return true;
|
||||
});
|
||||
}else{
|
||||
_39=_38;
|
||||
_3a=0;
|
||||
}
|
||||
if(!end&&_39.nodeType==1&&_3a==_39.childNodes.length){
|
||||
var _41=_39.nextSibling;
|
||||
if(_41&&_41.nodeType==3){
|
||||
_39=_41;
|
||||
_3a=0;
|
||||
}
|
||||
}
|
||||
return [_39,_3a];
|
||||
},setEndPoint:function(_42,_43,_44){
|
||||
var _45=_42.duplicate(),_46,len;
|
||||
if(_43.nodeType!=3){
|
||||
if(_44>0){
|
||||
_46=_43.childNodes[_44-1];
|
||||
if(_46){
|
||||
if(_46.nodeType==3){
|
||||
_43=_46;
|
||||
_44=_46.length;
|
||||
}else{
|
||||
if(_46.nextSibling&&_46.nextSibling.nodeType==3){
|
||||
_43=_46.nextSibling;
|
||||
_44=0;
|
||||
}else{
|
||||
_45.moveToElementText(_46.nextSibling?_46:_43);
|
||||
var _47=_46.parentNode;
|
||||
var _48=_47.insertBefore(_46.ownerDocument.createTextNode(" "),_46.nextSibling);
|
||||
_45.collapse(false);
|
||||
_47.removeChild(_48);
|
||||
}
|
||||
}
|
||||
}
|
||||
}else{
|
||||
_45.moveToElementText(_43);
|
||||
_45.collapse(true);
|
||||
}
|
||||
}
|
||||
if(_43.nodeType==3){
|
||||
var _49=dijit.range.adjacentNoneTextNode(_43);
|
||||
var _4a=_49[0];
|
||||
len=_49[1];
|
||||
if(_4a){
|
||||
_45.moveToElementText(_4a);
|
||||
_45.collapse(false);
|
||||
if(_4a.contentEditable!="inherit"){
|
||||
len++;
|
||||
}
|
||||
}else{
|
||||
_45.moveToElementText(_43.parentNode);
|
||||
_45.collapse(true);
|
||||
}
|
||||
_44+=len;
|
||||
if(_44>0){
|
||||
if(_45.move("character",_44)!=_44){
|
||||
console.error("Error when moving!");
|
||||
}
|
||||
}
|
||||
}
|
||||
return _45;
|
||||
},decomposeTextRange:function(_4b){
|
||||
var _4c=dijit.range.ie.getEndPoint(_4b);
|
||||
var _4d=_4c[0],_4e=_4c[1];
|
||||
var _4f=_4c[0],_50=_4c[1];
|
||||
if(_4b.htmlText.length){
|
||||
if(_4b.htmlText==_4b.text){
|
||||
_50=_4e+_4b.text.length;
|
||||
}else{
|
||||
_4c=dijit.range.ie.getEndPoint(_4b,true);
|
||||
_4f=_4c[0],_50=_4c[1];
|
||||
}
|
||||
}
|
||||
return [_4d,_4e,_4f,_50];
|
||||
},setRange:function(_51,_52,_53,_54,_55,_56){
|
||||
var _57=dijit.range.ie.setEndPoint(_51,_52,_53);
|
||||
_51.setEndPoint("StartToStart",_57);
|
||||
if(!_56){
|
||||
var end=dijit.range.ie.setEndPoint(_51,_54,_55);
|
||||
}
|
||||
_51.setEndPoint("EndToEnd",end||_57);
|
||||
return _51;
|
||||
}};
|
||||
dojo.declare("dijit.range.W3CRange",null,{constructor:function(){
|
||||
if(arguments.length>0){
|
||||
this.setStart(arguments[0][0],arguments[0][1]);
|
||||
this.setEnd(arguments[0][2],arguments[0][3]);
|
||||
}else{
|
||||
this.commonAncestorContainer=null;
|
||||
this.startContainer=null;
|
||||
this.startOffset=0;
|
||||
this.endContainer=null;
|
||||
this.endOffset=0;
|
||||
this.collapsed=true;
|
||||
}
|
||||
},_updateInternal:function(){
|
||||
if(this.startContainer!==this.endContainer){
|
||||
this.commonAncestorContainer=dijit.range.getCommonAncestor(this.startContainer,this.endContainer);
|
||||
}else{
|
||||
this.commonAncestorContainer=this.startContainer;
|
||||
}
|
||||
this.collapsed=(this.startContainer===this.endContainer)&&(this.startOffset==this.endOffset);
|
||||
},setStart:function(_58,_59){
|
||||
_59=parseInt(_59);
|
||||
if(this.startContainer===_58&&this.startOffset==_59){
|
||||
return;
|
||||
}
|
||||
delete this._cachedBookmark;
|
||||
this.startContainer=_58;
|
||||
this.startOffset=_59;
|
||||
if(!this.endContainer){
|
||||
this.setEnd(_58,_59);
|
||||
}else{
|
||||
this._updateInternal();
|
||||
}
|
||||
},setEnd:function(_5a,_5b){
|
||||
_5b=parseInt(_5b);
|
||||
if(this.endContainer===_5a&&this.endOffset==_5b){
|
||||
return;
|
||||
}
|
||||
delete this._cachedBookmark;
|
||||
this.endContainer=_5a;
|
||||
this.endOffset=_5b;
|
||||
if(!this.startContainer){
|
||||
this.setStart(_5a,_5b);
|
||||
}else{
|
||||
this._updateInternal();
|
||||
}
|
||||
},setStartAfter:function(_5c,_5d){
|
||||
this._setPoint("setStart",_5c,_5d,1);
|
||||
},setStartBefore:function(_5e,_5f){
|
||||
this._setPoint("setStart",_5e,_5f,0);
|
||||
},setEndAfter:function(_60,_61){
|
||||
this._setPoint("setEnd",_60,_61,1);
|
||||
},setEndBefore:function(_62,_63){
|
||||
this._setPoint("setEnd",_62,_63,0);
|
||||
},_setPoint:function(_64,_65,_66,ext){
|
||||
var _67=dijit.range.getIndex(_65,_65.parentNode).o;
|
||||
this[_64](_65.parentNode,_67.pop()+ext);
|
||||
},_getIERange:function(){
|
||||
var r=(this._body||this.endContainer.ownerDocument.body).createTextRange();
|
||||
dijit.range.ie.setRange(r,this.startContainer,this.startOffset,this.endContainer,this.endOffset,this.collapsed);
|
||||
return r;
|
||||
},getBookmark:function(_68){
|
||||
this._getIERange();
|
||||
return this._cachedBookmark;
|
||||
},_select:function(){
|
||||
var r=this._getIERange();
|
||||
r.select();
|
||||
},deleteContents:function(){
|
||||
var r=this._getIERange();
|
||||
r.pasteHTML("");
|
||||
this.endContainer=this.startContainer;
|
||||
this.endOffset=this.startOffset;
|
||||
this.collapsed=true;
|
||||
},cloneRange:function(){
|
||||
var r=new dijit.range.W3CRange([this.startContainer,this.startOffset,this.endContainer,this.endOffset]);
|
||||
r._body=this._body;
|
||||
return r;
|
||||
},detach:function(){
|
||||
this._body=null;
|
||||
this.commonAncestorContainer=null;
|
||||
this.startContainer=null;
|
||||
this.startOffset=0;
|
||||
this.endContainer=null;
|
||||
this.endOffset=0;
|
||||
this.collapsed=true;
|
||||
}});
|
||||
}
|
||||
} //if(!dijit.range._w3c)
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user