// StyleFix 1.0.1 & PrefixFree 1.0.4 / by Lea Verou / MIT license
(function(){function h(a,b){return[].slice.call((b||document).querySelectorAll(a))}if(window.addEventListener){var b=window.StyleFix={link:function(a){try{if(!/\bstylesheet\b/i.test(a.rel)||!a.sheet.cssRules)return}catch(c){return}var d=a.href||a.getAttribute("data-href"),f=d.replace(/[^\/]+$/,""),g=a.parentNode,e=new XMLHttpRequest;e.open("GET",d);e.onreadystatechange=function(){if(4===e.readyState){var c=e.responseText;if(c&&a.parentNode){c=b.fix(c,!0,a);f&&(c=c.replace(/url\((?:'|")?(.+?)(?:'|")?\)/gi,
function(a,c){return!/^([a-z]{3,10}:|\/|#)/i.test(c)?'url("'+f+c+'")':a}),c=c.replace(RegExp("\\b(behavior:\\s*?url\\('?\"?)"+f,"gi"),"$1"));var d=document.createElement("style");d.textContent=c;d.media=a.media;d.disabled=a.disabled;d.setAttribute("data-href",a.getAttribute("href"));g.insertBefore(d,a);g.removeChild(a)}}};e.send(null);a.setAttribute("data-inprogress","")},styleElement:function(a){var c=a.disabled;a.textContent=b.fix(a.textContent,!0,a);a.disabled=c},styleAttribute:function(a){var c=
a.getAttribute("style"),c=b.fix(c,!1,a);a.setAttribute("style",c)},process:function(){h('link[rel~="stylesheet"]:not([data-inprogress])').forEach(StyleFix.link);h("style").forEach(StyleFix.styleElement);h("[style]").forEach(StyleFix.styleAttribute)},register:function(a,c){(b.fixers=b.fixers||[]).splice(void 0===c?b.fixers.length:c,0,a)},fix:function(a,c){for(var d=0;d<b.fixers.length;d++)a=b.fixers[d](a,c)||a;return a},camelCase:function(a){return a.replace(/-([a-z])/g,function(a,b){return b.toUpperCase()}).replace("-",
"")},deCamelCase:function(a){return a.replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()})}};(function(){setTimeout(function(){h('link[rel~="stylesheet"]').forEach(StyleFix.link)},10);document.addEventListener("DOMContentLoaded",StyleFix.process,!1)})()}})();
(function(h){if(window.StyleFix&&window.getComputedStyle){var b=window.PrefixFree={prefixCSS:function(a,c){function d(c,d,f,g){c=b[c];c.length&&(c=RegExp(d+"("+c.join("|")+")"+f,"gi"),a=a.replace(c,g))}var f=b.prefix;d("functions","(\\s|:|,)","\\s*\\(","$1"+f+"$2(");d("keywords","(\\s|:)","(\\s|;|\\}|$)","$1"+f+"$2$3");d("properties","(^|\\{|\\s|;)","\\s*:","$1"+f+"$2:");if(b.properties.length){var g=RegExp("\\b("+b.properties.join("|")+")(?!:)","gi");d("valueProperties","\\b",":(.+?);",function(a){return a.replace(g,
f+"$1")})}c&&(d("selectors","","\\b",b.prefixSelector),d("atrules","@","\\b","@"+f+"$1"));return a=a.replace(RegExp("-"+f,"g"),"-")},prefixSelector:function(a){return a.replace(/^:{1,2}/,function(a){return a+b.prefix})},prefixProperty:function(a,c){var d=b.prefix+a;return c?StyleFix.camelCase(d):d}};(function(){var a={},c=[],d=getComputedStyle(document.documentElement,null),f=document.createElement("div").style,g=function(b){if("-"===b.charAt(0)){c.push(b);var b=b.split("-"),d=b[1];for(a[d]=++a[d]||
1;3<b.length;)b.pop(),d=b.join("-"),StyleFix.camelCase(d)in f&&-1===c.indexOf(d)&&c.push(d)}};if(0<d.length)for(var e=0;e<d.length;e++)g(d[e]);else for(var i in d)g(StyleFix.deCamelCase(i));var e=0,j,h;for(h in a)d=a[h],e<d&&(j=h,e=d);b.prefix="-"+j+"-";b.Prefix=StyleFix.camelCase(b.prefix);b.properties=[];for(e=0;e<c.length;e++)i=c[e],0===i.indexOf(b.prefix)&&(j=i.slice(b.prefix.length),StyleFix.camelCase(j)in f||b.properties.push(j));"Ms"==b.Prefix&&!("transform"in f)&&!("MsTransform"in f)&&"msTransform"in
f&&b.properties.push("transform","transform-origin");b.properties.sort()})();(function(){function a(a,b){f[b]="";f[b]=a;return!!f[b]}var c={"linear-gradient":{property:"backgroundImage",params:"red, teal"},calc:{property:"width",params:"1px + 5%"},element:{property:"backgroundImage",params:"#foo"}};c["repeating-linear-gradient"]=c["repeating-radial-gradient"]=c["radial-gradient"]=c["linear-gradient"];var d={initial:"color","zoom-in":"cursor","zoom-out":"cursor",box:"display",flexbox:"display","inline-flexbox":"display"};
b.functions=[];b.keywords=[];var f=document.createElement("div").style,g;for(g in c){var e=c[g],i=e.property,e=g+"("+e.params+")";!a(e,i)&&a(b.prefix+e,i)&&b.functions.push(g)}for(var h in d)i=d[h],!a(h,i)&&a(b.prefix+h,i)&&b.keywords.push(h)})();(function(){function a(a){f.textContent=a+"{}";return!!f.sheet.cssRules.length}var c={":read-only":null,":read-write":null,":any-link":null,"::selection":null},d={keyframes:"name",viewport:null,document:'regexp(".")'};b.selectors=[];b.atrules=[];var f=h.appendChild(document.createElement("style")),
g;for(g in c){var e=g+(c[g]?"("+c[g]+")":"");!a(e)&&a(b.prefixSelector(e))&&b.selectors.push(g)}for(var i in d)e=i+" "+(d[i]||""),!a("@"+e)&&a("@"+b.prefix+e)&&b.atrules.push(i);h.removeChild(f)})();b.valueProperties=["transition","transition-property"];h.className+=" "+b.prefix;StyleFix.register(b.prefixCSS)}})(document.documentElement);

/**
 * Super simple syntax highlighting
 * @author Lea Verou
 */
RegExp.create = function(str, replacements, flags) {
	for(var id in replacements) {
		var replacement = replacements[id],
			idRegExp = RegExp('{{' + id + '}}', 'gi');
		
		if(replacement.source) {
			replacement = replacement.source.replace(/^\^|\$$/g, '');
		}
		
		// Don't add extra parentheses if they already exist
		str = str.replace(RegExp('\\(' + idRegExp.source + '\\)', 'gi'), '(' + replacement + ')');
		
		str = str.replace(idRegExp, '(?:' + replacement + ')');
	}
	
	return RegExp(str, flags);
};

(function(){

var number = /-?\d*\.?\d+/

var _ = self.Highlight = {
	languages: {
		javascript: {
			'comment': /(\/\*[\w\W]*?\*\/)|\/\/.*?(\r?\n|$)/g,
			'string': /(('|").*?(\2))/g, // used to be: /'.*?'|".*?"/g,
			'keyword': /\b(var|let|if|else|while|do|for|return|in|instanceof|function|new|with|typeof)\b/g,
			'boolean': /\b(true|false)\b/g,
			'number': /\b-?(0x)?\d*\.?\d+\b/g,
			'regex': /\/.+?\/[gim]{0,3}/g
		},
		css: {
			'comment': /\/\*[\w\W]*?\*\//g,
			'atrule': /@[\w-]+?(\s+[^{]+)?(?=\s*{)/gi,
			'selector': /[^\{\}\s][^\{\}]+(?=\s*\{)/g,
			'property': /(\b|\B)[a-z-]+(?=\s*:)/ig,
			'gradient': /\b(repeating-)?(linear|radial)-gradient\(((rgb|hsl)a?\(.+?\)|[^\)])+\)/gi,
			'color': null, // added later
			'important': /\B!important\b/gi,
			'abslength': RegExp.create('(\\b|\\B)({{number}}{{unit}})|0\\b', {
					number: number,
					unit: /(cm|mm|in|pt|pc|px|%)/
				}, 'gi'),
			'easing': RegExp.create('\\b{{bezier}}\\B|\\b{{keyword}}(?=\\s|;|\\}|$)', {
					bezier: RegExp.create('cubic-bezier\\(({{number}},\\s*){3}{{number}}\\)', {
						number: number
					}),
					keyword: /linear|ease(-in)?(-out)?/
				}, 'gi'),
			'time': RegExp.create('(\\b|\\B){{number}}m?s\\b', {
					number: number
				}, 'gi'),
			'angle': RegExp.create('(\\b|\\B){{number}}(deg|g?rad|turn)\\b', {
					number: number
				}, 'gi'),
			'fontfamily': /(("|')[\w\s]+\2,\s*|\w+,\s*)*(sans-serif|serif|monospace|cursive|fantasy)\b/gi,
			'keyword': /(inherit|absolute|relative|rotate|''|auto)/gi,
			'punctuation': /[\{\};:()]/g
		},
		html: {
			'comment': /&lt;!--[\w\W]*?--(>|&gt;)/g,
			'tag': {
				'pattern': /(&lt;|<)\/?[\w\W]+?(>|&gt;)/gi,
				'inside': {
					'attr-value': {
						'pattern': /[\w-]+=(('|").*?(\2)|[^\s>]+(?=>|&|\s))/gi,
						'inside': {
							'attr-name': /^[\w-]+(?==)/gi,
							'punctuation': /=/g
						}
					},
					'attr-name': /\s[\w-]+(?=\s)/gi,
					'punctuation': /&lt;\/?|&gt;/g
				}
			}
		}
	},
	
	init: function(code, useWorkers, callback) {
		if(!code) {
			return;
		}
		
		var lang = _.languages[code.getAttribute('lang')];
		
		if(!lang) {
			return;
		}
		
		var text = code.textContent
					.replace(/&/g, '&amp;')
					.replace(/</g, '&lt;')
					.replace(/>/g, '&gt;')
					.replace(/\u00a0/g, ' ');
		
		if(useWorkers && self.Worker) {
			if(self.worker) {
				self.worker.terminate();
			}	
				
			self.worker = new Worker('/code-highlight.js');	
			
			worker.onmessage = function(evt) {
				code.innerHTML = evt.data;
				callback && callback();
			};
			
			worker.postMessage(code.getAttribute('lang') + '|' + text);
		}
		else {
			code.innerHTML = _.do(text, lang);
			callback && callback();
		}
	},
	
	do: function(text, tokens) {
		var strarr = [text];
								
		for(var token in tokens) {
			var pattern = tokens[token], 
				inside = pattern.inside;
			pattern = pattern.pattern || pattern;
			
			for(var i=0; i<strarr.length; i++) {
				
				var str = strarr[i];
				
				if(str.token) {
					continue;
				}
				
				pattern.lastIndex = 0;
				var match = pattern.exec(str);
				
				if(match) {
					var to = pattern.lastIndex,
						match = match[0],
						len = match.length,
						from = to - len,
						before = str.slice(0, from),
						after = str.slice(to); 
					
					
					strarr.splice(i, 1);
					
					if(before) {
						strarr.splice(i++, 0, before);
					}
					
					var wrapped = 
						new String(
							_.wrap(
								token,
								inside && (before || after)? _.do(match, inside) : match
							)
						);
					
					wrapped.token = true;
					strarr.splice(i, 0, wrapped);
					
					if(after) {
						
						strarr.splice(i+1, 0, after);
					}
				}
			}
		}

		return strarr.join('');
	},
	
	wrap: function(token, content) {
		return '<span class="token ' + token + (token === 'comment'? '" spellcheck="true' : '') + '">' + content + '</span>' 
	}
}

if(!self.document) {
	// In worker
	self.addEventListener('message', function(evt) {
		var message = evt.data,
			i = message.indexOf('|'),
			lang = message.slice(0,i),
			code = message.slice(i+1);
		
		self.postMessage(_.do(code, _.languages[lang]));
	}, false);
}

// CSS colors
var colors = [
	'black',
	'white',
	'red'
];

_.languages.css.color = RegExp.create('\\b{{keyword}}\\b|\\b{{func}}\\B|\\B{{hex}}\\b', {
	keyword: RegExp('^' + colors.join('|') + '$'),
	func: RegExp.create('^(?:rgb|hsl)a?\\((?:\\s*{{number}}%?\\s*,?\\s*){3,4}\\)$', {
		number: number
	}),
	hex: /^#(?:[0-9a-f]{3}){1,2}$/i
}, 'ig');

})();

var codes = document.getElementsByTagName('code');
for (var i=0, ii=codes.length; i<ii; i++) {
	Highlight.init(codes[i]);
}
