var validateValues = [];
var formatWidgetCount = 0;
var validateWidgetCount = 0;
function getElementsById(id){
	var result = [];	
	if(!id || typeof(id) != "string"){
		return result;
	}
	var ae = document.getElementsByTagName(dojo.byId(id).tagName);
	for(var i = 0; i < ae.length; i++){
		if(ae[i].id == id){
			result.push(ae[i]);
		}
	}
	return result;
}
function getString(n){
	return n && n.toString();
}
function startTest(t){
	startTestFormat(t);
	startTestValidate(t);
}
function escapeEx(s){
	var result = "";
	for(var i = 0; i < s.length; i++){
		var c = s.charAt(i);
		switch (c){
			case '"':
				result += '\\"';
				break;
			case "'":
				result += "\\'";
				break;
			default:
				result += escape(c);
				break;
		}
	}
	return result;
}
function getAllTestCases(){
	var allTestCases = [];
	for(var i = 0; i < formatWidgetCount; i++){
		allTestCases.push({
			name: "format-" + i,
			runTest: new Function("t", "startTestFormat(" + i + ", t)")
		});
	}
	for(var i = 0; i < validateWidgetCount; i++){
		allTestCases.push({
			name: "validate-" + i,
			runTest: new Function("t", "startTestValidate(" + i + ", t)")
		});
	}
	return allTestCases;
}
function startTestFormat(i, t){
	var test_node = dojo.doc.getElementById("test_display_" + i);
	var exp = dojo.doc.getElementById("test_display_expected_" + i).value;
	var res_node = dojo.doc.getElementById("test_display_result_" + i);
	res_node.innerHTML = test_node.value;
	res_node.style.backgroundColor = (test_node.value == exp) ? "#AFA" : "#FAA";
	res_node.innerHTML += " Compare (Escaped)";
	t.is(exp, test_node.value);
}
function startTestValidate(i, t){
	/*
	 * The dijit.byNode has an issue: cannot handle same id.
	 */
	var test_node = dojo.doc.getElementById("test_validate_" + i);
	var inp_node = dojo.doc.getElementById("test_validate_input_" + i);
	var exp = dojo.doc.getElementById("test_validate_expected_" + i).innerHTML;
	var res_node = dojo.doc.getElementById("test_validate_result_" + i);
	var val_node = dojo.doc.getElementById("test_display_value_" + i);
	test_node.value = inp_node.value;
	/*
	 * The dijit.byNode has an issue.
	 */
	var widget = null;
	var node = test_node;
	while ((widget = dijit.byNode(node)) == null){
		node = node.parentNode;
		if(!node){
			break;
		}
	}
	if(widget){
		widget.focus();
		var expected = validateValues[i];
		var result = widget.getValue();
		if(validateValues[i].processValue){
			expected = validateValues[i].processValue(expected);
			result = validateValues[i].processValue(result);
		}
		var parseCorrect = getString(expected) == getString(result);
		val_node.style.backgroundColor = parseCorrect ?  "#AFA" : "#FAA";
		val_node.innerHTML = getString(result) + (parseCorrect ? "" : "
Expected: " + getString(expected));
		res_node.innerHTML = widget.isValid && !widget.isValid() ? "Wrong" : "Correct";
		res_node.style.backgroundColor = res_node.innerHTML == exp ? "#AFA" : "#FAA";
		t.is(getString(expected), getString(result));
	}
}
function genFormatTestCase(desc, dojoType, dojoAttrs, value, expValue, comment){
	dojo.doc.write("
");
	dojo.doc.write("| " + desc + " | ");
	dojo.doc.write("");
	dojo.doc.write("");
	dojo.doc.write(" | ");
	dojo.doc.write(" | ");
	dojo.doc.write(" | ");
	dojo.doc.write("" + comment + " | ");
	dojo.doc.write("
");
	formatWidgetCount++;
}
/*
[
	{attrs: {currency: "CNY", lang: "zh-cn"}, desc: "", value:"-123456789.46", expValue: "", comment: ""},
	...
]
*/
function genFormatTestCases(title, dojoType, testCases){
	dojo.doc.write("" + title + "
");
	dojo.doc.write("");
	dojo.doc.write("");
	dojo.doc.write("| Test Description | ");
	dojo.doc.write("Test | ");
	dojo.doc.write("Expected | ");
	dojo.doc.write("Result | ");
	dojo.doc.write("Comment | ");
	dojo.doc.write("
");
	for(var i = 0; i < testCases.length; i++){
		var testCase = testCases[i];
		genFormatTestCase(testCase.desc, dojoType, testCase.attrs, testCase.value, testCase.expValue, testCase.comment);
	}
	dojo.doc.write("
");
}
function genValidateTestCase(desc, dojoType, dojoAttrs, input, value, comment, isWrong){
	dojo.doc.write("");
	dojo.doc.write("| " + desc + " | ");
	dojo.doc.write("");
	dojo.doc.write("");
	dojo.doc.write(" | ");
	dojo.doc.write(" | ");
	dojo.doc.write(" | ");
	dojo.doc.write("" + (isWrong ? "Wrong" : "Correct") + " | ");
	dojo.doc.write(" | ");
	dojo.doc.write("" + comment + " | ");
	dojo.doc.write("
");
	validateValues.push(value);
	validateWidgetCount++;
}
/*
[
	{attrs: {currency: "CNY", lang: "zh-cn"}, desc: "", value:false, expValue: "-123456789.46", comment: ""},
	...
]
*/
function genValidateTestCases(title, dojoType, testCases){
	dojo.doc.write("" + title + "
");
	dojo.doc.write("");
	dojo.doc.write("");
	dojo.doc.write("| Test Description | ");
	dojo.doc.write("Test | ");
	dojo.doc.write("Input | ");
	dojo.doc.write("Parsed Value | ");
	dojo.doc.write("Expected | ");
	dojo.doc.write("Result | ");
	dojo.doc.write("Comment | ");
	dojo.doc.write("
");
	for(var i = 0; i < testCases.length; i++){
		var testCase = testCases[i];
		genValidateTestCase(testCase.desc, dojoType, testCase.attrs, testCase.expValue, testCase.value, testCase.comment, testCase.isWrong);
	}
	dojo.doc.write("
");
}