Index: CKEditor/branches/features/pasting/_source/plugins/pastefromword/plugin.js
===================================================================
--- CKEditor/branches/features/pasting/_source/plugins/pastefromword/plugin.js	(revision 4266)
+++ CKEditor/branches/features/pasting/_source/plugins/pastefromword/plugin.js	(revision 4270)
@@ -28,6 +28,6 @@
 				if ( ( mswordHtml = data[ 'html' ] )
 					 && ( evt.data[ 'ms-word' ]
-						|| /(class=\"?Mso|style=\"[^\"]*\bmso\-|w:WordDocument)/.test( mswordHtml )
-						   && confirm( editor.lang.pastefromword.confirmCleanup ) ) )
+						  || /(class=\"?Mso|style=\"[^\"]*\bmso\-|w:WordDocument)/.test( mswordHtml )
+						     && confirm( editor.lang.pastefromword.confirmCleanup ) ) )
 				{
 					// Firefox will be confused by those downlevel-revealed IE conditional
@@ -56,16 +56,17 @@
 			{
 				var marker = new CKEDITOR.htmlParser.element( 'cke:listbullet' ),
-					listType,
-					defaultBulletStyle = 'decimal';
+					listType;
 
 				// TODO: Support more list style type from MS-Word.
-				if ( bulletStyle[ 2 ].search(/[.)]/) != -1 )
-				{
-					if ( !isNaN(bulletStyle[ 1 ]) )
+				if ( bulletStyle[ 2 ] )
+				{
+					if ( !isNaN( bulletStyle[ 1 ] ) )
 						bulletStyle = 'decimal';
 					else if ( bulletStyle[ 1 ].search(/[a-z]/) != -1 )
 						bulletStyle = 'lower-latin';
 					else if ( bulletStyle[ 1 ].search(/[A-Z]/) != -1 )
-							bulletStyle = 'upper-latin';
+						bulletStyle = 'upper-latin';
+					else
+						bulletStyle = 'decimal';
 
 					listType = 'ol';
@@ -79,4 +80,6 @@
 					else if ( bulletStyle[ 1 ].search(/[n◆]/) != -1 )
 						bulletStyle = 'square';
+					else
+						bulletStyle = 'disc';
 
 					listType = 'ul';
@@ -86,11 +89,16 @@
 				marker.attributes =
 				{
-					'cke:listtype' : listType
+					'cke:listtype' : listType,
+					'style' : 'list-style-type:' + bulletStyle 
 				};
 
-				if( bulletStyle )
-					marker.attributes[ 'style' ] = 'list-style-type:' + bulletStyle;
-
 				return marker;
+			},
+
+			isListBulletIndicator : function( element )
+			{
+				var styleText = element.attributes && element.attributes.style;
+				if( styleText == 'mso-list: Ignore' )
+					return true;
 			}
 
@@ -176,5 +184,5 @@
 									: styleDefiniton;
 						element.name = styleDef.element;
-						element.attributes = CKEDITOR.tools.clone( styleDef.attributes ) || {};
+						CKEDITOR.tools.extend( element.attributes, CKEDITOR.tools.clone( styleDef.attributes ) );
 						var attrs = element.attributes;
 						attrs.style = ( attrs.style || '' ) + CKEDITOR.style.getStyleText( styleDef );
@@ -193,5 +201,5 @@
 					{
 						// Build an stylish element first.
-						var styleElement = new CKEDITOR.htmlParser.element(),
+						var styleElement = new CKEDITOR.htmlParser.element( null, {} ),
 							varialbes = {};
 
@@ -226,4 +234,5 @@
 				bogusAttrFilter = this.filters.bogusAttrFilter,
 				createListBulletMarker = this.utils.createListBulletMarker,
+				isListBulletIndicator = this.utils.isListBulletIndicator,
 				listDtdParents = CKEDITOR.dtd.parentOf( 'ol' ),
 				config = editor.config,
@@ -323,9 +332,7 @@
 
 									// Ignore the 'list-style-type' attribute if it's matched with
-									// the list root element type.
-									if( ( !parentList && listType )
-										|| listType == ( parentList && parentList.name ) )
-										listItemAttrs.style = stylesFilter(
-										[ [ 'list-style-type' ] ] )( listItemAttrs.style ) || '' ;
+									// the list root element's default style type.
+									listItemAttrs.style = stylesFilter(
+										[ [ 'list-style-type', listType == 'ol'? 'decimal' : 'disc' ] ] )( listItemAttrs.style ) || '' ;
 
 									if ( !list )
@@ -347,4 +354,5 @@
 										{
 											list = parentList;
+											parentList = list.parent ? list.parent.parent : list;
 											list.add( listItem );
 										}
@@ -387,8 +395,10 @@
 							return;
 						}
-						// <cke:listbullet> been the first child of any paragraph
-						// indicate a list item.
-						if( 'cke:listbullet' == firstChild.name )
-						{
+						// <cke:listbullet> lies inside any paragraph indicate a list item.
+						var childs;
+						if( ( childs = element.anyChildWithName( 'cke:listbullet' ) )
+							 && childs.length )
+						{
+							var listMaker = childs[ 0 ];
 							element.name = 'cke:li';
 							attrs.style = stylesFilter(
@@ -403,5 +413,5 @@
 
 							// Inherit list-type-style from bullet. 
-							var listBulletAttrs = firstChild.attributes,
+							var listBulletAttrs = listMaker.attributes,
 								listBulletStyle = listBulletAttrs.style;
 							attrs.style += ( listBulletStyle + ';' );
@@ -426,4 +436,11 @@
 					'font' : function( element )
 					{
+						// IE: drop the font tag if it comes from list bullet text. 
+						if ( CKEDITOR.env.ie && isListBulletIndicator( element.parent ) )
+						{
+							delete element.name;
+							return;
+						}
+
 						element.filterChildren();
 						// Merge nested <font> tags.
@@ -461,34 +478,14 @@
 					'span' : function( element )
 					{
+						// IE: remove the span if it comes from list bullet text.
+						if ( CKEDITOR.env.ie && isListBulletIndicator( element.parent ) )
+							return false;
+
 						element.filterChildren();
 
 						// List item bullet type is supposed to be indicated by
 						// the text of a span with style 'mso-list : Ignore'.
-						if( !CKEDITOR.env.gecko )
-						{
-							var attrs = element.attributes,
-									styles = attrs && attrs.style;
-							if( styles )
-							{
-								var marker;
-								stylesFilter(
-										[
-											[ 'mso-list', 'Ignore', function( value, element )
-											{
-
-												var listType = element.firstTextChild().value.match( /([^\s])([.)]?)/ );
-												marker = createListBulletMarker( listType );
-											} ]
-										] )( styles, element );
-
-								if( marker )
-									return marker;
-							}
-
-							// Kill an additional wrapping span.
-							var onlyChild = element.onlyChild();
-							if( onlyChild && 'cke:listbullet' == onlyChild.name )
-								return onlyChild;
-						}
+						if ( CKEDITOR.env.ie && isListBulletIndicator( element ) )
+							return createListBulletMarker( element.firstTextChild().value.match( /([^\s])([.)]?)/ ) );
 						
 						// Update the src attribute of image element with href.
@@ -597,5 +594,5 @@
 					'class' : function( value )
 					{
-						if( value.match( /^(:?Mso|Spell)/i ) )
+						if( value.match( /^(:?Mso|Spell|ListParagraph)/i ) )
 							return false;
 					},
@@ -644,4 +641,21 @@
 			firstChild = ( count == 1 ) && children[ 0 ];
 		return firstChild || null;
+	};
+
+	elementPrototype.anyChildWithName = function( tagName, includingSelf )
+	{
+		var children = this.children,
+			count = children && children.length,
+			childs = [];
+
+		if( includingSelf && this.name == tagName )
+			childs.push( this );
+
+		for ( var i = 0; i < count; i++ )
+		{
+			if( children[ i ].name  )
+				childs = childs.concat( children[ i ].anyChildWithName( tagName, true ) );
+		}
+		return childs;
 	};
 
