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

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

?? fckdomrange.js

?? 論壇程序可以實現多人同時交流,jsp + mysql實現的 請大家多多交流
?? 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一区二区三区免费野_久草精品视频
欧美午夜精品久久久久久超碰| 国产日韩欧美激情| xvideos.蜜桃一区二区| 亚洲欧洲精品一区二区三区| 日本一区中文字幕| 93久久精品日日躁夜夜躁欧美| 91精品综合久久久久久| 国产精品久久久久天堂| 久久99精品久久久久久久久久久久| eeuss鲁片一区二区三区在线看| 欧美一区二区三区在线看| 亚洲三级小视频| 国内不卡的二区三区中文字幕| 欧美日本韩国一区| 中文字幕亚洲视频| 国产成人免费视频网站| 欧美成人vr18sexvr| 亚洲国产精品视频| 色综合天天综合狠狠| 国产区在线观看成人精品| 极品美女销魂一区二区三区| 欧美二区乱c少妇| 亚洲高清免费一级二级三级| 在线观看免费视频综合| 国产精品精品国产色婷婷| 国产精品影音先锋| 精品久久久久久久久久久久久久久久久| 香蕉影视欧美成人| 欧美日韩综合色| 亚洲一卡二卡三卡四卡| 在线观看视频欧美| 亚洲最新视频在线观看| 一本大道久久a久久精品综合| 国产精品国产自产拍高清av王其| 国产一区二区主播在线| 久久久久久久久一| 国产毛片精品一区| 国产日韩欧美电影| 高清视频一区二区| 国产精品国产三级国产aⅴ原创 | 成人精品鲁一区一区二区| 日韩视频在线一区二区| 蜜桃在线一区二区三区| 日韩精品一区二区三区在线观看 | 国产欧美精品一区二区色综合| 久久草av在线| 国产午夜精品久久久久久久| 国产69精品久久久久毛片| 亚洲国产成人午夜在线一区| av影院午夜一区| 一区二区三区高清| 制服丝袜国产精品| 国精品**一区二区三区在线蜜桃| 久久久久久99久久久精品网站| 国产精品一区二区果冻传媒| 中文在线免费一区三区高中清不卡| www.综合网.com| 亚洲综合免费观看高清完整版| 69av一区二区三区| 国产福利一区在线| 夜夜操天天操亚洲| 精品国产自在久精品国产| 成人污视频在线观看| 亚洲大片在线观看| 精品国产乱码久久久久久久久 | 欧美国产欧美综合| 欧美少妇bbb| 韩国毛片一区二区三区| 国产精品白丝在线| 欧美一级欧美一级在线播放| 国产成人免费视频网站高清观看视频| 亚洲男女一区二区三区| 欧美一区二区在线免费观看| 国产不卡在线视频| 亚洲成人av免费| 亚洲国产高清不卡| 777色狠狠一区二区三区| 国产高清精品在线| 免费高清不卡av| 中文字幕在线免费不卡| 日韩欧美亚洲另类制服综合在线| 国产v综合v亚洲欧| 日韩中文字幕一区二区三区| 国产精品污网站| 6080午夜不卡| 日本道精品一区二区三区| 国产精品一区2区| 日韩成人伦理电影在线观看| 综合中文字幕亚洲| 国产亚洲精品中文字幕| 欧美狂野另类xxxxoooo| 91麻豆精品视频| 国产成人精品三级| 麻豆久久一区二区| 午夜久久久久久电影| 一区二区三区免费在线观看| 国产三区在线成人av| 日韩一二在线观看| 欧美日韩午夜在线| 91黄色免费看| 色综合久久久网| 不卡的av电影| 国产不卡免费视频| 国产精品资源在线看| 久久国产麻豆精品| 亚洲va韩国va欧美va精品| 亚洲人成在线播放网站岛国 | 亚洲女厕所小便bbb| 国产日韩三级在线| 久久久www免费人成精品| 91精品国产综合久久香蕉的特点 | 国产黑丝在线一区二区三区| 精品一区二区三区不卡| 蜜桃精品视频在线| 蜜桃av一区二区三区电影| 日韩高清一区在线| 日本不卡不码高清免费观看| 五月激情综合网| 日韩国产欧美视频| 精品亚洲国内自在自线福利| 亚洲成人资源网| 亚洲国产精品一区二区久久恐怖片| 亚洲精品视频观看| 亚洲国产美女搞黄色| 亚洲午夜电影网| 日本网站在线观看一区二区三区 | 韩国精品主播一区二区在线观看 | 高清不卡一区二区在线| 国产馆精品极品| aaa亚洲精品| 欧美伊人久久久久久午夜久久久久| 色88888久久久久久影院按摩 | 精品久久久久久久久久久久久久久久久 | 欧洲国内综合视频| 欧美日韩国产综合一区二区| 7777精品伊人久久久大香线蕉 | 捆绑紧缚一区二区三区视频| 美女任你摸久久| 国产乱国产乱300精品| 成人ar影院免费观看视频| 色诱亚洲精品久久久久久| 欧美色图在线观看| 精品国产乱码久久久久久免费 | 欧美成人艳星乳罩| 国产亚洲短视频| 亚洲视频在线一区| 五月婷婷欧美视频| 国产乱码精品1区2区3区| aaa亚洲精品一二三区| 欧美精品在欧美一区二区少妇| 久久亚洲精品国产精品紫薇| 国产精品乱人伦中文| 亚洲成a人片在线不卡一二三区| 另类小说视频一区二区| 色婷婷综合久久久中文字幕| 欧美一区二区在线免费观看| 国产精品美女久久久久aⅴ| 亚洲国产欧美在线人成| 国产激情一区二区三区四区| 在线视频一区二区免费| 久久丝袜美腿综合| 亚洲电影在线播放| 国产成人99久久亚洲综合精品| 欧美亚男人的天堂| 国产欧美精品一区二区三区四区| 亚洲一区二区三区四区中文字幕| 狠狠色狠狠色合久久伊人| 欧美在线视频日韩| 国产欧美日韩麻豆91| 五月激情综合色| 一本久道久久综合中文字幕 | 粉嫩蜜臀av国产精品网站| 欧美美女喷水视频| 亚洲日本欧美天堂| 国产一区二区毛片| 91精品国产综合久久精品麻豆| 亚洲人妖av一区二区| 国产精品一二二区| 日韩欧美一区中文| 亚洲国产精品久久不卡毛片| 丁香激情综合国产| 精品国产伦一区二区三区观看方式| 亚洲高清视频在线| 91丨九色丨蝌蚪富婆spa| 国产欧美一区在线| 国产一区二区三区免费| 欧美一级免费大片| 五月天国产精品| 欧美性受xxxx黑人xyx| 亚洲综合免费观看高清完整版在线| 成a人片亚洲日本久久| 中文字幕不卡三区| 国产成人精品一区二| 久久精品免视看| 国产精品一区二区91| 久久一日本道色综合| 国产精品中文欧美| 国产欧美一区视频| 成人av在线播放网址| 国产精品久久久久7777按摩|