亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? fckdomrange.js

?? BugNET is an issue tracking and project issue management solution built using the ASP.NET web applic
?? JS
?? 第 1 頁 / 共 2 頁
字號:
?/*
 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
 * Copyright (C) 2003-2008 Frederico Caldeira Knabben
 *
 * == BEGIN LICENSE ==
 *
 * Licensed under the terms of any of the following licenses at your
 * choice:
 *
 *  - GNU General Public License Version 2 or later (the "GPL")
 *    http://www.gnu.org/licenses/gpl.html
 *
 *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
 *    http://www.gnu.org/licenses/lgpl.html
 *
 *  - Mozilla Public License Version 1.1 or later (the "MPL")
 *    http://www.mozilla.org/MPL/MPL-1.1.html
 *
 * == END LICENSE ==
 *
 * Class for working with a selection range, much like the W3C DOM Range, but
 * it is not intended to be an implementation of the W3C interface.
 */

var FCKDomRange = function( sourceWindow )
{
	this.Window = sourceWindow ;
	this._Cache = {} ;
}

FCKDomRange.prototype =
{

	_UpdateElementInfo : function()
	{
		var innerRange = this._Range ;

		if ( !innerRange )
			this.Release( true ) ;
		else
		{
			// For text nodes, the node itself is the StartNode.
			var eStart	= innerRange.startContainer ;

			var oElementPath = new FCKElementPath( eStart ) ;
			this.StartNode			= eStart.nodeType == 3 ? eStart : eStart.childNodes[ innerRange.startOffset ] ;
			this.StartContainer		= eStart ;
			this.StartBlock			= oElementPath.Block ;
			this.StartBlockLimit	= oElementPath.BlockLimit ;

			if ( innerRange.collapsed )
			{
				this.EndNode		= this.StartNode ;
				this.EndContainer	= this.StartContainer ;
				this.EndBlock		= this.StartBlock ;
				this.EndBlockLimit	= this.StartBlockLimit ;
			}
			else
			{
				var eEnd	= innerRange.endContainer ;

				if ( eStart != eEnd )
					oElementPath = new FCKElementPath( eEnd ) ;

				// The innerRange.endContainer[ innerRange.endOffset ] is not
				// usually part of the range, but the marker for the range end. So,
				// let's get the previous available node as the real end.
				var eEndNode = eEnd ;
				if ( innerRange.endOffset == 0 )
				{
					while ( eEndNode && !eEndNode.previousSibling )
						eEndNode = eEndNode.parentNode ;

					if ( eEndNode )
						eEndNode = eEndNode.previousSibling ;
				}
				else if ( eEndNode.nodeType == 1 )
					eEndNode = eEndNode.childNodes[ innerRange.endOffset - 1 ] ;

				this.EndNode			= eEndNode ;
				this.EndContainer		= eEnd ;
				this.EndBlock			= oElementPath.Block ;
				this.EndBlockLimit		= oElementPath.BlockLimit ;
			}
		}

		this._Cache = {} ;
	},

	CreateRange : function()
	{
		return new FCKW3CRange( this.Window.document ) ;
	},

	DeleteContents : function()
	{
		if ( this._Range )
		{
			this._Range.deleteContents() ;
			this._UpdateElementInfo() ;
		}
	},

	ExtractContents : function()
	{
		if ( this._Range )
		{
			var docFrag = this._Range.extractContents() ;
			this._UpdateElementInfo() ;
			return docFrag ;
		}
		return null ;
	},

	CheckIsCollapsed : function()
	{
		if ( this._Range )
			return this._Range.collapsed ;

		return false ;
	},

	Collapse : function( toStart )
	{
		if ( this._Range )
			this._Range.collapse( toStart ) ;

		this._UpdateElementInfo() ;
	},

	Clone : function()
	{
		var oClone = FCKTools.CloneObject( this ) ;

		if ( this._Range )
			oClone._Range = this._Range.cloneRange() ;

		return oClone ;
	},

	MoveToNodeContents : function( targetNode )
	{
		if ( !this._Range )
			this._Range = this.CreateRange() ;

		this._Range.selectNodeContents( targetNode ) ;

		this._UpdateElementInfo() ;
	},

	MoveToElementStart : function( targetElement )
	{
		this.SetStart(targetElement,1) ;
		this.SetEnd(targetElement,1) ;
	},

	// Moves to the first editing point inside a element. For example, in a
	// element tree like "<p><b><i></i></b> Text</p>", the start editing point
	// is "<p><b><i>^</i></b> Text</p>" (inside <i>).
	MoveToElementEditStart : function( targetElement )
	{
		var editableElement ;

		while ( targetElement && targetElement.nodeType == 1 )
		{
			if ( FCKDomTools.CheckIsEditable( targetElement ) )
				editableElement = targetElement ;
			else if ( editableElement )
				break ;		// If we already found an editable element, stop the loop.

			targetElement = targetElement.firstChild ;
		}

		if ( editableElement )
			this.MoveToElementStart( editableElement ) ;
	},

	InsertNode : function( node )
	{
		if ( this._Range )
			this._Range.insertNode( node ) ;
	},

	CheckIsEmpty : function()
	{
		if ( this.CheckIsCollapsed() )
			return true ;

		// Inserts the contents of the range in a div tag.
		var eToolDiv = this.Window.document.createElement( 'div' ) ;
		this._Range.cloneContents().AppendTo( eToolDiv ) ;

		FCKDomTools.TrimNode( eToolDiv ) ;

		return ( eToolDiv.innerHTML.length == 0 ) ;
	},

	/**
	 * Checks if the start boundary of the current range is "visually" (like a
	 * selection caret) at the beginning of the block. It means that some
	 * things could be brefore the range, like spaces or empty inline elements,
	 * but it would still be considered at the beginning of the block.
	 */
	CheckStartOfBlock : function()
	{
		var cache = this._Cache ;
		var bIsStartOfBlock = cache.IsStartOfBlock ;

		if ( bIsStartOfBlock != undefined )
			return bIsStartOfBlock ;

		// Take the block reference.
		var block = this.StartBlock || this.StartBlockLimit ;

		var container	= this._Range.startContainer ;
		var offset		= this._Range.startOffset ;
		var currentNode ;

		if ( offset > 0 )
		{
			// First, check the start container. If it is a text node, get the
			// substring of the node value before the range offset.
			if ( container.nodeType == 3 )
			{
				var textValue = container.nodeValue.substr( 0, offset ).Trim() ;

				// If we have some text left in the container, we are not at
				// the end for the block.
				if ( textValue.length != 0 )
					return cache.IsStartOfBlock = false ;
			}
			else
				currentNode = container.childNodes[ offset - 1 ] ;
		}

		// We'll not have a currentNode if the container was a text node, or
		// the offset is zero.
		if ( !currentNode )
			currentNode = FCKDomTools.GetPreviousSourceNode( container, true, null, block ) ;

		while ( currentNode )
		{
			switch ( currentNode.nodeType )
			{
				case 1 :
					// It's not an inline element.
					if ( !FCKListsLib.InlineChildReqElements[ currentNode.nodeName.toLowerCase() ] )
						return cache.IsStartOfBlock = false ;

					break ;

				case 3 :
					// It's a text node with real text.
					if ( currentNode.nodeValue.Trim().length > 0 )
						return cache.IsStartOfBlock = false ;
			}

			currentNode = FCKDomTools.GetPreviousSourceNode( currentNode, false, null, block ) ;
		}

		return cache.IsStartOfBlock = true ;
	},

	/**
	 * Checks if the end boundary of the current range is "visually" (like a
	 * selection caret) at the end of the block. It means that some things
	 * could be after the range, like spaces, empty inline elements, or a
	 * single <br>, but it would still be considered at the end of the block.
	 */
	CheckEndOfBlock : function( refreshSelection )
	{
		var isEndOfBlock = this._Cache.IsEndOfBlock ;

		if ( isEndOfBlock != undefined )
			return isEndOfBlock ;

		// Take the block reference.
		var block = this.EndBlock || this.EndBlockLimit ;

		var container	= this._Range.endContainer ;
		var offset			= this._Range.endOffset ;
		var currentNode ;

		// First, check the end container. If it is a text node, get the
		// substring of the node value after the range offset.
		if ( container.nodeType == 3 )
		{
			var textValue = container.nodeValue ;
			if ( offset < textValue.length )
			{
				textValue = textValue.substr( offset ) ;

				// If we have some text left in the container, we are not at
				// the end for the block.
				if ( textValue.Trim().length != 0 )
					return this._Cache.IsEndOfBlock = false ;
			}
		}
		else
			currentNode = container.childNodes[ offset ] ;

		// We'll not have a currentNode if the container was a text node, of
		// the offset is out the container children limits (after it probably).
		if ( !currentNode )
			currentNode = FCKDomTools.GetNextSourceNode( container, true, null, block ) ;

		var hadBr = false ;

		while ( currentNode )
		{
			switch ( currentNode.nodeType )
			{
				case 1 :
					var nodeName = currentNode.nodeName.toLowerCase() ;

					// It's an inline element.
					if ( FCKListsLib.InlineChildReqElements[ nodeName ] )
						break ;

					// It is the first <br> found.
					if ( nodeName == 'br' && !hadBr )
					{
						hadBr = true ;
						break ;
					}

					return this._Cache.IsEndOfBlock = false ;

				case 3 :
					// It's a text node with real text.
					if ( currentNode.nodeValue.Trim().length > 0 )
						return this._Cache.IsEndOfBlock = false ;
			}

			currentNode = FCKDomTools.GetNextSourceNode( currentNode, false, null, block ) ;
		}

		if ( refreshSelection )
			this.Select() ;

		return this._Cache.IsEndOfBlock = true ;
	},

	// This is an "intrusive" way to create a bookmark. It includes <span> tags
	// in the range boundaries. The advantage of it is that it is possible to
	// handle DOM mutations when moving back to the bookmark.
	// Attention: the inclusion of nodes in the DOM is a design choice and
	// should not be changed as there are other points in the code that may be
	// using those nodes to perform operations. See GetBookmarkNode.
	// For performance, includeNodes=true if intended to SelectBookmark.
	CreateBookmark : function( includeNodes )
	{
		// Create the bookmark info (random IDs).
		var oBookmark =
		{
			StartId	: (new Date()).valueOf() + Math.floor(Math.random()*1000) + 'S',
			EndId	: (new Date()).valueOf() + Math.floor(Math.random()*1000) + 'E'
		} ;

		var oDoc = this.Window.document ;
		var eStartSpan ;
		var eEndSpan ;
		var oClone ;

		// For collapsed ranges, add just the start marker.
		if ( !this.CheckIsCollapsed() )
		{
			eEndSpan = oDoc.createElement( 'span' ) ;
			eEndSpan.style.display = 'none' ;
			eEndSpan.id = oBookmark.EndId ;
			eEndSpan.setAttribute( '_fck_bookmark', true ) ;

			// For IE, it must have something inside, otherwise it may be
			// removed during DOM operations.
//			if ( FCKBrowserInfo.IsIE )
				eEndSpan.innerHTML = '&nbsp;' ;

			oClone = this.Clone() ;
			oClone.Collapse( false ) ;
			oClone.InsertNode( eEndSpan ) ;
		}

		eStartSpan = oDoc.createElement( 'span' ) ;
		eStartSpan.style.display = 'none' ;
		eStartSpan.id = oBookmark.StartId ;
		eStartSpan.setAttribute( '_fck_bookmark', true ) ;

		// For IE, it must have something inside, otherwise it may be removed
		// during DOM operations.
//		if ( FCKBrowserInfo.IsIE )
			eStartSpan.innerHTML = '&nbsp;' ;

		oClone = this.Clone() ;
		oClone.Collapse( true ) ;
		oClone.InsertNode( eStartSpan ) ;

		if ( includeNodes )
		{
			oBookmark.StartNode = eStartSpan ;
			oBookmark.EndNode = eEndSpan ;
		}

		// Update the range position.
		if ( eEndSpan )
		{
			this.SetStart( eStartSpan, 4 ) ;
			this.SetEnd( eEndSpan, 3 ) ;
		}
		else
			this.MoveToPosition( eStartSpan, 4 ) ;

		return oBookmark ;
	},

	// This one should be a part of a hypothetic "bookmark" object.
	GetBookmarkNode : function( bookmark, start )
	{
		var doc = this.Window.document ;

		if ( start )
			return bookmark.StartNode || doc.getElementById( bookmark.StartId ) ;
		else
			return bookmark.EndNode || doc.getElementById( bookmark.EndId ) ;
	},

	MoveToBookmark : function( bookmark, preserveBookmark )
	{
		var eStartSpan	= this.GetBookmarkNode( bookmark, true ) ;
		var eEndSpan	= this.GetBookmarkNode( bookmark, false ) ;

		this.SetStart( eStartSpan, 3 ) ;

		if ( !preserveBookmark )
			FCKDomTools.RemoveNode( eStartSpan ) ;

		// If collapsed, the end span will not be available.
		if ( eEndSpan )
		{
			this.SetEnd( eEndSpan, 3 ) ;

			if ( !preserveBookmark )
				FCKDomTools.RemoveNode( eEndSpan ) ;
		}
		else
			this.Collapse( true ) ;

		this._UpdateElementInfo() ;
	},

	// Non-intrusive bookmark algorithm
	CreateBookmark2 : function()
	{
		// If there is no range then get out of here.
		// It happens on initial load in Safari #962 and if the editor it's hidden also in Firefox
		if ( ! this._Range )
			return { "Start" : 0, "End" : 0 } ;

		// First, we record down the offset values
		var bookmark =
		{
			"Start" : [ this._Range.startOffset ],
			"End" : [ this._Range.endOffset ]
		} ;
		// Since we're treating the document tree as normalized, we need to backtrack the text lengths
		// of previous text nodes into the offset value.
		var curStart = this._Range.startContainer.previousSibling ;
		var curEnd = this._Range.endContainer.previousSibling ;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人欧美一区二区三区白人 | 欧美日韩二区三区| 欧美一区二区免费观在线| 国产女人18毛片水真多成人如厕| 午夜视频久久久久久| 91麻豆自制传媒国产之光| 欧美r级电影在线观看| 亚洲自拍偷拍欧美| 成人激情小说乱人伦| 日韩午夜中文字幕| 亚洲第一成人在线| 一本久久a久久免费精品不卡| 精品国精品自拍自在线| 亚洲成人1区2区| 91激情在线视频| 中文字幕一区二区三区精华液 | 久久91精品国产91久久小草| 欧洲人成人精品| 亚洲欧美另类小说| yourporn久久国产精品| 国产欧美一区二区精品性色| 国产乱码精品一区二区三区五月婷| 国产精品久久久久国产精品日日| 男男视频亚洲欧美| 欧美一区二区三区四区视频| 亚洲成a人在线观看| 欧美日本高清视频在线观看| 亚洲免费伊人电影| 欧美亚州韩日在线看免费版国语版| 中文字幕永久在线不卡| 91一区一区三区| 亚洲精品视频在线观看网站| 色偷偷88欧美精品久久久| 亚洲男女一区二区三区| 欧美丝袜丝交足nylons图片| 夜夜嗨av一区二区三区网页| 欧美亚洲综合另类| 日韩国产高清在线| 精品美女在线播放| 国产jizzjizz一区二区| 国产精品传媒在线| 日本道色综合久久| 视频一区欧美日韩| 久久久久久久久免费| 成人av电影在线| 一区二区三区精品在线观看| 欧美久久一区二区| 久久激五月天综合精品| 中文字幕久久午夜不卡| 色婷婷亚洲一区二区三区| 亚洲国产日韩a在线播放性色| 欧美另类久久久品| 韩国av一区二区| 国产精品麻豆视频| 欧美高清视频一二三区| 极品美女销魂一区二区三区| 《视频一区视频二区| 欧美三级日韩三级| 国产乱子伦一区二区三区国色天香| 欧美韩国日本不卡| 欧美亚洲一区二区在线观看| 麻豆精品国产传媒mv男同| 中文字幕乱码久久午夜不卡 | 婷婷开心激情综合| 久久精品人人做人人综合 | 欧美va日韩va| 白白色 亚洲乱淫| 日本一道高清亚洲日美韩| 久久精品一区二区三区不卡| 欧美专区亚洲专区| 成人精品免费视频| 奇米精品一区二区三区四区 | 国产精品麻豆一区二区| 欧美日本一区二区| av一区二区三区四区| 日本韩国欧美三级| 国产一区二区精品久久99| 亚洲乱码一区二区三区在线观看| 日韩一级成人av| 色悠悠亚洲一区二区| 激情综合网激情| 五月天亚洲精品| 中文字幕一区二区三区在线观看 | 国产成人综合精品三级| 一区二区三区四区不卡在线| www成人在线观看| 欧美日本在线看| 91丨porny丨蝌蚪视频| 国产一区二区在线影院| 日韩制服丝袜av| 亚洲一卡二卡三卡四卡五卡| 欧美国产精品v| 久久综合精品国产一区二区三区 | 免费成人美女在线观看| 亚洲天堂2014| 国产精品午夜免费| 久久久久久电影| 精品捆绑美女sm三区| 欧美一区午夜精品| 69久久夜色精品国产69蝌蚪网| 91老司机福利 在线| 91在线云播放| 欧美激情一区三区| 精品久久久久久亚洲综合网| 91精品免费观看| 在线不卡中文字幕| 精品视频资源站| 欧美人与性动xxxx| 欧美日韩久久久久久| 欧美视频一二三区| 欧美夫妻性生活| 欧美大肚乱孕交hd孕妇| 日韩亚洲欧美在线观看| 日韩三级在线观看| 欧美成人一区二区| 欧美xxxxxxxxx| 26uuu欧美| 中文字幕av免费专区久久| 中文字幕+乱码+中文字幕一区| 国产欧美一区二区精品性色超碰| 日本一区二区视频在线观看| 中文字幕av一区二区三区高 | 欧美唯美清纯偷拍| 欧美久久免费观看| 精品国产精品一区二区夜夜嗨| 精品少妇一区二区三区视频免付费| 欧美v日韩v国产v| 亚洲国产高清不卡| 亚洲欧美偷拍卡通变态| 一区二区在线观看免费视频播放| 亚洲一卡二卡三卡四卡五卡| 日本一道高清亚洲日美韩| 韩国中文字幕2020精品| 不卡免费追剧大全电视剧网站| 成人18视频日本| 欧美影视一区在线| 欧美电影精品一区二区| 国产精品美女久久久久久久网站| 亚洲激情成人在线| 九色|91porny| 97久久超碰精品国产| 欧美日韩国产综合一区二区| 欧美成人一区二区三区| 亚洲欧美激情小说另类| 日韩福利电影在线| 东方aⅴ免费观看久久av| 亚洲欧美在线另类| 午夜精品福利视频网站| 国产精品资源在线看| 色综合久久88色综合天天免费| 欧美另类videos死尸| 国产日韩欧美电影| 日韩avvvv在线播放| 成年人国产精品| 日韩网站在线看片你懂的| 国产精品国产三级国产普通话99| 亚洲成人免费电影| 国产精品一区在线观看乱码| 欧美视频第二页| 国产精品欧美久久久久无广告| 五月婷婷激情综合| 91免费看片在线观看| 久久久久久久网| 天天爽夜夜爽夜夜爽精品视频| 国产aⅴ综合色| 欧美一二三四区在线| 亚洲品质自拍视频| 国产xxx精品视频大全| 91麻豆精品国产91久久久久久| 综合久久久久综合| 国产91清纯白嫩初高中在线观看| 欧美老年两性高潮| 亚洲精品国产一区二区三区四区在线 | 麻豆成人久久精品二区三区红| bt7086福利一区国产| www国产亚洲精品久久麻豆| 爽好多水快深点欧美视频| 91在线免费播放| 国产亚洲精品7777| 捆绑变态av一区二区三区| 欧美亚洲高清一区二区三区不卡| 国产精品国产三级国产普通话99 | 欧美喷水一区二区| 亚洲色图视频网站| 成人开心网精品视频| 国产亚洲精品资源在线26u| 精品一区二区三区蜜桃| 欧美精品一二三| 亚洲国产精品久久艾草纯爱| 91老司机福利 在线| 亚洲婷婷综合久久一本伊一区| 国产高清不卡一区| 国产日韩三级在线| 美女在线观看视频一区二区| 亚洲精品少妇30p| 99视频在线精品| 日本久久电影网| 一本到不卡免费一区二区| 中文字幕视频一区二区三区久| 国产成人免费网站|