<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
  <head>
    <title>Core JavaScript Tests</title>

    <script language="JavaScript">
      function selectAll (suite, testDir)
      {
	  if (typeof suite == "undefined")
	      for (var suite in suites)
		  setAllDirs (suite, true);
	  else if (typeof testDir == "undefined")
	      setAllDirs (suite, true);
	  else
	      setAllTests (suite, testDir, true);
	  updateTotals();
      }

      function selectNone (suite, testDir)
      {
	  
	  if (typeof suite == "undefined")
	      for (var suite in suites)
		  setAllDirs (suite, false);
	  else if (typeof testDir == "undefined")
	      setAllDirs (suite, false);
	  else
	      setAllTests (suite, testDir, false);
	  updateTotals();	
      }

      function setAllDirs (suite, value)
      {
	  var dir;
	  for (dir in suites[suite].testDirs)
	      setAllTests (suite, dir, value);

      }

      function setAllTests (suite, testDir, value)
      {
	  var test, radioName;
	  
	  for (test in suites[suite].testDirs[testDir].tests)
	  {
	      radioName = suites[suite].testDirs[testDir].tests[test];
	      document.forms["testCases"].elements[radioName].checked = value;
	  }

      }

      function createList ()
      {
	  var suite, testDir, test, radioName;
	  var elements = document.forms["testCases"].elements;

	  var win = window.open ("about:blank", "other_window");
	  win.document.open();
	  win.document.write ("<pre>\n");
	  
	  win.document.write ("# Created " + new Date() + "\n");

	  for (suite in suites)
	      win.document.write ("# " + suite + ": " + 
				  elements["SUMMARY_" + suite].value + "\n");
	  win.document.write ("# TOTAL: " + elements["TOTAL"].value + "\n");

	  for (suite in suites)
	      for (testDir in suites[suite].testDirs)
		  for (test in suites[suite].testDirs[testDir].tests)
		  {  
		      radioName = suites[suite].testDirs[testDir].tests[test];
		      if (elements[radioName].checked)
			  win.document.write (suite + "/" + testDir + "/" + 
					      elements[radioName].value + "\n");
		  }
	  
	  win.document.close();

      }

      function onRadioClick (name)
      {
	  var radio = document.forms["testCases"].elements[name];
	  radio.checked = !radio.checked;
	  setTimeout ("updateTotals();", 100);
	  return false;
      }
    
      function updateTotals()
      {
	  var suite, testDir, test, radioName, selected, available, pct;
	  var totalAvailable = 0, totalSelected = 0;
	  
	  var elements = document.forms["testCases"].elements;

	  for (suite in suites)
	  {
	      selected = available = 0;
	      for (testDir in suites[suite].testDirs)
		  for (test in suites[suite].testDirs[testDir].tests)
		  {  
		      available++
		      radioName = suites[suite].testDirs[testDir].tests[test];
		      if (elements[radioName].checked)
			  selected++;
		  }
	      totalSelected += selected;
	      totalAvailable += available;
	      pct = parseInt((selected / available) * 100);
	      if (isNaN(pct))
		  pct = 0;
	      
	      elements["SUMMARY_" + suite].value = selected + "/" + available +
                  " (" + pct + "%) selected";
	  }

	  pct = parseInt((totalSelected / totalAvailable) * 100);
	  if (isNaN(pct))
	      pct = 0;
	      
	  elements["TOTAL"].value = totalSelected + "/" + totalAvailable + " (" +
	      pct + "%) selected";

      }
    
    </script>

  </head>

  <body bgcolor="white" onLoad="updateTotals()">
    <a name='top_of_page'></a>
    <h1>Core JavaScript Tests</h1>

    <form name="testCases">
    <input type='button' value='Export Test List' onClick='createList();'>
    <input type='button' value='Import Test List' 
      onClick='window.open("importList.html", "other_window");'>
