if (!window.didThisAlready) {

var SELECTORS = SELECTORS || '\
body\n\
div\n\
span\n\
a\n\
a.fn\n\
a.url\n\
a.fn.url\n\
body\n\
div\n\
body div\n\
div p\n\
div > p\n\
div + p\n\
div ~ p\n\
div[class^=exa][class$=mple]\n\
div p a\n\
div, p, a\n\
.note\n\
div.example\n\
ul .tocline2\n\
div.example, div.note\n\
#title\n\
h1#title\n\
div #title\n\
ul.toc li.tocline2\n\
ul.toc > li.tocline2\n\
h1#title + div > p\n\
h1[id]:contains(Selectors)\n\
a[href][lang][class]\n\
div[class]\n\
div[class=example]\n\
div[class^=exa]\n\
div[class$=mple]\n\
div[class*=e]\n\
div[class|=dialog]\n\
div[class!=made_up]\n\
div[class~=example]\n\
div:not(.example)\n\
p:contains(selectors)\n\
p:nth-child(even)\n\
p:nth-child(2n)\n\
p:nth-child(odd)\n\
p:nth-child(2n+1)\n\
p:nth-child(n)\n\
p:only-child\n\
p:last-child\n\
p:first-child\n\
';

document.getElementById('SELECTORS').innerHTML = SELECTORS;
SELECTORS = SELECTORS.split(/\r?\n/);
var q = Object.fromQueryString(document.location.search);

function loadFrameworkTests(framework){
	var url = 'lib/frameworks/'+framework.js+'.js';
	var sandbox = new SubtleSlickSpeed.Test.Sandboxed(framework.name, ["tests/selectors/template.js", url]);
	
	if (disableQSA) sandbox.eval('document.querySelectorAll = undefined;Element.prototype.querySelectorAll = undefined;');
	if (disableGBC) sandbox.eval('document.getElementsByClassName = undefined;Element.prototype.getElementsByClassName = undefined;');
	sandbox.addEvent('load:'+url, function(){
		
		// framework.queryFn = sandbox.eval(framework.queryFn);
		
		Array.each(SELECTORS, function(selector){
			if (!selector) return;
			// console.log(selector);
			// sandbox.eval("document.querySelectorAll = undefined; Element.prototype.querySelectorAll = undefined;");
			framework.runBefore && sandbox.eval(framework.runBefore);
			sandbox.eval("new SubtleSlickSpeed.Test('"+selector+";;;"+String.escapeSingle(framework.name)+"', function(){ return "+framework.queryFn+"('"+String.escapeSingle(selector)+"').length; })");
			// with (sandbox.window)
			// new SubtleSlickSpeed.Test(selector+";;;"+framework.name, function(){
			// 	return framework.queryFn(selector);
			// });
		});
	});
}

var Frameworks = {
	// 'jQuery 1.2.6':{
	// 	js:'jq-126',
	// 	queryFn:'$'
	// },
	// 'jQuery 1.3.2':{
	// 	js:'jq-132',
	// 	queryFn:'$'
	// },
	// 'Dojo 1.3':{
	// 	js:'dojo',
	// 	queryFn:'dojo.query'
	// },
	// 'Prototype 1.6.0.3':{
	// 	js:'proto-1603',
	// 	queryFn:'$$'
	// },
	'MooTools 1.2.4':{
		js:'../../../frameworks/mootools',
		queryFn:'$$'
	},
	// 'Slick (parse only)':{
	// 	js:'slick',
	// 	queryFn:'SubtleSlickParse'
	// },
	// 'Slick (parse only) nocache':{
	// 	js:'slick',
	// 	queryFn:'SubtleSlickParse.nocache=true; SubtleSlickParse'
	// },
	// 'NW Matcher 1.1.1':{
	// 	js:'nwmatcher',
	// 	runBefore:'NW.Dom.setCache(false);',
	// 	queryFn:'NW.Dom.select'
	// },
	// 'Sly v1.0rc2':{
	// 	js:'sly',
	// 	queryFn:'Sly.search'
	// },
	'Slick Stable':{
		js:'../../../frameworks/slick',
		runBefore:'document.search = function(selector){return Slick(document,selector)};',
		queryFn:'document.search'
	},
	'Slick WIP':{
		js:'../../../../slick',
		runBefore:'document.search = function(selector){return Slick(document,selector)};',
		queryFn:'document.search'
	// },
	// 'Evil Slick':{
	// 	js:'slick_dsl',
	// 	runBefore:'Matcher.nocache=false;SubtleSlickParse.nocache=true;',
	// 	queryFn:'document.search'
	// },
	// 'Evil Slick (no-cache)':{
	// 	js:'slick_dsl',
	// 	runBefore:'Matcher.nocache=true;SubtleSlickParse.nocache=true;',
	// 	queryFn:'document.search'
	}
};

function shouldExclude(str){
	if (!q.exclude) return false;
	
	q.exclude = $splat(q.exclude);
	
	for (var i = q.exclude.length - 1; i >= 0; i--){
		if (q.exclude[i] == str) return true;
	}
	return false;
};

Array.each(SELECTORS, UID.uidOf);
Object.each(Frameworks, function(framework, frameworkName){
	
	UID.uidOf(frameworkName);
	Array.each(SELECTORS, function(selector){
		UID.uidOf(selector + frameworkName);
	});
	
	framework.name = frameworkName;
	// console.log(q.exclude.indexOf(frameworkName))
	if (!shouldExclude(Frameworks[frameworkName].js))
		loadFrameworkTests(framework);
	else 
		Frameworks[frameworkName].stop = true;
});

var html = [], ex = document.getElementById('exclude');
html.push('Exclude: ');
for (var frameworkName in Frameworks) {
	html.push('<label><input name="exclude" type="checkbox" '+ (shouldExclude(Frameworks[frameworkName].js) ? 'checked="checked"' : '') +' value="' + String.escapeDouble(Frameworks[frameworkName].js) + '" /> '+frameworkName+'</label>');
}
// html.push('<input type="submit" value="Exclude" />')
ex.innerHTML = html.join('');


window.didThisAlready = true;}