/**
 * SyntaxHighlighter
 * http://alexgorbatchev.com/SyntaxHighlighter
 *
 * SyntaxHighlighter is donationware. If you are using it, please donate.
 * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
 *
 * @version
 * 3.0.83 (July 02 2010)
 * 
 * @copyright
 * Copyright (C) 2004-2010 Alex Gorbatchev.
 *
 * @license
 * Dual licensed under the MIT and GPL licenses.
 */
(function(){
	var h=SyntaxHighlighter;
	function toArray(source)
	{
		var result = [];
		
		for (var i = 0; i < source.length; i++) 
			result.push(source[i]);
			
		return result;
	};
	
	function getSyntaxHighlighterScriptTags()
	{
		var tags = document.getElementsByTagName('script'),
			result = []
			;
		
		for (var i = 0; i < tags.length; i++)
			if (tags[i].type == 'syntaxhighlighter')
				result.push(tags[i]);
				
		return result;
	};
	/**
	 * Merges two objects. Values from obj2 override values in obj1.
	 * Function is NOT recursive and works only for one dimensional objects.
	 * @param {Object} obj1 First object.
	 * @param {Object} obj2 Second object.
	 * @return {Object} Returns combination of both objects.
	 */
	function merge(obj1, obj2)
	{
		var result = {}, name;

		for (name in obj1) 
			result[name] = obj1[name];
		
		for (name in obj2) 
			result[name] = obj2[name];
			
		return result;
	};
	/**
	 * Parses key/value pairs into hash object.
	 * 
	 * Understands the following formats:
	 * - name: word;
	 * - name: [word, word];
	 * - name: "string";
	 * - name: 'string';
	 * 
	 * For example:
	 *   name1: value; name2: [value, value]; name3: 'value'
	 *   
	 * @param {String} str    Input string.
	 * @return {Object}       Returns deserialized object.
	 */
	function parseParams(str)
	{
		var match, 
			result = {},
			arrayRegex = new XRegExp("^\\[(?<values>(.*?))\\]$"),
			regex = new XRegExp(
				"(?<name>[\\w-]+)" +
				"\\s*:\\s*" +
				"(?<value>" +
					"[\\w-%#]+|" +		// word
					"\\[.*?\\]|" +		// [] array
					'".*?"|' +			// "" string
					"'.*?'" +			// '' string
				")\\s*;?",
				"g"
			)
			;

		while ((match = regex.exec(str)) != null) 
		{
			var value = match.value
				.replace(/^['"]|['"]$/g, '') // strip quotes from end of strings
				;
			
			// try to parse array value
			if (value != null && arrayRegex.test(value))
			{
				var m = arrayRegex.exec(value);
				value = m.values.length > 0 ? m.values.split(/\s*,\s*/) : [];
			}
			
			result[match.name] = value;
		}
		
		return result;
	};
	
	
	/**
	 * Finds all elements on the page which should be processes by SyntaxHighlighter.
	 *
	 * @param {Object} globalParams		Optional parameters which override element's 
	 * 									parameters. Only used if element is specified.
	 * 
	 * @param {Object} element	Optional element to highlight. If none is
	 * 							provided, all elements in the current document 
	 * 							are returned which qualify.
	 *
	 * @return {Array}	Returns list of <code>{ target: DOMElement, params: Object }</code> objects.
	 */
	h.findElements=function(globalParams, element)
	{
		var elements = element ? [element] : toArray(document.getElementsByTagName(SyntaxHighlighter.config.tagName)), 
			conf = SyntaxHighlighter.config,
			result = []
			;

		// support for <SCRIPT TYPE="syntaxhighlighter" /> feature
		if (conf.useScriptTags)
			elements = elements.concat(getSyntaxHighlighterScriptTags());

		if (elements.length === 0) 
			return result;
	
		for (var i = 0; i < elements.length; i++) 
		{
			var item = {
				target: elements[i], 
				// local params take precedence over globals
				params: merge(globalParams, parseParams(elements[i].className))
			};

			if (item.params['brush'] == null)
				continue;
				
			result.push(item);
		}
		
		return result;
	}
	h.autoloader=function(){
		function n(c,a){
			for(var d=0;d<c.length;d++)i[c[d]]=a
		}
		function o(c){
			var a=document.createElement("script"),d=false;a.src=c;a.type="text/javascript";a.language="javascript";
			a.onload=a.onreadystatechange=function(){
				if(!d&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){
					d=true;e[c]=true;a:{for(var p in e)if(e[p]==false)break a;j&&SyntaxHighlighter.highlight(k)}a.onload=a.onreadystatechange=null;
					a.parentNode.removeChild(a)
				}
			};
			document.body.appendChild(a)
		}
		var f=arguments,l=h.findElements(),i={},e={},j=false,k=null,b;
		SyntaxHighlighter.all=function(c){k=c;j=true};
		for(b=0;b<f.length;b++){var m=f[b].pop?f[b]:f[b].split(/\s+/),g=m.pop();n(m,g)}
		for(b=0;b<l.length;b++)if(g=i[l[b].params.brush]){e[g]=false;o(g)}
	}
})();
