/*
 * Prototype brush loader for SyntaxHighlighter
 *
 * SyntaxHighlighter by Alex Gorbatchev
 * http://alexgorbatchev.com/
 *
 * Prototype brush loader by David Chambers
 * http://davidchambersdesign.com/prototype-loader-for-syntaxhighlighter/
 * { last updated: 16 August 2009 }
 *
 * Requires Prototype:
 * http://www.prototypejs.org/
 */

document.observe('dom:loaded', function () {

	var brush_requested, brushes, brushes_to_load, defaults, element, head, i;

	head = $$('head')[0];
	element = $$(settings.selector)[0];

	/* http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes */

	brushes = [
		new Brush('ActionScript3', 'shBrushAS3', ['as3', 'actionscript3']),
		new Brush('Bash/shell', 'shBrushBash', ['bash', 'shell']),
		new Brush('C#', 'shBrushCSharp', ['c-sharp', 'csharp']),
		new Brush('C++', 'shBrushCpp', ['cpp', 'c']),
		new Brush('CSS', 'shBrushCss', ['css']),
		new Brush('Delphi', 'shBrushDelphi', ['delphi', 'pas', 'pascal']),
		new Brush('Diff', 'shBrushDiff', ['diff', 'patch']),
		new Brush('Groovy', 'shBrushGroovy', ['groovy']),
		new Brush('JavaScript', 'shBrushJScript', ['js', 'jscript', 'javascript']),
		new Brush('Java', 'shBrushJava', ['java']),
		new Brush('JavaFX', 'shBrushJavaFX', ['jfx', 'javafx']),
		new Brush('Perl', 'shBrushPerl', ['perl', 'pl']),
		new Brush('PHP', 'shBrushPhp', ['php']),
		new Brush('Plain Text', 'shBrushPlain', ['plain', 'text']),
		new Brush('PowerShell', 'shBrushPowerShell', ['ps', 'powershell']),
		new Brush('Python', 'shBrushPython', ['py', 'python']),
		new Brush('Ruby', 'shBrushRuby', ['rails', 'ror', 'ruby']),
		new Brush('Scala', 'shBrushScala', ['scala']),
		new Brush('SQL', 'shBrushSql', ['sql']),
		new Brush('Visual Basic', 'shBrushVb', ['vb', 'vbnet']),
		new Brush('XML', 'shBrushXml', ['xml', 'xhtml', 'xslt', 'html'])
	];

	settings.brushes.each(function (brush) {
		brushes.push(brush)
	});

	function load(filename, callback)
	{
		var script, timer;
		script = new Element('script', {
			type: 'text/javascript',
			src: settings.path + 'scripts/' + filename + '.' + settings.extensions.brush
		});
		// taken from Bob Matsuoka's lazy loader 0.5: http://ajaxian.com/archives/a-technique-for-lazy-script-loading
		if ((Prototype.Browser.WebKit && navigator.userAgent.match(/Version\/[12]/)) || Prototype.Browser.Opera) {
			timer = window.setInterval(function () {
				if (/loaded|complete/.test(document.readyState)) {
					window.clearInterval(timer);
					callback()
				}
			}, 100)
		}
		else {
			script.onreadystatechange = function () {
				if (script.readyState == 'loaded' || script.readyState == 'complete') {
					callback()
				}
			}
			script.onload = callback
		}
		element.appendChild(script)
	}

	function get_callback(arr)
	{
		var callback, d;
		i++;
		if (arr.length > i) {
			callback = function () {
				load(arr[i], function () {
					get_callback(arr)()
				})
			}
		}
		else if (arr.length == i) {
			callback = function () {
				for (d in settings.defaults) {
					SyntaxHighlighter.defaults[d] = settings.defaults[d]
				}
				SyntaxHighlighter.highlight()
			}
		}
		else {
			callback = function () {}
		}
		return callback
	}

	brushes_to_load = [];

	brushes.each(function (brush) {
		$$('pre').each(function (pre) {
			brush_requested = false;
			brush.aliases.each(function (alias) {
				if ((pre.className + ';').match('brush: ' + alias + ';')) {
					brushes_to_load.push(brush.filename);
					brush_requested = true;
					throw $break // stop trying to match the alias(es) of the current brush
				}
			});
			if (brush_requested) {
				throw $break // stop looking for a pre element that uses the current brush
			}
		})
	});

	// ensure that XML brush is in brushes_to_load if html-script is set to true
	if (!brushes_to_load.include('shBrushXml')) {
		defaults = new Hash(settings.defaults);
		if (defaults.any(function (pair) { return pair.key == 'html-script' && pair.value == true })) {
			brushes_to_load.push('shBrushXml');
			// ensure that each pre element to be highlighted has 'html-script: true' in its class name...
			$$('pre').each(function (pre) {
				if (pre.className.match(/brush: /)) {
					if (!pre.className.match(/html-script: /)) { // unless it already has a value for html-script
						pre.className = 'html-script: true; ' + pre.className
					}
				}
			})
		}
		else {
			$$('pre').each(function (pre) {
				if (pre.className.match('html-script: true')) {
					brushes_to_load.push('shBrushXml');
					throw $break
				}
			})
		}
	}

	if (brushes_to_load.length) {
		settings.stylesheets.unshift('shCore');
		settings.stylesheets.each(function (s) {
			link = new Element('link', {
				'type': 'text/css',
				'rel': 'stylesheet',
				'href': settings.path + 'styles/' + s + '.' + settings.extensions.stylesheet
			});
			head.appendChild(link)
		});
		brushes_to_load.unshift('shCore');
		i = 0;
		load(brushes_to_load[i], function () {
			get_callback(brushes_to_load)()
		})
	}

});

