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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? fcklistcommands.js

?? 強大的個人日志系統(tǒng),界面華麗
?? JS
字號:
?/*
 * 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 ==
 *
 * Implementation for the "Insert/Remove Ordered/Unordered List" commands.
 */

var FCKListCommand = function( name, tagName )
{
	this.Name = name ;
	this.TagName = tagName ;
}

FCKListCommand.prototype =
{
	GetState : function()
	{
		// Disabled if not WYSIWYG.
		if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG || ! FCK.EditorWindow )
			return FCK_TRISTATE_DISABLED ;

		// We'll use the style system's convention to determine list state here...
		// If the starting block is a descendant of an <ol> or <ul> node, then we're in a list.
		var startContainer = FCKSelection.GetBoundaryParentElement( true ) ;
		var listNode = startContainer ;
		while ( listNode )
		{
			if ( listNode.nodeName.IEquals( [ 'ul', 'ol' ] ) )
				break ;
			listNode = listNode.parentNode ;
		}
		if ( listNode && listNode.nodeName.IEquals( this.TagName ) )
			return FCK_TRISTATE_ON ;
		else
			return FCK_TRISTATE_OFF ;
	},

	Execute : function()
	{
		FCKUndo.SaveUndoStep() ;

		var doc = FCK.EditorDocument ;
		var range = new FCKDomRange( FCK.EditorWindow ) ;
		range.MoveToSelection() ;
		var state = this.GetState() ;

		// Midas lists rule #1 says we can create a list even in an empty document.
		// But FCKDomRangeIterator wouldn't run if the document is really empty.
		// So create a paragraph if the document is empty and we're going to create a list.
		if ( state == FCK_TRISTATE_OFF )
		{
			FCKDomTools.TrimNode( doc.body ) ;
			if ( ! doc.body.firstChild )
			{
				var paragraph = doc.createElement( 'p' ) ;
				doc.body.appendChild( paragraph ) ;
				range.MoveToNodeContents( paragraph ) ;
			}
		}

		var bookmark = range.CreateBookmark() ;

		// Group the blocks up because there are many cases where multiple lists have to be created,
		// or multiple lists have to be cancelled.
		var listGroups = [] ;
		var markerObj = {} ;
		var iterator = new FCKDomRangeIterator( range ) ;
		var block ;

		iterator.ForceBrBreak = ( state == FCK_TRISTATE_OFF ) ;
		var nextRangeExists = true ;
		var rangeQueue = null ;
		while ( nextRangeExists )
		{
			while ( ( block = iterator.GetNextParagraph() ) )
			{
				var path = new FCKElementPath( block ) ;
				var listNode = null ;
				var processedFlag = false ;
				var blockLimit = path.BlockLimit ;

				// First, try to group by a list ancestor.
				for ( var i = path.Elements.length - 1 ; i >= 0 ; i-- )
				{
					var el = path.Elements[i] ;
					if ( el.nodeName.IEquals( ['ol', 'ul'] ) )
					{
						// If we've encountered a list inside a block limit
						// The last group object of the block limit element should
						// no longer be valid. Since paragraphs after the list
						// should belong to a different group of paragraphs before
						// the list. (Bug #1309)
						if ( blockLimit._FCK_ListGroupObject )
							blockLimit._FCK_ListGroupObject = null ;

						var groupObj = el._FCK_ListGroupObject ;
						if ( groupObj )
							groupObj.contents.push( block ) ;
						else
						{
							groupObj = { 'root' : el, 'contents' : [ block ] } ;
							listGroups.push( groupObj ) ;
							FCKDomTools.SetElementMarker( markerObj, el, '_FCK_ListGroupObject', groupObj ) ;
						}
						processedFlag = true ;
						break ;
					}
				}

				if ( processedFlag )
					continue ;

				// No list ancestor? Group by block limit.
				var root = blockLimit ;
				if ( root._FCK_ListGroupObject )
					root._FCK_ListGroupObject.contents.push( block ) ;
				else
				{
					var groupObj = { 'root' : root, 'contents' : [ block ] } ;
					FCKDomTools.SetElementMarker( markerObj, root, '_FCK_ListGroupObject', groupObj ) ;
					listGroups.push( groupObj ) ;
				}
			}

			if ( FCKBrowserInfo.IsIE )
				nextRangeExists = false ;
			else
			{
				if ( rangeQueue == null )
				{
					rangeQueue = [] ;
					var selectionObject = FCKSelection.GetSelection() ;
					if ( selectionObject && listGroups.length == 0 )
						rangeQueue.push( selectionObject.getRangeAt( 0 ) ) ;
					for ( var i = 1 ; selectionObject && i < selectionObject.rangeCount ; i++ )
						rangeQueue.push( selectionObject.getRangeAt( i ) ) ;
				}
				if ( rangeQueue.length < 1 )
					nextRangeExists = false ;
				else
				{
					var internalRange = FCKW3CRange.CreateFromRange( doc, rangeQueue.shift() ) ;
					range._Range = internalRange ;
					range._UpdateElementInfo() ;
					if ( range.StartNode.nodeName.IEquals( 'td' ) )
						range.SetStart( range.StartNode, 1 ) ;
					if ( range.EndNode.nodeName.IEquals( 'td' ) )
						range.SetEnd( range.EndNode, 2 ) ;
					iterator = new FCKDomRangeIterator( range ) ;
					iterator.ForceBrBreak = ( state == FCK_TRISTATE_OFF ) ;
				}
			}
		}

		// Now we have two kinds of list groups, groups rooted at a list, and groups rooted at a block limit element.
		// We either have to build lists or remove lists, for removing a list does not makes sense when we are looking
		// at the group that's not rooted at lists. So we have three cases to handle.
		var listsCreated = [] ;
		while ( listGroups.length > 0 )
		{
			var groupObj = listGroups.shift() ;
			if ( state == FCK_TRISTATE_OFF )
			{
				if ( groupObj.root.nodeName.IEquals( ['ul', 'ol'] ) )
					this._ChangeListType( groupObj, markerObj, listsCreated ) ;
				else
					this._CreateList( groupObj, listsCreated ) ;
			}
			else if ( state == FCK_TRISTATE_ON && groupObj.root.nodeName.IEquals( ['ul', 'ol'] ) )
				this._RemoveList( groupObj, markerObj ) ;
		}

		// For all new lists created, merge adjacent, same type lists.
		for ( var i = 0 ; i < listsCreated.length ; i++ )
		{
			var listNode = listsCreated[i] ;
			var stopFlag = false ;
			var currentNode = listNode ;
			while ( ! stopFlag )
			{
				currentNode = currentNode.nextSibling ;
				if ( currentNode && currentNode.nodeType == 3 && currentNode.nodeValue.search( /^[\n\r\t ]*$/ ) == 0 )
					continue ;
				stopFlag = true ;
			}

			if ( currentNode && currentNode.nodeName.IEquals( this.TagName ) )
			{
				currentNode.parentNode.removeChild( currentNode ) ;
				while ( currentNode.firstChild )
					listNode.appendChild( currentNode.removeChild( currentNode.firstChild ) ) ;
			}

			stopFlag = false ;
			currentNode = listNode ;
			while ( ! stopFlag )
			{
				currentNode = currentNode.previousSibling ;
				if ( currentNode && currentNode.nodeType == 3 && currentNode.nodeValue.search( /^[\n\r\t ]*$/ ) == 0 )
					continue ;
				stopFlag = true ;
			}
			if ( currentNode && currentNode.nodeName.IEquals( this.TagName ) )
			{
				currentNode.parentNode.removeChild( currentNode ) ;
				while ( currentNode.lastChild )
					listNode.insertBefore( currentNode.removeChild( currentNode.lastChild ),
						       listNode.firstChild ) ;
			}
		}

		// Clean up, restore selection and update toolbar button states.
		FCKDomTools.ClearAllMarkers( markerObj ) ;
		range.MoveToBookmark( bookmark ) ;
		range.Select() ;

		FCK.Focus() ;
		FCK.Events.FireEvent( 'OnSelectionChange' ) ;
	},

	_ChangeListType : function( groupObj, markerObj, listsCreated )
	{
		// This case is easy...
		// 1. Convert the whole list into a one-dimensional array.
		// 2. Change the list type by modifying the array.
		// 3. Recreate the whole list by converting the array to a list.
		// 4. Replace the original list with the recreated list.
		var listArray = FCKDomTools.ListToArray( groupObj.root, markerObj ) ;
		var selectedListItems = [] ;
		for ( var i = 0 ; i < groupObj.contents.length ; i++ )
		{
			var itemNode = groupObj.contents[i] ;
			itemNode = FCKTools.GetElementAscensor( itemNode, 'li' ) ;
			if ( ! itemNode || itemNode._FCK_ListItem_Processed )
				continue ;
			selectedListItems.push( itemNode ) ;
			FCKDomTools.SetElementMarker( markerObj, itemNode, '_FCK_ListItem_Processed', true ) ;
		}
		var fakeParent = FCKTools.GetElementDocument( groupObj.root ).createElement( this.TagName ) ;
		for ( var i = 0 ; i < selectedListItems.length ; i++ )
		{
			var listIndex = selectedListItems[i]._FCK_ListArray_Index ;
			listArray[listIndex].parent = fakeParent ;
		}
		var newList = FCKDomTools.ArrayToList( listArray, markerObj ) ;
		for ( var i = 0 ; i < newList.listNode.childNodes.length ; i++ )
		{
			if ( newList.listNode.childNodes[i].nodeName.IEquals( this.TagName ) )
				listsCreated.push( newList.listNode.childNodes[i] ) ;
		}
		groupObj.root.parentNode.replaceChild( newList.listNode, groupObj.root ) ;
	},

	_CreateList : function( groupObj, listsCreated )
	{
		var contents = groupObj.contents ;
		var doc = FCKTools.GetElementDocument( groupObj.root ) ;
		var listContents = [] ;

		// It is possible to have the contents returned by DomRangeIterator to be the same as the root.
		// e.g. when we're running into table cells.
		// In such a case, enclose the childNodes of contents[0] into a <div>.
		if ( contents.length == 1 && contents[0] == groupObj.root )
		{
			var divBlock = doc.createElement( 'div' );
			while ( contents[0].firstChild )
				divBlock.appendChild( contents[0].removeChild( contents[0].firstChild ) ) ;
			contents[0].appendChild( divBlock ) ;
			contents[0] = divBlock ;
		}

		// Calculate the common parent node of all content blocks.
		var commonParent = groupObj.contents[0].parentNode ;
		for ( var i = 0 ; i < contents.length ; i++ )
			commonParent = FCKDomTools.GetCommonParents( commonParent, contents[i].parentNode ).pop() ;

		// We want to insert things that are in the same tree level only, so calculate the contents again
		// by expanding the selected blocks to the same tree level.
		for ( var i = 0 ; i < contents.length ; i++ )
		{
			var contentNode = contents[i] ;
			while ( contentNode.parentNode )
			{
				if ( contentNode.parentNode == commonParent )
				{
					listContents.push( contentNode ) ;
					break ;
				}
				contentNode = contentNode.parentNode ;
			}
		}

		if ( listContents.length < 1 )
			return ;

		// Insert the list to the DOM tree.
		var insertAnchor = listContents[listContents.length - 1].nextSibling ;
		var listNode = doc.createElement( this.TagName ) ;
		listsCreated.push( listNode ) ;
		while ( listContents.length )
		{
			var contentBlock = listContents.shift() ;
			var docFrag = doc.createDocumentFragment() ;
			while ( contentBlock.firstChild )
				docFrag.appendChild( contentBlock.removeChild( contentBlock.firstChild ) ) ;
			contentBlock.parentNode.removeChild( contentBlock ) ;
			var listItem = doc.createElement( 'li' ) ;
			listItem.appendChild( docFrag ) ;
			listNode.appendChild( listItem ) ;
		}
		commonParent.insertBefore( listNode, insertAnchor ) ;
	},

	_RemoveList : function( groupObj, markerObj )
	{
		// This is very much like the change list type operation.
		// Except that we're changing the selected items' indent to -1 in the list array.
		var listArray = FCKDomTools.ListToArray( groupObj.root, markerObj ) ;
		var selectedListItems = [] ;
		for ( var i = 0 ; i < groupObj.contents.length ; i++ )
		{
			var itemNode = groupObj.contents[i] ;
			itemNode = FCKTools.GetElementAscensor( itemNode, 'li' ) ;
			if ( ! itemNode || itemNode._FCK_ListItem_Processed )
				continue ;
			selectedListItems.push( itemNode ) ;
			FCKDomTools.SetElementMarker( markerObj, itemNode, '_FCK_ListItem_Processed', true ) ;
		}

		var lastListIndex = null ;
		for ( var i = 0 ; i < selectedListItems.length ; i++ )
		{
			var listIndex = selectedListItems[i]._FCK_ListArray_Index ;
			listArray[listIndex].indent = -1 ;
			lastListIndex = listIndex ;
		}

		// After cutting parts of the list out with indent=-1, we still have to maintain the array list
		// model's nextItem.indent <= currentItem.indent + 1 invariant. Otherwise the array model of the
		// list cannot be converted back to a real DOM list.
		for ( var i = lastListIndex + 1; i < listArray.length ; i++ )
		{
			if ( listArray[i].indent > listArray[i-1].indent + 1 )
			{
				var indentOffset = listArray[i-1].indent + 1 - listArray[i].indent ;
				var oldIndent = listArray[i].indent ;
				while ( listArray[i] && listArray[i].indent >= oldIndent)
				{
					listArray[i].indent += indentOffset ;
					i++ ;
				}
				i-- ;
			}
		}

		var newList = FCKDomTools.ArrayToList( listArray, markerObj ) ;
		// If groupObj.root is the last element in its parent, or its nextSibling is a <br>, then we should
		// not add a <br> after the final item. So, check for the cases and trim the <br>.
		if ( groupObj.root.nextSibling == null || groupObj.root.nextSibling.nodeName.IEquals( 'br' ) )
		{
			if ( newList.listNode.lastChild.nodeName.IEquals( 'br' ) )
				newList.listNode.removeChild( newList.listNode.lastChild ) ;
		}
		groupObj.root.parentNode.replaceChild( newList.listNode, groupObj.root ) ;
	}
};

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一级理论片| 国产在线日韩欧美| 91免费看视频| 国产偷国产偷亚洲高清人白洁| 另类小说图片综合网| 精品国产sm最大网站免费看| 久色婷婷小香蕉久久| 久久免费电影网| 成人av免费在线观看| 亚洲综合免费观看高清完整版| 欧美日韩在线直播| 久热成人在线视频| 国产精品网站在线观看| 91官网在线免费观看| 日本午夜一区二区| 国产日产欧美一区二区视频| av在线一区二区三区| 亚洲高清在线视频| 欧美第一区第二区| 国产精品影视在线观看| 亚洲人精品午夜| 91麻豆精品91久久久久同性| 国产乱理伦片在线观看夜一区| 亚洲伦理在线精品| 欧美一卡二卡三卡| 97精品久久久久中文字幕| 五月天欧美精品| 久久婷婷色综合| 一本大道久久a久久精品综合| 日本不卡视频在线| 欧美韩国日本一区| 欧美人与禽zozo性伦| 国产在线国偷精品免费看| 一区二区三区精品久久久| 日韩精品一区二区三区视频在线观看| 大白屁股一区二区视频| 午夜精品aaa| 国产精品三级在线观看| 91精品欧美一区二区三区综合在| 粗大黑人巨茎大战欧美成人| 五月综合激情网| 亚洲人亚洲人成电影网站色| 精品久久久久久久久久久久久久久 | 99精品在线免费| 麻豆精品国产91久久久久久| 综合久久国产九一剧情麻豆| 日韩一区二区三区免费观看| 色综合久久久久综合99| 国产精品一区二区男女羞羞无遮挡| 一区二区日韩av| 中国av一区二区三区| 欧美成人精品3d动漫h| 色狠狠一区二区| 成人在线视频一区| 久久福利资源站| 视频一区二区中文字幕| 亚洲欧美偷拍卡通变态| 久久亚洲综合色| 欧美成人a∨高清免费观看| 欧美三级中文字幕在线观看| 99精品一区二区| 成人性生交大片| 国产在线一区观看| 美女脱光内衣内裤视频久久影院| 午夜免费久久看| 亚洲一区成人在线| 亚洲一区精品在线| 一区二区三区国产精华| 亚洲欧美日韩人成在线播放| 国产精品久久久久久久午夜片| 国产欧美一区二区精品性色超碰| 久久综合狠狠综合久久激情 | 亚洲精品精品亚洲| 国产精品色眯眯| 国产精品少妇自拍| 中文字幕在线观看不卡| 中文字幕一区av| 亚洲另类在线视频| 亚洲精品久久7777| 亚洲午夜电影网| 亚洲1区2区3区视频| 亚洲成人在线免费| 三级久久三级久久| 日一区二区三区| 久久精品国产秦先生| 国模大尺度一区二区三区| 国产一区二区三区日韩| 国产精品一区二区三区网站| 国产一区二区成人久久免费影院 | 亚洲欧美一区二区三区国产精品| 中文字幕在线观看一区| 亚洲综合激情网| 亚洲成av人在线观看| 蜜桃在线一区二区三区| 精品一区二区在线播放| 国产成人午夜99999| 成人午夜在线视频| 色综合色综合色综合| 欧美图区在线视频| 日韩欧美一级二级三级久久久| 久久综合久久综合九色| 亚洲欧美综合在线精品| 亚洲小少妇裸体bbw| 美腿丝袜亚洲色图| 成人午夜激情片| 在线观看免费亚洲| 欧美一区二区三区成人| 国产视频一区在线观看| 亚洲欧美电影一区二区| 日本午夜一区二区| 国产a精品视频| 欧美性猛交xxxx乱大交退制版 | 日韩一区二区在线看| 久久午夜电影网| 一区二区三区中文字幕在线观看| 亚洲成人动漫在线免费观看| 久99久精品视频免费观看| 成人性色生活片| 91精品婷婷国产综合久久性色| 久久免费精品国产久精品久久久久| 亚洲美女视频在线| 激情久久久久久久久久久久久久久久| 不卡的av中国片| 欧美电影免费观看高清完整版在线观看 | 久久国产免费看| 色悠悠久久综合| 精品国产sm最大网站免费看 | 成人动漫av在线| 看电视剧不卡顿的网站| 成人精品鲁一区一区二区| 一本色道久久综合亚洲aⅴ蜜桃 | 日韩欧美国产一区二区在线播放| 国产精品乱码一区二三区小蝌蚪| 亚洲成av人片一区二区梦乃| 成人综合婷婷国产精品久久免费| 欧美视频一区在线| 亚洲国产精华液网站w| 免费不卡在线观看| 色婷婷av一区二区三区大白胸| 精品女同一区二区| 亚洲成人av一区二区| 99久久国产综合精品色伊| 欧美tk—视频vk| 五月婷婷激情综合网| 99re在线视频这里只有精品| 久久久国际精品| 蜜桃视频一区二区三区 | 青青草成人在线观看| 91国内精品野花午夜精品| 国产精品乱码人人做人人爱| 精品一区二区三区欧美| 欧美一区二区三区爱爱| 亚洲一区二区中文在线| 91在线视频18| 中文成人av在线| 成人久久久精品乱码一区二区三区| 精品黑人一区二区三区久久 | 美女在线视频一区| 欧美日韩精品一区二区三区四区 | 日韩你懂的电影在线观看| 亚洲一二三四在线观看| 97久久超碰国产精品电影| 欧美国产一区视频在线观看| 国产精品99久久久久久久女警 | 99热精品一区二区| 国产精品欧美久久久久一区二区| 国产精品影视在线观看| 久久精品免视看| 国产风韵犹存在线视精品| 久久精品这里都是精品| 国产在线一区观看| 国产亚洲精品精华液| 国产毛片精品一区| 亚洲国产精品99久久久久久久久| 成人免费视频一区| 国产精品国模大尺度视频| 99久久久国产精品免费蜜臀| 日韩理论片网站| 91麻豆精品在线观看| 亚洲成人自拍一区| 日韩视频在线永久播放| 国产在线精品不卡| 亚洲国产精品ⅴa在线观看| 91丨九色丨黑人外教| 亚洲一区中文日韩| 日韩一区二区免费在线观看| 极品少妇xxxx精品少妇| 久久亚洲捆绑美女| 成人h动漫精品一区二区| 一区二区三区在线视频播放| 欧美人体做爰大胆视频| 激情久久久久久久久久久久久久久久| 中文字幕国产一区| 日本韩国欧美国产| 蜜乳av一区二区| 中文字幕一区二区三区av| 欧美午夜精品理论片a级按摩| 久久www免费人成看片高清| 中文字幕欧美三区| 欧美性xxxxxxxx|