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

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

?? fckdomrange.js

?? J2EE——BBS項目
?? JS
字號:
?/*
 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
 * Copyright (C) 2003-2007 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 intented to be an implementation of the W3C interface.
 */

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

FCKDomRange.prototype =
{

	_UpdateElementInfo : function()
	{
		if ( !this._Range )
			this.Release( true ) ;
		else
		{
			var eStart	= this._Range.startContainer ;
			var eEnd	= this._Range.endContainer ;

			var oElementPath = new FCKElementPath( eStart ) ;
			this.StartContainer		= oElementPath.LastElement ;
			this.StartBlock			= oElementPath.Block ;
			this.StartBlockLimit	= oElementPath.BlockLimit ;

			if ( eStart != eEnd )
				oElementPath = new FCKElementPath( eEnd ) ;
			this.EndContainer		= oElementPath.LastElement ;
			this.EndBlock			= oElementPath.Block ;
			this.EndBlockLimit		= oElementPath.BlockLimit ;
		}
	},

	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 ;
		}
	},

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

	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 child ;

		while ( ( child = targetElement.firstChild ) && child.nodeType == 1 && FCKListsLib.EmptyElements[ child.nodeName.toLowerCase() ] == null )
			targetElement = child ;

		this.MoveToElementStart( targetElement ) ;
	},

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

	CheckIsEmpty : function( ignoreEndBRs )
	{
		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, ignoreEndBRs ) ;

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

	CheckStartOfBlock : function()
	{
		// Create a clone of the current range.
		var oTestRange = this.Clone() ;

		// Collapse it to its start point.
		oTestRange.Collapse( true ) ;

		// Move the start boundary to the start of the block.
		oTestRange.SetStart( oTestRange.StartBlock || oTestRange.StartBlockLimit, 1 ) ;

		var bIsStartOfBlock = oTestRange.CheckIsEmpty() ;

		oTestRange.Release() ;

		return bIsStartOfBlock ;
	},

	CheckEndOfBlock : function( refreshSelection )
	{
		// Create a clone of the current range.
		var oTestRange = this.Clone() ;

		// Collapse it to its end point.
		oTestRange.Collapse( false ) ;

		// Move the end boundary to the end of the block.
		oTestRange.SetEnd( oTestRange.EndBlock || oTestRange.EndBlockLimit, 2 ) ;

		var bIsEndOfBlock = oTestRange.CheckIsCollapsed() ;
		
		if ( !bIsEndOfBlock )
		{
			// Inserts the contents of the range in a div tag.
			var eToolDiv = this.Window.document.createElement( 'div' ) ;
			oTestRange._Range.cloneContents().AppendTo( eToolDiv ) ;
			FCKDomTools.TrimNode( eToolDiv, true ) ;
			
			// Find out if we are in an empty tree of inline elements, like <b><i><span></span></i></b>
			bIsEndOfBlock = true ;
			var eLastChild = eToolDiv ;
			while ( ( eLastChild = eLastChild.lastChild ) )
			{
				// Check the following:
				//		1. Is there more than one node in the parents children?
				//		2. Is the node not an element node?
				//		3. Is it not a inline element.
				if ( eLastChild.previousSibling || eLastChild.nodeType != 1 || FCKListsLib.InlineChildReqElements[ eLastChild.nodeName.toLowerCase() ] == null )
				{
					// So we are not in the end of the range.
					bIsEndOfBlock = false ;
					break ;
				}
			}
		}
		
		oTestRange.Release() ;

		if ( refreshSelection )
			this.Select() ;

		return bIsEndOfBlock ;
	},

	CreateBookmark : function()
	{
		// Create the bookmark info (random IDs).
		var oBookmark =
		{
			StartId	: 'fck_dom_range_start_' + (new Date()).valueOf() + '_' + Math.floor(Math.random()*1000),
			EndId	: 'fck_dom_range_end_' + (new Date()).valueOf() + '_' + Math.floor(Math.random()*1000)
		} ;

		var oDoc = this.Window.document ;
		var eSpan ;
		var oClone ;

		// For collapsed ranges, add just the start marker.
		if ( !this.CheckIsCollapsed() )
		{
			eSpan = oDoc.createElement( 'span' ) ;
			eSpan.id = oBookmark.EndId ;
			eSpan.innerHTML = '&nbsp;' ;	// For IE, it must have something inside, otherwise it may be removed during operations.

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

		eSpan = oDoc.createElement( 'span' ) ;
		eSpan.id = oBookmark.StartId ;
		eSpan.innerHTML = '&nbsp;' ;	// For IE, it must have something inside, otherwise it may be removed during operations.

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

		return oBookmark ;
	},

	MoveToBookmark : function( bookmark, preserveBookmark )
	{
		var oDoc = this.Window.document ;

		var eStartSpan	=  oDoc.getElementById( bookmark.StartId ) ;
		var eEndSpan	=  oDoc.getElementById( bookmark.EndId ) ;

		this.SetStart( eStartSpan, 3 ) ;

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

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

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

	/*
	 * Moves the position of the start boundary of the range to a specific position
	 * relatively to a element.
	 *		@position:
	 *			1 = After Start		<target>^contents</target>
	 *			2 = Before End		<target>contents^</target>
	 *			3 = Before Start	^<target>contents</target>
	 *			4 = After End		<target>contents</target>^
	 */
	SetStart : function( targetElement, position )
	{
		var oRange = this._Range ;
		if ( !oRange )
			oRange = this._Range = this.CreateRange() ;

		switch( position )
		{
			case 1 :		// After Start		<target>^contents</target>
				oRange.setStart( targetElement, 0 ) ;
				break ;

			case 2 :		// Before End		<target>contents^</target>
				oRange.setStart( targetElement, targetElement.childNodes.length ) ;
				break ;

			case 3 :		// Before Start		^<target>contents</target>
				oRange.setStartBefore( targetElement ) ;
				break ;

			case 4 :		// After End		<target>contents</target>^
				oRange.setStartAfter( targetElement ) ;
		}
		this._UpdateElementInfo() ;
	},

	/*
	 * Moves the position of the start boundary of the range to a specific position
	 * relatively to a element.
	 *		@position:
	 *			1 = After Start		<target>^contents</target>
	 *			2 = Before End		<target>contents^</target>
	 *			3 = Before Start	^<target>contents</target>
	 *			4 = After End		<target>contents</target>^
	 */
	SetEnd : function( targetElement, position )
	{
		var oRange = this._Range ;
		if ( !oRange )
			oRange = this._Range = this.CreateRange() ;

		switch( position )
		{
			case 1 :		// After Start		<target>^contents</target>
				oRange.setEnd( targetElement, 0 ) ;
				break ;

			case 2 :		// Before End		<target>contents^</target>
				oRange.setEnd( targetElement, targetElement.childNodes.length ) ;
				break ;

			case 3 :		// Before Start		^<target>contents</target>
				oRange.setEndBefore( targetElement ) ;
				break ;

			case 4 :		// After End		<target>contents</target>^
				oRange.setEndAfter( targetElement ) ;
		}
		this._UpdateElementInfo() ;
	},

	Expand : function( unit )
	{
		var oNode, oSibling ;

		switch ( unit )
		{
			case 'block_contents' :
				if ( this.StartBlock )
					this.SetStart( this.StartBlock, 1 ) ;
				else
				{
					// Get the start node for the current range.
					oNode = this._Range.startContainer ;

					// If it is an element, get the current child node for the range (in the offset).
					// If the offset node is not available, the the first one.
					if ( oNode.nodeType == 1 )
					{
						if ( !( oNode = oNode.childNodes[ this._Range.startOffset ] ) )
							oNode = oNode.firstChild ;
					}

					// Not able to defined the current position.
					if ( !oNode )
						return ;

					// We must look for the left boundary, relative to the range
					// start, which is limited by a block element.
					while ( true )
					{
						oSibling = oNode.previousSibling ;

						if ( !oSibling )
						{
							// Continue if we are not yet in the block limit (inside a <b>, for example).
							if ( oNode.parentNode != this.StartBlockLimit )
								oNode = oNode.parentNode ;
							else
								break ;
						}
						else if ( oSibling.nodeType != 1 || !(/^(?:P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|DT|DE)$/).test( oSibling.nodeName.toUpperCase() ) )
						{
							// Continue if the sibling is not a block tag.
							oNode = oSibling ;
						}
						else
							break ;
					}

					this._Range.setStartBefore( oNode ) ;
				}

				if ( this.EndBlock )
					this.SetEnd( this.EndBlock, 2 ) ;
				else
				{
					oNode = this._Range.endContainer ;
					if ( oNode.nodeType == 1 )
						oNode = oNode.childNodes[ this._Range.endOffset ] || oNode.lastChild ;

					if ( !oNode )
						return ;

					// We must look for the right boundary, relative to the range
					// end, which is limited by a block element.
					while ( true )
					{
						oSibling = oNode.nextSibling ;

						if ( !oSibling )
						{
							// Continue if we are not yet in the block limit (inide a <b>, for example).
							if ( oNode.parentNode != this.EndBlockLimit )
								oNode = oNode.parentNode ;
							else
								break ;
						}
						else if ( oSibling.nodeType != 1 || !(/^(?:P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|DT|DE)$/).test( oSibling.nodeName.toUpperCase() ) )
						{
							// Continue if the sibling is not a block tag.
							oNode = oSibling ;
						}
						else
							break ;
					}

					this._Range.setEndAfter( oNode ) ;
				}

				this._UpdateElementInfo() ;
		}
	},

	Release : function( preserveWindow )
	{
		if ( !preserveWindow )
			this.Window = null ;

		this.StartContainer = null ;
		this.StartBlock = null ;
		this.StartBlockLimit = null ;
		this.EndContainer = null ;
		this.EndBlock = null ;
		this.EndBlockLimit = null ;
		this._Range = null ;
	}
} ;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美视频一区在线| 日本一区免费视频| 国产目拍亚洲精品99久久精品| 国产精品日韩成人| 久久成人精品无人区| 91精品办公室少妇高潮对白| 久久久蜜臀国产一区二区| 奇米色一区二区| 欧美视频日韩视频在线观看| 国产日韩欧美a| 精品一区二区三区在线播放视频| 色欧美乱欧美15图片| 日本一区二区成人| 国产一区二区按摩在线观看| 欧美一区二区三区色| 亚洲国产精品久久不卡毛片| 91在线精品秘密一区二区| 久久精品男人天堂av| 久久精品国产第一区二区三区| 欧美丝袜丝交足nylons| 中文字幕在线不卡视频| 国产福利一区二区三区视频| 精品国产污网站| 另类小说色综合网站| 欧美一区二区三区四区视频| 丝袜a∨在线一区二区三区不卡| 在线精品观看国产| 亚洲日本电影在线| 91同城在线观看| 中文字幕亚洲电影| 972aa.com艺术欧美| 亚洲理论在线观看| 91国内精品野花午夜精品| 一区二区三区欧美亚洲| 91看片淫黄大片一级| 一区二区久久久久久| 欧美在线观看视频在线| 亚洲成人1区2区| 91精品一区二区三区在线观看| 亚洲伊人伊色伊影伊综合网| 欧美性一区二区| 青青草精品视频| 精品少妇一区二区三区视频免付费 | 欧美大白屁股肥臀xxxxxx| 日韩成人dvd| 精品成人一区二区三区四区| 激情文学综合网| 国产日产亚洲精品系列| 成人av电影免费观看| 亚洲精品一卡二卡| 在线不卡中文字幕播放| 久久av老司机精品网站导航| 久久五月婷婷丁香社区| 韩国理伦片一区二区三区在线播放| 欧美成人伊人久久综合网| 国产传媒久久文化传媒| 亚洲精品乱码久久久久久久久 | 国产精品2024| 亚洲欧洲无码一区二区三区| 欧美三级日韩三级国产三级| 激情综合五月婷婷| 一区在线播放视频| 91精品国产高清一区二区三区蜜臀| 免费观看日韩av| 亚洲欧洲av在线| 制服丝袜av成人在线看| 丁香六月综合激情| 亚洲成人免费在线观看| 国产偷国产偷亚洲高清人白洁| 一本色道久久综合狠狠躁的推荐| 日本视频免费一区| 国产精品福利一区| 日韩一卡二卡三卡国产欧美| 成人黄色av电影| 老司机免费视频一区二区| 国产精品国产三级国产aⅴ原创| 欧美日韩在线综合| 国产成人在线网站| 日产精品久久久久久久性色 | 亚洲精品一区二区三区四区高清 | 亚洲少妇30p| 日韩区在线观看| 91农村精品一区二区在线| 国模冰冰炮一区二区| 亚洲国产成人精品视频| 中文字幕中文乱码欧美一区二区| 日韩欧美国产不卡| 欧美日韩一区精品| 91女人视频在线观看| 国产99久久久国产精品潘金| 日韩高清在线电影| 亚洲一区二三区| 日韩毛片视频在线看| 国产欧美一区二区在线观看| 91精品国产综合久久久蜜臀粉嫩| 91视频免费播放| 成人一区二区三区视频| 国产在线视视频有精品| 奇米精品一区二区三区四区| 亚洲一区在线视频| 亚洲免费三区一区二区| 中文字幕免费在线观看视频一区| 欧美变态凌虐bdsm| 欧美一区二区三区免费在线看| 欧美性大战久久久| 欧美日韩一级黄| 91国偷自产一区二区开放时间| 99re66热这里只有精品3直播| 国产另类ts人妖一区二区| 久久精品国产一区二区三| 日本午夜精品一区二区三区电影| 亚洲国产精品久久久男人的天堂| 亚洲乱码国产乱码精品精小说| 中文字幕国产一区二区| 日本一区二区动态图| 国产精品免费网站在线观看| 欧美国产在线观看| 中文字幕av在线一区二区三区| 国产精品久久久久久一区二区三区| 欧美精彩视频一区二区三区| 久久久久国产精品麻豆| 国产精品久久久久影视| 亚洲欧洲综合另类| 亚洲一区二区三区中文字幕在线 | 欧美日韩综合不卡| 91精品综合久久久久久| 日韩欧美国产系列| 国产午夜精品美女毛片视频| 国产精品国产精品国产专区不片| 成人欧美一区二区三区白人 | 一区二区三区在线影院| 亚洲成人一区在线| 男人的j进女人的j一区| 国产综合色在线| 91在线视频网址| 91精品中文字幕一区二区三区| 久久综合色播五月| 日韩伦理av电影| 午夜精品久久久久久久久久久| 青青草原综合久久大伊人精品 | 中文字幕一区二区在线播放| 一区二区视频在线| 久久精品国产亚洲a| 国产成人在线看| 一本一本久久a久久精品综合麻豆| 欧美日韩国产色站一区二区三区| 精品久久久三级丝袜| 国产精品麻豆久久久| 日韩电影在线看| jlzzjlzz亚洲日本少妇| 欧美日韩在线电影| 日本一区二区综合亚洲| 亚洲一区二区综合| 国产精品中文欧美| 精品视频123区在线观看| 国产日韩在线不卡| 性做久久久久久| 成人av网站免费观看| 在线观看91av| 国产精品美女一区二区在线观看| 天天综合天天做天天综合| 国产成人免费9x9x人网站视频| 欧美综合天天夜夜久久| 国产日本欧美一区二区| 日日欢夜夜爽一区| 91视频免费观看| 久久久精品免费观看| 亚洲1区2区3区视频| 91免费国产在线| 久久久久成人黄色影片| 日韩激情中文字幕| 色视频欧美一区二区三区| 国产色综合久久| 久久精品国产精品亚洲综合| 欧美日韩免费观看一区三区| 国产精品国产三级国产三级人妇 | 亚洲免费观看在线视频| 国产suv一区二区三区88区| 日韩视频一区在线观看| 一区二区三区美女视频| www.欧美.com| 亚洲国产精品黑人久久久| 狠狠色丁香婷综合久久| 日韩精品自拍偷拍| 日本va欧美va精品| 欧美日韩国产经典色站一区二区三区| 国产精品美女久久久久高潮| 韩国av一区二区| 精品国产污网站| 国产乱国产乱300精品| 精品国精品国产| 久久激情综合网| 日韩女同互慰一区二区| 免费高清在线视频一区·| 欧美无砖砖区免费| 亚洲成人自拍网| 欧美精品aⅴ在线视频| 日韩激情在线观看| 日韩欧美专区在线| 久久国产福利国产秒拍|