/**
 * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
 * For licensing, see LICENSE.md or http://ckeditor.com/license
 */

 /**
 * @fileOverview Rich code snippets for CKEditor using GeSHi syntax highlighter (http://qbnz.com/highlighter/).
 */

'use strict';

( function() {
	CKEDITOR.plugins.add( 'codesnippetgeshi', {
		requires: 'ajax,codesnippet',

		init: function( editor ) {
			var writer = new CKEDITOR.htmlParser.basicWriter(),
				geSHiHighlighter = new CKEDITOR.plugins.codesnippet.highlighter( {
					languages: languages,
					highlighter: function( code, language, callback ) {
						// AJAX data to be sent in the request.
						var requestConfig = JSON.stringify( {
							lang: language,
							html: code
						} );

						// We need to pass an empty string if config.codesnippet is not defined,
						// because CKEDITOR#getUrl expects a String.
						CKEDITOR.ajax.post( CKEDITOR.getUrl( editor.config.codeSnippetGeshi_url || '' ), requestConfig, 'application/json', function( highlighted ) {
							// If no response is given it means that we have i.e. 404, so we'll set
							// empty content.
							if ( !highlighted ) {
								callback( '' );
								return;
							}

							var fragment = CKEDITOR.htmlParser.fragment.fromHtml( highlighted || '' );

							// GeSHi returns <pre> as a top-most element. Since <pre> is
							// already a part of the widget, consider children only.
							fragment.children[ 0 ].writeChildrenHtml( writer );

							// Return highlighted code.
							callback( writer.getHtml( true ) );
						} );
					}
				} );

			editor.plugins.codesnippet.setHighlighter( geSHiHighlighter );
		}
	} );

	// A list of default languages supported by GeSHi.
	var languages = {
//		abap: 'ABAP',
//		actionscript: 'ActionScript',
//		ada: 'Ada',
		apache: 'Apache Configuration',
//		applescript: 'AppleScript',
//		asm: 'Assembly',
//		asp: 'Active Server Pages (ASP)',
//		autoit: 'AutoIt',
		bash: 'Bash',
//		basic4gl: 'Basic4GL',
//		bf: 'Brainfuck',
//		blitzbasic: 'Blitz BASIC',
//		bnf: 'Backus-Naur Form',
//		c: 'C',
//		c_mac: 'C (Mac)',
//		caddcl: 'AutoCAD DCL',
//		cadlisp: 'AutoLISP',
//		cfdg: 'CFDG',
//		cfm: 'ColdFusion Markup Language',
//		cil: 'Common Intermediate Language (CIL)',
//		cobol: 'COBOL',
//		'cpp-qt': 'C++ (Qt toolkit)',
//		cpp: 'C++',
//		csharp: 'C#',
		css: 'CSS',
//		d: 'D',
//		delphi: 'Delphi',
		diff: 'Diff',
//		div: 'DIV',
		dos: 'DOS batch',
//		dot: 'DOT',
//		eiffel: 'Eiffel',
//		fortran: 'Fortran',
//		freebasic: 'FreeBASIC',
//		gambas: 'Gambas',
//		genero: 'Genero',
//		gettext: 'GNU internationalization (i18n) library',
//		glsl: 'OpenGL Shading Language (GLSL)',
//		gml: 'Game Maker Language (GML)',
//		gnuplot: 'gnuplot',
//		groovy: 'Groovy',
//		haskell: 'Haskell',
//		hq9plus: 'HQ9+',
		html4strict: 'HTML',
		html5: 'HTML5',
//		idl: 'Uno IDL',
//		ini: 'INI',
//		inno: 'Inno',
//		intercal: 'INTERCAL',
//		io: 'Io',
		java: 'Java',
//		java5: 'Java(TM) 2 Platform Standard Edition 5.0',
		javascript: 'JavaScript',
//		kixtart: 'KiXtart',
//		klonec: 'Klone C',
//		klonecpp: 'Klone C++',
//		latex: 'LaTeX',
//		lisp: 'Lisp',
//		lolcode: 'LOLCODE',
//		lotusscript: 'LotusScript',
//		lua: 'Lua',
//		Code: 'Language',
//		m68k: 'Motorola 68000 Assembler',
//		make: 'make',
//		matlab: 'MATLAB M',
//		mirc: 'mIRC scripting language',
//		mxml: 'MXML',
//		mpasm: 'Microchip Assembler',
		mysql: 'MySQL',
//		nsis: 'Nullsoft Scriptable Install System (NSIS)',
//		objc: 'Objective-C',
//		'ocaml-brief': 'OCaml',
//		ocaml: 'OCaml',
//		oobas: 'OpenOffice.org Basic',
//		oracle8: 'Oracle 8 SQL',
//		oracle11: 'Oracle 11 SQL',
//		pascal: 'Pascal',
//		per: 'per',
//		perl: 'Perl',
//		'php-brief': 'PHP',
		php: 'PHP',
//		pixelbender: 'Pixel Bender',
//		plsql: 'PL/SQL',
//		povray: 'Persistence of Vision Raytracer',
//		powershell: 'Windows PowerShell',
//		progress: 'OpenEdge Advanced Business Language',
//		prolog: 'Prolog',
//		providex: 'ProvideX',
//		python: 'Python',
//		qbasic: 'QBasic/QuickBASIC',
//		rails: 'Rails',
//		reg: 'Windows Registry',
//		robots: 'robots.txt',
//		rsplus: 'R',
		ruby: 'Ruby',
//		sas: 'SAS',
//		scala: 'Scala',
//		scheme: 'Scheme',
//		scilab: 'Scilab',
//		sdlbasic: 'SdlBasic',
//		smalltalk: 'Smalltalk',
//		smarty: 'Smarty',
//		sql: 'SQL',
//		tcl: 'Tcl',
//		teraterm: 'Tera Term',
		text: 'Text / Data',
//		thinbasic: 'thinBasic',
//		tsql: 'Transact-SQL',
//		typoscript: 'TypoScript',
//		vala: 'Vala',
//		vb: 'Visual Basic',
//		vbnet: 'Visual Basic .NET',
//		verilog: 'Verilog',
//		vhdl: 'VHDL',
//		vim: 'Vimscript',
//		visualfoxpro: 'Visual FoxPro',
//		visualprolog: 'Visual Prolog',
//		whitespace: 'Whitespace',
//		winbatch: 'Winbatch',
		xml: 'XML',
//		xorg_conf: 'Xorg.conf',
//		xpp: 'X++',
		z80: 'ZiLOG Z80 Assembler'
	};
} )();

/**
 * Sets GeSHi URL which, once queried with Ajax, will return highlighted code.
 *
 * Check the [Code Snippet GeSHi documentation](#!/guide/dev_codesnippetgeshi) for
 * more information.
 *
 *		config.codeSnippetGeshi_url = 'http:\/\/example.com\/geshi\/colorize.php';
 *
 * @cfg {String} [codeSnippetGeshi_url=null]
 * @member CKEDITOR.config
 */
