nl_tokens: Returns a TextRange representing the boundary of a TextRange expressed as a node and an offset within that node . This function started out as an optimized version of code found in Tim Cameron Ryan s IERange ( http : // code . google . com / p / ierange / )
pl_tokens: function createBoundaryTextRange ( boundaryPosition , isStart ) { var boundaryNode , boundaryParent , boundaryOffset = boundaryPosition . offset ; var doc = dom . getDocument ( boundaryPosition . <mask> ) ; var workingNode , childNodes , workingRange = doc . body . createTextRange ( ) ; var nodeIsDataNode = dom . isCharacterDataNode ( boundaryPosition . node ) ; if ( nodeIsDataNode ) { boundaryNode = boundaryPosition . node ; boundaryParent = boundaryNode . parentNode ; } else { childNodes = boundaryPosition . node . childNodes ; boundaryNode = ( boundaryOffset < childNodes . length ) ? childNodes [ boundaryOffset ] : null ; boundaryParent = boundaryPosition . node ; } // Position the range immediately before the node containing the boundary workingNode = doc . createElement ( "span" ) ; // Making the working element non-empty element persuades IE to consider the TextRange boundary to be within the // element rather than immediately before or after it, which is what we want workingNode . innerHTML = "&#feff;" ; // insertBefore is supposed to work like appendChild if the second parameter is null. However, a bug report // for IERange suggests that it can crash the browser: http://code.google.com/p/ierange/issues/detail?id=12 if ( boundaryNode ) { boundaryParent . insertBefore ( workingNode , boundaryNode ) ; } else { boundaryParent . appendChild ( workingNode ) ; } workingRange . moveToElementText ( workingNode ) ; workingRange . collapse ( ! isStart ) ; // Clean up boundaryParent . removeChild ( workingNode ) ; // Move the working range to the text offset, if required if ( nodeIsDataNode ) { workingRange [ isStart ? "moveStart" : "moveEnd" ] ( "character" , boundaryOffset ) ; } return workingRange ; }