/* bender-tags: editor */
/* bender-ckeditor-plugins: smiley,bbcode,entities,enterkey */

bender.editor = { config: { autoParagraph: false } };

bender.test( {
	setUp: function() {
		var ed = this.editor, processor = ed.dataProcessor;
		// Remove protected attributes.
		processor.dataFilter.addRules( {
			attributeNames: [
				[ ( /^data-cke-.*/ ), '' ]
			]
		} );
	},

	assertToHtml: function( html, bbcode ) {
		var ed = this.editor, processor = ed.dataProcessor;
		// Fire "setData" event manually to not bother editable.
		var evtData = { dataValue: bbcode };
		ed.fire( 'setData', evtData );
		assert.areSame( html.toLowerCase(), CKEDITOR.tools.convertRgbToHex( bender.tools.fixHtml( processor.toHtml( evtData.dataValue ) ) ), 'bbcode->html' );
	},

	assertToBBCode: function( bbcode, html ) {
		var ed = this.editor, processor = ed.dataProcessor;
		assert.areSame( bbcode, processor.toDataFormat( html ), 'html->bbcode failed at:' + bbcode );
	},

	'test HTML to bbcode': function() {
		this.assertToBBCode( '[b]foo[/b]', '<strong>foo</strong>' );
		this.assertToBBCode( '[i]foo[/i]', '<em>foo</em>' );
		this.assertToBBCode( '[u]foo[/u]', '<u>foo</u>' );
		this.assertToBBCode( '[url]http://example.org[/url]', '<a href="http://example.org">http://example.org</a>' );
		this.assertToBBCode( '[url=http://example.com]example[/url]', '<a href="http://example.com">example</a>' );
		this.assertToBBCode( '[img]http://a.cksource.com/c/1/inc/img/demo-little-red.jpg[/img]',
							'<img src="http://a.cksource.com/c/1/inc/img/demo-little-red.jpg" />' );
		this.assertToBBCode( '[quote="citation"]quoted text[/quote]\n',
							'<blockquote><cite>citation</cite><p>quoted text</p></blockquote>' );
		this.assertToBBCode( '[size=150]large text[/size]', '<span style="FONT-SIZE:150%;">large text</span>' );
		this.assertToBBCode( '[color=#ff0000]red text[/color]', '<span style="COLOR:#ff0000;">red text</span>' );
		this.assertToBBCode( ':)', '<img src="' + this.editor.config.smiley_path + 'regular_smile.png" alt="smiley"/>' );
		this.assertToBBCode( '[list]\n[*]foo\n[*]bar\n[/list]\n', '<ul><li>foo</li><li>bar</li></ul>' );
	},

	// (#2248)
	'test HTML to bbcode justify': function() {
		this.assertToBBCode( '[left]foo[/left]', '<div style="text-align:left">foo</div>' );
		this.assertToBBCode( '[center]foo[/center]', '<div style="text-align:center">foo</div>' );
		this.assertToBBCode( '[right]foo[/right]', '<div style="text-align:right">foo</div>' );
		this.assertToBBCode( '[justify]foo[/justify]', '<div style="text-align:justify">foo</div>' );
		this.assertToBBCode( 'foo', '<div style="text-align:unset">foo</div>' );

		this.assertToBBCode( '[right][img]http://a.cksource.com/c/1/inc/img/demo-little-red.jpg[/img][/right]',
			'<div style="text-align:right"><img src="http://a.cksource.com/c/1/inc/img/demo-little-red.jpg" /></div>' );
	},

	'test bbcode to HTML': function() {
		this.assertToHtml( '<strong>foo</strong>', '[b]foo[/b]' );
		this.assertToHtml( '<em>foo</em>', '[i]foo[/i]' );
		this.assertToHtml( '<u>foo</u>', '[u]foo[/u]' );

		this.assertToHtml( '<a href="http://example.org">http://example.org</a>', '[url]http://example.org[/url]' );
		this.assertToHtml( '<a href="http://example.com">example</a>', '[url=http://example.com]example[/url]' );

		this.assertToHtml( '<img src="http://a.cksource.com/c/1/inc/img/demo-little-red.jpg" />',
							'[img]http://a.cksource.com/c/1/inc/img/demo-little-red.jpg[/img]' );

		this.assertToHtml( '<blockquote><cite>citation</cite><div>quoted text</div></blockquote>',
							'[quote="citation"]quoted text[/quote]\n' );

		this.assertToHtml( '<span style="font-size:150%;">large text</span>', '[size=150]large text[/size]' );
		this.assertToHtml( '<span style="color:#ff0000;">red text</span>', '[color=#ff0000]red text[/color]' );
		this.assertToHtml( '<img alt="smiley" src="' + this.editor.config.smiley_path + 'regular_smile.png" title="smiley" />', ':)' );
		this.assertToHtml( '<ul><li>foo</li><li>bar</li></ul>', '[list]\n[*]foo\n[*]bar\n[/list]\n' );
	},

	// (#2248)
	'test bbcode to HTML justify': function() {
		this.assertToHtml( '<div style="text-align:left;">foo</div>', '[left]foo[/left]' );
		this.assertToHtml( '<div style="text-align:center;">foo</div>', '[center]foo[/center]' );
		this.assertToHtml( '<div style="text-align:right;">foo</div>', '[right]foo[/right]' );
		this.assertToHtml( '<div style="text-align:justify;">foo</div>', '[justify]foo[/justify]' );
	},

	// https://dev.ckeditor.com/ticket/8995
	'test escape HTML entities in bbcode': function() {
		var html = '<a href="foo&amp;bar">&amp;foo&lt;bar&gt;</a>', bbcode = '[url=foo&bar]&foo<bar>[/url]';
		this.assertToHtml( html, bbcode );
		this.assertToBBCode( bbcode, html );
	},

	'test escape HTML entities in bbcode - double encoding': function() {
		var html = '<a href="foo&amp;amp;bar&amp;amp;lt;">foo&amp;lt;bar&amp;gt;bom&amp;amp;lt;</a>', bbcode = '[url=foo&amp;bar&amp;lt;]foo&lt;bar&gt;bom&amp;lt;[/url]';
		this.assertToHtml( html, bbcode );
		this.assertToBBCode( bbcode, html );
	},

	'test escape HTML entities in bbcode - ampresands in the text': function() {
		var html = '&amp; &amp;amp; &amp;amp;amp;', bbcode = '& &amp; &amp;amp;';
		this.assertToHtml( html, bbcode );
		this.assertToBBCode( bbcode, html );
	},

	'test line-breaks': function() {
		this.assertToHtml( '<strong>foo<br /><br />bar</strong>', '[b]foo\n\nbar[/b]' );
		this.assertToBBCode( '[b]foo\n\nbar[/b]', '<strong>foo<br /><br />bar</strong>' );
		this.assertToHtml( '<strong>foo<br /><br />bar</strong>', '[b]foo\r\n\r\nbar[/b]' );
	},

	'test enterMode': function() {
		var editor = this.editor,
			bot = this.editorBot;

		bot.setHtmlWithSelection( 'foo^bar' );
		editor.execCommand( 'enter' );

		assert.areSame( 'foo\nbar', editor.getData() );
	}
} );

//]]>
