/*

Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.

For licensing, see LICENSE.html or http://ckeditor.com/license

*/

(function()

{

	function forceHtmlMode( evt ) { evt.data.mode = 'html'; }



	CKEDITOR.plugins.add( 'pastefromword',

	{

		init : function( editor )

		{



			// Flag indicate this command is actually been asked instead of a generic

			// pasting.

			var forceFromWord = 0;

			var resetFromWord = function( evt )

				{

					evt && evt.removeListener();

					editor.removeListener( 'beforePaste', forceHtmlMode );

					forceFromWord && setTimeout( function() { forceFromWord = 0; }, 0 );

				};



			// Features bring by this command beside the normal process:

			// 1. No more bothering of user about the clean-up.

			// 2. Perform the clean-up even if content is not from MS-Word.

			// (e.g. from a MS-Word similar application.)

			editor.addCommand( 'pastefromword',

			{

				canUndo : false,

				exec : function()

				{

					// Ensure the received data format is HTML and apply content filtering. (#6718)

					forceFromWord = 1;

					editor.on( 'beforePaste', forceHtmlMode );



					if ( editor.execCommand( 'paste', 'html' ) === false )

					{

						editor.on( 'dialogShow', function ( evt )

						{

							evt.removeListener();

							evt.data.on( 'cancel', resetFromWord );

						});



						editor.on( 'dialogHide', function( evt )

						{

							evt.data.removeListener( 'cancel', resetFromWord );

						} );

					}



					editor.on( 'afterPaste', resetFromWord );

				}

			});



			// Register the toolbar button.

			editor.ui.addButton( 'PasteFromWord',

				{

					label : editor.lang.pastefromword.toolbar,

					command : 'pastefromword'

				});



			editor.on( 'pasteState', function( evt )

				{

					editor.getCommand( 'pastefromword' ).setState( evt.data );

				});



			editor.on( 'paste', function( evt )

			{

				var data = evt.data,

					mswordHtml;



				// MS-WORD format sniffing.

				if ( ( mswordHtml = data[ 'html' ] )

					 && ( forceFromWord || ( /(class=\"?Mso|style=\"[^\"]*\bmso\-|w:WordDocument)/ ).test( mswordHtml ) ) )

				{

					var isLazyLoad = this.loadFilterRules( function()

						{

							// Event continuation with the original data.

							if ( isLazyLoad )

								editor.fire( 'paste', data );

							else if ( !editor.config.pasteFromWordPromptCleanup

							  || ( forceFromWord || confirm( editor.lang.pastefromword.confirmCleanup ) ) )

							 {

								data[ 'html' ] = CKEDITOR.cleanWord( mswordHtml, editor );

							}

						});



					// The cleanup rules are to be loaded, we should just cancel

					// this event.

					isLazyLoad && evt.cancel();

				}

			}, this );

		},



		loadFilterRules : function( callback )

		{



			var isLoaded = CKEDITOR.cleanWord;



			if ( isLoaded )

				callback();

			else

			{

				var filterFilePath = CKEDITOR.getUrl(

						CKEDITOR.config.pasteFromWordCleanupFile

						|| ( this.path + 'filter/default.js' ) );



				// Load with busy indicator.

				CKEDITOR.scriptLoader.load( filterFilePath, callback, null, true );

			}



			return !isLoaded;

		},



		requires : [ 'clipboard' ]

	});

})();



/**

 * Whether to prompt the user about the clean up of content being pasted from

 * MS Word.

 * @name CKEDITOR.config.pasteFromWordPromptCleanup

 * @since 3.1

 * @type Boolean

 * @default undefined

 * @example

 * config.pasteFromWordPromptCleanup = true;

 */



/**

 * The file that provides the MS Word cleanup function for pasting operations.

 * Note: This is a global configuration shared by all editor instances present

 * in the page.

 * @name CKEDITOR.config.pasteFromWordCleanupFile

 * @since 3.1

 * @type String

 * @default 'default'

 * @example

 * // Load from 'pastefromword' plugin 'filter' sub folder (custom.js file).

 * CKEDITOR.config.pasteFromWordCleanupFile = 'custom';

 */

