fu: Close-up of Fu, bringing a scoop of water to her mouth (Default)
fu ([personal profile] fu) wrote in [site community profile] changelog2010-12-29 05:13 am

[dw-free] Need consistent styling across the site

[commit: http://hg.dwscoalition.org/dw-free/rev/51f91108e1ed]

http://bugs.dwscoalition.org/show_bug.cgi?id=3243

Tweak HTML -- use thead where applicable; this improves the styling in most
cases. Also tweak the logic/class names for alternating rows in a couple of
pages (missed them!)

Patch by [personal profile] fu.


Files modified:
  • cgi-bin/DW/Setting/XPostAccounts.pm
  • cgi-bin/LJ/SpellCheck.pm
  • cgi-bin/LJ/Widget/LinksList.pm
  • cgi-bin/LJ/Widget/ManageSiteMessages.pm
  • htdocs/admin/faq/faqcat.bml
  • htdocs/admin/invites/codetrace.bml
  • htdocs/admin/invites/promo.bml
  • htdocs/admin/invites/requests.bml
  • htdocs/admin/invites/review.bml
  • htdocs/admin/memcache.bml
  • htdocs/admin/navtag.bml
  • htdocs/admin/pay/index.bml
  • htdocs/admin/priv/index.bml
  • htdocs/admin/schema/index.bml
  • htdocs/admin/spamreports.bml
  • htdocs/admin/statushistory.bml
  • htdocs/admin/sysban.bml
  • htdocs/admin/translate/help-severity.bml
  • htdocs/admin/translate/index.bml
  • htdocs/admin/translate/teams.bml
  • htdocs/admin/userlog.bml
  • htdocs/community/manage.bml
  • htdocs/community/members.bml
  • htdocs/community/moderate.bml
  • htdocs/community/pending.bml
  • htdocs/community/sentinvites.bml
  • htdocs/customize/advanced/layers.bml
  • htdocs/feeds/index.bml
  • htdocs/feeds/list.bml
  • htdocs/manage/banusers.bml
  • htdocs/manage/emailpost.bml
  • htdocs/manage/invitecodes.bml
  • htdocs/manage/invites.bml
  • htdocs/manage/logins.bml
  • htdocs/manage/moodthemes.bml
  • htdocs/shop/history.bml
  • htdocs/support/help.bml
  • htdocs/support/highscores.bml
  • htdocs/support/history.bml
  • htdocs/tools/emailmanage.bml
  • htdocs/tools/recent_comments.bml
  • htdocs/tools/recent_emailposts.bml
  • views/admin/rename.tt
  • views/interests/findsim.tt
  • views/interests/popular.tt
  • views/stats/site.tt
--------------------------------------------------------------------------------
diff -r dec5adeda112 -r 51f91108e1ed cgi-bin/DW/Setting/XPostAccounts.pm
--- a/cgi-bin/DW/Setting/XPostAccounts.pm	Wed Dec 29 11:11:03 2010 +0800
+++ b/cgi-bin/DW/Setting/XPostAccounts.pm	Wed Dec 29 13:13:46 2010 +0800
@@ -65,6 +65,7 @@ sub option {
     $ret .= "<h2>" . $class->ml('setting.xpost.accounts') ."</h2><br/>"; 
     $ret .= "<table class='setting_table'>\n";
     if (scalar @accounts) {
+        $ret .= "<thead>";
         $ret .= "<tr>\n";
         $ret .= "<th>" . $class->ml('setting.xpost.option.username') . "</th>\n";
         $ret .= "<th>" . $class->ml('setting.xpost.option.server') . "</th>\n";
@@ -73,6 +74,7 @@ sub option {
         $ret .= "<th>" . $class->ml('setting.xpost.option.change') . "</th>\n";
         $ret .= "<th>" . $class->ml('setting.xpost.option.delete') . "</th>\n";
         $ret .= "</tr>\n";
+        $ret .= "</thead>";
 
         # display each account
         foreach my $externalacct (@accounts) {
diff -r dec5adeda112 -r 51f91108e1ed cgi-bin/LJ/SpellCheck.pm
--- a/cgi-bin/LJ/SpellCheck.pm	Wed Dec 29 11:11:03 2010 +0800
+++ b/cgi-bin/LJ/SpellCheck.pm	Wed Dec 29 13:13:46 2010 +0800
@@ -138,7 +138,7 @@ sub check_html {
     $iwrite->close;
 
 
-    return ( ( $mscnt || $other_bad ) ? "$output<table cellpadding=3 border=0><tr><th>Text</th><th>Suggestions</th></tr>$footnotes</table>" : "" );
+    return ( ( $mscnt || $other_bad ) ? "$output<table cellpadding=3 border=0><thead><tr><th>Text</th><th>Suggestions</th></tr></thead>$footnotes</table>" : "" );
 }
 
 1;
diff -r dec5adeda112 -r 51f91108e1ed cgi-bin/LJ/Widget/LinksList.pm
--- a/cgi-bin/LJ/Widget/LinksList.pm	Wed Dec 29 11:11:03 2010 +0800
+++ b/cgi-bin/LJ/Widget/LinksList.pm	Wed Dec 29 13:13:46 2010 +0800
@@ -49,8 +49,8 @@ sub render_body {
     $showlinks = $caplinks if $showlinks > $caplinks;
 
     $ret .= "<table border='0' cellspacing='5' cellpadding='0'>";
-    $ret .= "<tr><th>" . $class->ml('widget.linkslist.table.order') . "</th>";
-    $ret .= "<th>" . $class->ml('widget.linkslist.table.title') . "</th><td>&nbsp;</td></tr>";
+    $ret .= "<thead><tr><th>" . $class->ml('widget.linkslist.table.order') . "</th>";
+    $ret .= "<th>" . $class->ml('widget.linkslist.table.title') . "</th><td>&nbsp;</td></tr></thead>";
 
     foreach my $ct (1..$showlinks) {
         my $it = $linkobj->[$ct-1] || {};
diff -r dec5adeda112 -r 51f91108e1ed cgi-bin/LJ/Widget/ManageSiteMessages.pm
--- a/cgi-bin/LJ/Widget/ManageSiteMessages.pm	Wed Dec 29 11:11:03 2010 +0800
+++ b/cgi-bin/LJ/Widget/ManageSiteMessages.pm	Wed Dec 29 13:13:46 2010 +0800
@@ -58,7 +58,7 @@ sub render_body {
     return $ret . "<?p No messages started during the selected month. p?>" unless @this_months_messages;
 
     $ret .= "<table border='1' cellpadding='3'>";
-    $ret .= "<tr><th>Message</th><th>Start Date</th><th>End Date</th><th colspan='2'>Active Status</th><th>Edit</th></tr>";
+    $ret .= "<thead><tr><th>Message</th><th>Start Date</th><th>End Date</th><th colspan='2'>Active Status</th><th>Edit</th></tr></thead>";
     foreach my $row (@this_months_messages) {
         my $start_date = DateTime->from_epoch( epoch => $row->{time_start}, time_zone => 'America/Los_Angeles' );
         my $end_date = DateTime->from_epoch( epoch => $row->{time_end}, time_zone => 'America/Los_Angeles' );
diff -r dec5adeda112 -r 51f91108e1ed htdocs/admin/faq/faqcat.bml
--- a/htdocs/admin/faq/faqcat.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/admin/faq/faqcat.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -210,7 +210,7 @@ body<=
             $ret .= "<form action='faqcat.bml' method='post'>\n";
             $ret .= LJ::form_auth();
             $ret .= LJ::html_hidden( 'faqcats' => join ( ",", map { $faqcat{$_}->{faqcat} } keys %faqcat ) );
-            $ret .= "<table><tr><th style='padding: 5px'><?_ml .label.catname _ml?></th><th style='padding: 5px'><?_ml .label.catkey _ml?></th><th style='padding: 5px'><?_ml .label.catorder _ml?></th><th>&nbsp;</th><th>&nbsp;</th><th>&nbsp;</th><th>&nbsp</th></tr>";
+            $ret .= "<table><thead><tr><th style='padding: 5px'><?_ml .label.catname _ml?></th><th style='padding: 5px'><?_ml .label.catkey _ml?></th><th style='padding: 5px'><?_ml .label.catorder _ml?></th><th>&nbsp;</th><th>&nbsp;</th><th>&nbsp;</th><th>&nbsp</th></tr></thead>";
 
             foreach my $faqcat ( sort { $faqcat{$a}->{catorder} <=> $faqcat{$b}->{catorder} } keys %faqcat ) {
 
diff -r dec5adeda112 -r 51f91108e1ed htdocs/admin/invites/codetrace.bml
--- a/htdocs/admin/invites/codetrace.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/admin/invites/codetrace.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -57,7 +57,7 @@ sub display_codes {
 sub display_codes {
     my ($account, @codes) = @_;
 
-    my $ret = "<table border='1' cellpadding='5'><tr><th>Code</th><th>Owner</th><th>Recipient</th><th>Reason</th><th>Date generated</th><th>Date sent</th><th>Date used</th><th>Email</th></tr>";
+    my $ret = "<table border='1' cellpadding='5'><thead><tr><th>Code</th><th>Owner</th><th>Recipient</th><th>Reason</th><th>Date generated</th><th>Date sent</th><th>Date used</th><th>Email</th></tr></thead>";
 
     foreach my $code ( @codes ) {
         my $owner = $code->owner == $account->id ? $account : LJ::load_userid( $code->owner );
diff -r dec5adeda112 -r 51f91108e1ed htdocs/admin/invites/promo.bml
--- a/htdocs/admin/invites/promo.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/admin/invites/promo.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -213,7 +213,7 @@ body<=
         $ret .= '<a href="/admin/invites/promo?state=noneleft">' . $ML{'.state.noneleft'} . '</a>';
 
         $ret .= "<table>";
-        $ret .= "<tr><th>$ML{'.heading.code'}</th><th>$ML{'.heading.active'}</th><th>$ML{'.heading.count'}</th><th>$ML{'.heading.suggest'}</th><th>$ML{'.heading.paid'}</tr>";
+        $ret .= "<thead><tr><th>$ML{'.heading.code'}</th><th>$ML{'.heading.active'}</th><th>$ML{'.heading.count'}</th><th>$ML{'.heading.suggest'}</th><th>$ML{'.heading.paid'}</tr></thead>";
         
         if ( scalar( @$codes ) ) {
             foreach my $code (@$codes) {
diff -r dec5adeda112 -r 51f91108e1ed htdocs/admin/invites/requests.bml
--- a/htdocs/admin/invites/requests.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/admin/invites/requests.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -59,7 +59,7 @@ body<=
     $ret .= "<form method='post'>";
     $ret .= LJ::form_auth();
     $ret .= "<table>";
-    $ret .= "<tr><th>User</th><th>Time Generated</th><th>P/C</th><th>Ct</th><th>Give</th><th>Reason</th></tr>";
+    $ret .= "<thead><tr><th>User</th><th>Time Generated</th><th>P/C</th><th>Ct</th><th>Give</th><th>Reason</th></tr></thead>";
     foreach my $outstanding ( @outstanding ) {
         my $u = $users->{$outstanding->userid};
         
diff -r dec5adeda112 -r 51f91108e1ed htdocs/admin/invites/review.bml
--- a/htdocs/admin/invites/review.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/admin/invites/review.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -53,7 +53,7 @@ body<=
 
     my @codes = DW::InviteCodes->by_owner( userid => $u->id );
     $ret .= "<table>";
-    $ret .= "<tr><th>Recipient</th><th>Last Active</th><th>Paid?</th></tr>";
+    $ret .= "<thead><tr><th>Recipient</th><th>Last Active</th><th>Paid?</th></tr></thead>";
 
     foreach my $code ( @codes ) {
         my $recipient = LJ::load_userid( $code->recipient );
@@ -73,7 +73,7 @@ body<=
     $ret .= "<?h2 Requests for Invite Codes h2?>";    
     my @requests = DW::InviteCodeRequests->by_user( userid => $u->id );
     $ret .= "<table>";
-    $ret .= "<tr><th>Requested on</th><th>Processed on</th><th>Status</th><th>Request reason</th></tr>";
+    $ret .= "<thead><tr><th>Requested on</th><th>Processed on</th><th>Status</th><th>Request reason</th></tr></thead>";
 
     foreach my $request ( @requests ) {
         $ret .= "<tr>";
diff -r dec5adeda112 -r 51f91108e1ed htdocs/admin/memcache.bml
--- a/htdocs/admin/memcache.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/admin/memcache.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -46,7 +46,7 @@ _c?>
 </div>
 <h1>Memory Cache Overview</h1>
 <table border='1' cellpadding='5'>
-<tr><th>Host</th><th>Hit Rate</th><th>Curr/Max Size</th><th><span title='Utilization'>Utlz %</span></th><th>Uptime</th><th>Version</th></tr>
+<thead><tr><th>Host</th><th>Hit Rate</th><th>Curr/Max Size</th><th><span title='Utilization'>Utlz %</span></th><th>Uptime</th><th>Version</th></tr></thead>
 END_TOP
     }
 
@@ -153,7 +153,7 @@ END_TOP
 
 	    $ret .= "<h2>Slab classes</h2>";
 	    $ret .= "<table border='1' cellpadding='2'>";
-	    $ret .= "<tr><th>class</th><th>size</th><th>used</th><th>total</th><th colspan='2'>free</th><th>pages</th><th>max age</th></tr>\n";
+	    $ret .= "<thead><tr><th>class</th><th>size</th><th>used</th><th>total</th><th colspan='2'>free</th><th>pages</th><th>max age</th></tr></thead>\n";
 	    foreach my $cls (0..31) {
 		my $size = $stat{'slabs'}{"$cls:chunk_size"};
 		next unless $size;
diff -r dec5adeda112 -r 51f91108e1ed htdocs/admin/navtag.bml
--- a/htdocs/admin/navtag.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/admin/navtag.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -112,7 +112,7 @@ _c?>
 	    $ret .= LJ::html_text({ name => 'add_tags', size => 30 });
 	    $ret .= LJ::html_hidden('add_tags_url', $dest);
 	} else {
-	    $ret .= "<table><tr><th>Add Tags</th><th>URL</th></tr>";
+	    $ret .= "<table><thead><tr><th>Add Tags</th><th>URL</th></tr></thead>";
 	    $ret .= "<tr><td>";
 	    $ret .= LJ::html_text({ name => 'add_tags', size => 30 });
 	    $ret .= "</td><td>";
@@ -153,7 +153,7 @@ _c?>
         $ret .= LJ::form_auth();
         $ret .= "<?h1 Tags Pointing At " . LJ::ehtml($url) . " h1?>";
 
-        $ret .= "<table><tr><th>Tag</th><th>Remove</th></tr>";
+        $ret .= "<table><thead><tr><th>Tag</th><th>Remove</th></tr></thead>";
 
         my $dest = LJ::NavTag::Dest->new_from_url($url);
 
@@ -181,7 +181,7 @@ _c?>
 	my $ret;
 
 	$ret .= "<?h1 Destinations Of Tag " . LJ::ehtml($tag) . " h1?>";
-	$ret .= "<table><tr><th>Title</th><th>Destination</th></tr>";
+	$ret .= "<table><thead><tr><th>Title</th><th>Destination</th></tr></thead>";
 
 	my @dests = LJ::NavTag->dests_of_tag($tag);
 
diff -r dec5adeda112 -r 51f91108e1ed htdocs/admin/pay/index.bml
--- a/htdocs/admin/pay/index.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/admin/pay/index.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -133,8 +133,8 @@ EOF
 
         if ( @carts ) {
             $body .= "<table border='1'>";
-            $body .= "<tr><th>Cart Number</th><th>Date</th><th>Total</th>";
-            $body .= "<th>Payment Method</th><th>Status</th><th>Details</th>";
+            $body .= "<thead><tr><th>Cart Number</th><th>Date</th><th>Total</th>";
+            $body .= "<th>Payment Method</th><th>Status</th><th>Details</th></tr></thead>";
             foreach my $cart ( @carts ) {
                 my $state = $cart->state;
                 my $paymentmethod = $cart->paymentmethod;
diff -r dec5adeda112 -r 51f91108e1ed htdocs/admin/priv/index.bml
--- a/htdocs/admin/priv/index.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/admin/priv/index.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -208,7 +208,7 @@ body<=
         $ret .= "<input type='hidden' name='user' value='$user' />\n";
         $sth = $dbh->prepare("SELECT pm.prmid, pm.prlid, pm.arg FROM priv_map pm, priv_list pl WHERE pm.prlid=pl.prlid AND pm.userid=$userid ORDER BY pl.privcode,pm.arg");
         $sth->execute;
-        $ret .= "<table cellpadding='5' cellspacing='1' border='1'><tr><th>Revoke</th><th>Privilege</th><th>Arg</th></tr>\n";
+        $ret .= "<table cellpadding='5' cellspacing='1' border='1'><thead><tr><th>Revoke</th><th>Privilege</th><th>Arg</th></tr></thead>\n";
         while (my ($prmid, $prlid, $arg) = $sth->fetchrow_array)
         {
             my $prec = $priv{$prlid};
@@ -294,7 +294,7 @@ body<=
                           "FROM priv_map pm, useridmap u WHERE pm.prlid=$priv AND pm.userid=u.userid$viewarg ".
                           "ORDER BY u.user,pm.arg LIMIT $skip,$limit");
         $sth->execute;
-        $ret .= "<table cellpadding='5' cellspacing='1' border='1'><tr><th>Revoke</th><th>User</th><th>Arg</th></tr>\n";
+        $ret .= "<table cellpadding='5' cellspacing='1' border='1'><thead><tr><th>Revoke</th><th>User</th><th>Arg</th></tr></thead>\n";
 
         my $showgrant = remote_can_grant($remote, $pcode, $FORM{'viewarg'});
         my $foundcount = 0;
diff -r dec5adeda112 -r 51f91108e1ed htdocs/admin/schema/index.bml
--- a/htdocs/admin/schema/index.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/admin/schema/index.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -48,7 +48,7 @@ body<=
          $table{$name} = { 'public' => $public, 'des' => $des };
      }
 
-     $body .= "<?h1 Tables h1?><?p Click a table for more information. p?><p><table cellpadding=4><tr bgcolor=<?emcolor?>><th>Table</th><th>Description</th></tr>\n";
+     $body .= "<?h1 Tables h1?><?p Click a table for more information. p?><p><table cellpadding=4><thead><tr bgcolor=<?emcolor?>><th>Table</th><th>Description</th></tr></thead>\n";
      $sth = $dbh->prepare("SHOW TABLES");
      $sth->execute;
      while (my ($table) = $sth->fetchrow_array) {
@@ -99,14 +99,14 @@ body<=
 
      $sth = $dbh->prepare("DESCRIBE $table");
      $sth->execute;
-     $body .= "<table cellpadding=3><tr bgcolor=<?emcolor?>>";
+     $body .= "<table cellpadding=3><thead><tr bgcolor=<?emcolor?>>";
      $body .= "<th>Key?</th>";
      $body .= "<th>Column</th>";
      $body .= "<th>Type</th>";
      $body .= "<th>Null</th>";
      $body .= "<th>Default</th>";
      $body .= "<th>Description</th>";
-     $body .= "</tr>\n";
+     $body .= "</tr></thead>\n";
      while (my $row = $sth->fetchrow_hashref)
      {
          my $name = $row->{'Field'};
@@ -148,11 +148,11 @@ body<=
 
      $sth = $dbh->prepare("SELECT * FROM $table LIMIT $MAX_ROWS");
      $sth->execute;
-     $body .= "<table cellpadding=3><tr bgcolor=<?emcolor?>>";
+     $body .= "<table cellpadding=3><thead><tr bgcolor=<?emcolor?>>";
      foreach my $col (@{$sth->{'NAME'}}) {
          $body .= "<th>$col</th>\n";
      }
-     $body .= "</tr>\n";
+     $body .= "</tr></thead>\n";
 
      while (my $row = $sth->fetchrow_arrayref) {
          $body .= "<tr valign=top>\n";
@@ -194,11 +194,11 @@ body<=
 
      $sth = $dbh->prepare("DESCRIBE $table");
      $sth->execute;
-     $body .= "<p><table cellpadding=3><tr bgcolor=<?emcolor?>>";
+     $body .= "<p><table cellpadding=3><thead><tr bgcolor=<?emcolor?>>";
      $body .= "<th>Column</th>";
      $body .= "<th>Type</th>";
      $body .= "<th>Description</th>";
-     $body .= "</tr>\n";
+     $body .= "</tr></thead>\n";
      while (my $row = $sth->fetchrow_hashref)
      {
          my $name = $row->{'Field'};
diff -r dec5adeda112 -r 51f91108e1ed htdocs/admin/spamreports.bml
--- a/htdocs/admin/spamreports.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/admin/spamreports.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -288,9 +288,9 @@ _c?>
     # now spit out the requested table
     return unless @headers;
     $body .= "<?p [ <a href=\"spamreports\">&lt;&lt; Front Page</a> ] p?>";
-    $body .= "<table width=\"50%\">\n<tr>";
+    $body .= "<table width=\"50%\">\n<thead><tr>";
     $body .= "<th align=\"center\">$_</th>" foreach @headers;
-    $body .= "</tr>\n";
+    $body .= "</tr></thead>\n";
     foreach (@rows) {
         $body .= "<tr>";
         $body .= "<td align=\"center\">$_</td>" foreach @$_;
diff -r dec5adeda112 -r 51f91108e1ed htdocs/admin/statushistory.bml
--- a/htdocs/admin/statushistory.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/admin/statushistory.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -91,13 +91,13 @@ _c?>
         $ret .= "&nbsp;&nbsp;$_=" . LJ::eall($FORM{$_}) if $FORM{$_}
     }
     $ret .= "</b></p>\n";
-    $ret .= "<table border='1' cellpadding='5' width='100%'>\n<tr>";
+    $ret .= "<table border='1' cellpadding='5' width='100%'>\n<thead><tr>";
     foreach (qw(user admin shtype shdate notes)) {
         my $link = "statushistory?user=$FORM{'user'}&admin=$FORM{'admin'}&type=$FORM{'type'}&orderby=$_";
         $link .= $FORM{'orderby'} eq $_ && $FORM{'flow'} eq 'asc' ? "&flow=desc" : "&flow=asc";
         $ret .= "<th><a href='$link'>$_</a></th>";
     }
-    $ret .= "</tr>\n";
+    $ret .= "</tr></thead>\n";
 
     # query built above
     my $ct = 0;
diff -r dec5adeda112 -r 51f91108e1ed htdocs/admin/sysban.bml
--- a/htdocs/admin/sysban.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/admin/sysban.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -108,7 +108,7 @@ FORM
 
         $ret = <<QUERYFORM;
 <table>
-<tr><th>Value</th><th>Expiration</th><th>Change expiry</th><th>Note</th><th>Action</th></tr>
+<thead><tr><th>Value</th><th>Expiration</th><th>Change expiry</th><th>Note</th><th>Action</th></tr></thead>
 QUERYFORM
 
         foreach my $value ( keys %$existing_bans ) {
@@ -178,7 +178,7 @@ QUERYFORM
         my $sysbans = LJ::sysban_populate_full_by_value( $banquery, @sysban_privs ) || {};
         if ( %$sysbans ) {
             $ret .= "Sysbans for " . LJ::ehtml( $banquery );
-            $ret .= "<table><tr><th>Type</th><th>Expiration</th><th>Note</th></tr>";
+            $ret .= "<table><thead><tr><th>Type</th><th>Expiration</th><th>Note</th></tr></thead>";
             while ( my ( $what, $details ) = each %$sysbans  ) {
                 $ret .= "<tr>";
                 $ret .= "<td>$what</td>";
diff -r dec5adeda112 -r 51f91108e1ed htdocs/admin/translate/help-severity.bml
--- a/htdocs/admin/translate/help-severity.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/admin/translate/help-severity.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -1,7 +1,7 @@
 <h1>Description of severity levels:</h1>
 
 <table cellpadding='3'>
-<tr valign='top'><th>Severity</th><th>Description</th></tr>
+<thead><tr valign='top'><th>Severity</th><th>Description</th></tr></thead>
 <tr valign='top'><td><b>0</b></td><td>Translate is up-to-date</td></tr>
 <tr valign='top'><td><b>1</b></td><td>Parent language has changed a little.  Your translation might need updating.</td></tr>
 <tr valign='top'><td><b>2</b></td><td>Parent language has changed.  Your translation probably needs updating.</td></tr>
diff -r dec5adeda112 -r 51f91108e1ed htdocs/admin/translate/index.bml
--- a/htdocs/admin/translate/index.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/admin/translate/index.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -49,7 +49,7 @@ body<=
 
     $ret .= BML::ml('.text', {'aopts' => "href='$LJ::SITEROOT/admin/translate/teams'"});
 
-    $ret .= "<p><table border='1' cellspacing='1' cellpadding='3'><tr>";
+    $ret .= "<p><table border='1' cellspacing='1' cellpadding='3'><thead><tr>";
     foreach (@cols) {
         if ($sortcol eq $_->[0]) {
             $ret .= "<th>$_->[1]</th>";
@@ -58,7 +58,7 @@ body<=
         }
         if ($_->[0] eq $sortcol && $_->[3]) { $sorter = $_->[3]; }
     }
-    $ret .= "</tr>\n";
+    $ret .= "</tr></thead>\n";
 
     foreach my $r (sort $sorter values %lang) {
         $ret .= "<tr>";
diff -r dec5adeda112 -r 51f91108e1ed htdocs/admin/translate/teams.bml
--- a/htdocs/admin/translate/teams.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/admin/translate/teams.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -40,7 +40,7 @@ body<=
     }
 
     $ret .= "<p><table cellpadding='5' border='1'>";
-    $ret .= "<tr><th>$ML{'.table.language'}</th><th>$ML{'.table.community'}</th><th>$ML{'.table.users'}</th></tr>";
+    $ret .= "<thead><tr><th>$ML{'.table.language'}</th><th>$ML{'.table.community'}</th><th>$ML{'.table.users'}</th></tr></thead>";
 
     foreach my $l (sort { $a->{'lnname'} cmp $b->{'lnname'} } values %lang) {
         $ret .= "<tr valign='top' align='left'><td><b>$l->{'lnname'}</b></td>";
diff -r dec5adeda112 -r 51f91108e1ed htdocs/admin/userlog.bml
--- a/htdocs/admin/userlog.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/admin/userlog.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -77,9 +77,9 @@ FORM
 
     $ret .= "<?p Latest log entries for " . LJ::ljuser($u) . ". p?>";
     $ret .= "<table style='border: solid 1px black; width: 95%;'>\n";
-    $ret .= "<tr>";
+    $ret .= "<thead><tr>";
     $ret .= join('', map { "<th class='logrow'>$_</th>" } ("Date and Time", "Action", "Initiator", "IP Address", "Uniq Cookie"));
-    $ret .= "</tr>\n";
+    $ret .= "</tr></thead>\n";
 
     while (my $row = $sth->fetchrow_hashref) {
         my $extra = {};
diff -r dec5adeda112 -r 51f91108e1ed htdocs/community/manage.bml
--- a/htdocs/community/manage.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/community/manage.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -80,7 +80,7 @@ body<=
 
        # Make up the first table row, linking to the other sort methods
        my @snames;
-       $ret .= "<table cellpadding='0' cellspacing='0' style='width: 100%;'><tr>";
+       $ret .= "<table cellpadding='0' cellspacing='0' style='width: 100%;'><thead><tr>";
 
        if (!defined $GET{'sortby'} || $GET{'sortby'} eq 'username') {
            $ret .= "<th>$ML{'.commlist.username'}</th>";
@@ -107,11 +107,13 @@ body<=
            $ret .= "<th>&nbsp;</th>";
        }
 
+       $ret .= "</tr></thead>";
+
        my $rc = 0;
        foreach my $id (@snames) {
            my $user = $names{$id}->[0];
            my $name = $names{$id}->[1];
-           my $rstyle = ($rc++ & 1) ? "odd" : "even";
+           my $rstyle = ($rc++ & 1) ? "even" : "odd";
            $ret .= "<tr class='$rstyle'><td><?ljcomm $user ljcomm?></td><td>" . LJ::eall($name) . "</td><td nowrap='nowrap'>";
            if ($admin{$id}) {
                $ret .= BML::ml('Actionlink', {
diff -r dec5adeda112 -r 51f91108e1ed htdocs/community/members.bml
--- a/htdocs/community/members.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/community/members.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -527,16 +527,16 @@ body<=
     }
 
     my $sortlink = BML::get_uri() . "?authas=$cname&sort=";
-    $ret .= "<br /><div align='center'><table cellpadding='0' cellspacing='0'>\n<tr>" .
+    $ret .= "<br /><div align='center'><table cellpadding='0' cellspacing='0'>\n<thead><tr>" .
             "<th><a href='${sortlink}name'>$ML{'.key.user'}</a></th>";
     $ret .= "<th><a href='${sortlink}$_'>".$ML{".key.$_"}."</a></th>" for (@attribs);
-    $ret .= "</tr>\n";
+    $ret .= "</tr></thead>\n";
 
     # rows for existing users
     my $rc = 0;
     my @wstrs;
     foreach(@users) {
-        my $rstyle = ($rc++ & 1) ? "odd" : "even";
+        my $rstyle = ($rc++ & 1) ? "even" : "odd";
         $ret .= "<tr class='$rstyle'><td>" . LJ::ljuser($_->{'name'}) . "</td>";
         my $wstr;
         foreach my $key (@attribs) {
@@ -553,7 +553,7 @@ body<=
     # if on the last page, let users add to the list
     if ($items{'page'} == $items{'pages'}) {
         foreach(1..5) {
-            my $rstyle = ($rc++ & 1) ? "altrow2" : "altrow1";
+            my $rstyle = ($rc++ & 1) ? "even" : "odd";
             $ret .= "<tr class='$rstyle'><td>";
             $ret .= LJ::html_text({ 'name' => "add_$_", 'size' => '10', 'class' => 'text', 'maxlength' => '75' }) . "</td>";
             foreach my $key (@attribs) {
diff -r dec5adeda112 -r 51f91108e1ed htdocs/community/moderate.bml
--- a/htdocs/community/moderate.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/community/moderate.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -324,11 +324,12 @@ body<=
         } else {
             $ret .= qq{
             <table cellpadding='5'>
-                <tr>
-                    <th>$ML{'.brlist.time'}</th>                <th>$ML{'.brlist.poster'}</th>
+                <thead><tr>
+                    <th>$ML{'.brlist.time'}</th>
+                    <th>$ML{'.brlist.poster'}</th>
                     <th>$ML{'.brlist.subject'}</th>
                     <th>$ML{'.brlist.actions'}</th>
-                </tr>
+                </tr></thead>
             };
 
             my %users;
diff -r dec5adeda112 -r 51f91108e1ed htdocs/community/pending.bml
--- a/htdocs/community/pending.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/community/pending.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -168,7 +168,7 @@ body<=
     }
 
     # table headers
-    $ret .= "<br /><div align='center'><table class='userslist-table' cellspacing='0' cellpadding='2'>\n<tr><th>";
+    $ret .= "<br /><div align='center'><table class='userslist-table' cellspacing='0' cellpadding='2'>\n<thead><tr><th>";
     $ret .= LJ::html_check({ id => 'all', name => 'all', checked => 'checked', 
 	onchange =>
 		"var inputs = document.pending_member_form.getElementsByTagName('input');
@@ -185,13 +185,13 @@ body<=
 			}
 		}", 
   	 selected => 0 });
-    $ret .= "</th><th>$ML{'/community/members.bml.key.user'}</th></tr>\n";
+    $ret .= "</th><th>$ML{'/community/members.bml.key.user'}</th></tr></thead>\n";
 
     # rows for existing users
     my $rc = 0;
     foreach (@users) {
-        my $rstyle = ($rc++ & 1) ? '#efefef' : '#fff';
-        $ret .= "<tr style='background-color: $rstyle;'><td>";
+        my $rstyle = ($rc++ & 1) ? 'even' : 'odd';
+        $ret .= "<tr class='$rstyle'><td>";
         $ret .= LJ::html_check({ id => 'pending_' . $_->userid, name => 'pending_' . $_->userid, 
                                  selected => $jumpto ? ($_->user eq $jumpto ? 1 : 0) : 1 });
         $ret .= "</td><td>" . LJ::ljuser($_->{user}) . "</td></tr>\n";
diff -r dec5adeda112 -r 51f91108e1ed htdocs/community/sentinvites.bml
--- a/htdocs/community/sentinvites.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/community/sentinvites.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -219,13 +219,13 @@ body<=
 </table>
 <br />
 END
-    $ret .= "<table cellpadding='0' cellspacing='0'>\n<tr>" .
+    $ret .= "<table cellpadding='0' cellspacing='0'>\n<thead><tr>" .
             "<th><a href='${sortlink}name'>$ML{'/community/members.bml.key.user'}</a></th>";
     $ret .= "<th><a href='${sortlink}$_'>$_</a></th>" foreach @titleattribs;
     $ret .= "<th><a href='${sortlink}maint'>$ML{'.key.sentby'}</a></th>";
     $ret .= "<th><a href='${sortlink}date'>$ML{'.key.date'}</a></th>";
     $ret .= "<th><a href='${sortlink}status'>$ML{'.key.status'}</a></th>";
-    $ret .= "</tr>\n";
+    $ret .= "</tr></thead>\n";
 
     $ret .= "<form method='post'>";
     $ret .= LJ::form_auth();
@@ -238,7 +238,7 @@ END
     # rows for existing users
     my $rc = 0;
     foreach(@users) {
-        my $rstyle = ($rc++ & 1) ? "odd" : "even";
+        my $rstyle = ($rc++ & 1) ? "even" : "odd";
         $ret .= "<tr class='$rstyle'><td>" . LJ::ljuser($_->{user}) . "</td>";
         foreach my $key (@attribs) {
             $ret .= "<td align='center'>";
diff -r dec5adeda112 -r 51f91108e1ed htdocs/customize/advanced/layers.bml
--- a/htdocs/customize/advanced/layers.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/customize/advanced/layers.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -195,7 +195,7 @@ _c?>
     $body .= "<?h1 $ML{'.yourlayers.header'} h1?>\n";
     if (%$ulay) {
         $body .= "<table id='table_yourlayers' class='grid' cellpadding='3' border='1'>\n";
-        $body .= "<tr><th>$ML{'.yourlayers.table.layerid'}</th><th>$ML{'.yourlayers.table.type'}</th><th>$ML{'.yourlayers.table.name'}</th><th>$ML{'.yourlayers.table.actions'}</th></tr>\n";
+        $body .= "<thead><tr><th>$ML{'.yourlayers.table.layerid'}</th><th>$ML{'.yourlayers.table.type'}</th><th>$ML{'.yourlayers.table.name'}</th><th>$ML{'.yourlayers.table.actions'}</th></tr></thead>\n";
         my $lastbase = 0;
         foreach my $lid (sort { $ulay->{$a}->{'b2lid'} <=> $ulay->{$b}->{'b2lid'} || $a <=> $b } 
                          keys %$ulay) 
diff -r dec5adeda112 -r 51f91108e1ed htdocs/feeds/index.bml
--- a/htdocs/feeds/index.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/feeds/index.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -226,8 +226,8 @@ body<=
     if (@pop) {
         $ret .= "<?h1 $ML{'.add.pop.title'} h1?><?p $ML{'.add.pop.text'} p?>";
         $ret .= "<p><table cellpadding='3' style='margin-bottom: 10px; width: 80%;'>";
-        $ret .= "<tr><th>$ML{'.table.account'}</th><th>$ML{'.table.feed'}</th><td></td>";
-        $ret .= "<th align='right'>$ML{'.table.watchers'}</th></tr>";
+        $ret .= "<thead><tr><th>$ML{'.table.account'}</th><th>$ML{'.table.feed'}</th><td></td>";
+        $ret .= "<th align='right'>$ML{'.table.watchers'}</th></tr></thead>";
         foreach (@pop) {
             my ($user, $url, $count) = @$_;
             $ret .= "<tr>";
diff -r dec5adeda112 -r 51f91108e1ed htdocs/feeds/list.bml
--- a/htdocs/feeds/list.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/feeds/list.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -29,14 +29,14 @@ body<=
  my $navbar = LJ::paging_bar($items{'page'}, $items{'pages'});
  @data = @{$items{'items'}};
 
- $ret .= $navbar . "<table id='synlist'><tr valign='bottom'>";
+ $ret .= $navbar . "<table id='synlist'><thead><tr valign='bottom'>";
  $ret .= $GET{'sort'} eq "username" ? "<th>" . $ML{'.username'} . "</th>":
                                       "<th><a href='" . BML::self_link({ 'sort' => "username"}) . "'>" . $ML{'.username'} . "</a>";
  $ret .= $GET{'sort'} eq "feeddesc" ? "<th>" . $ML{'.feeddesc'} . "</th>":
                                       "<th><a href='" . BML::self_link({ 'sort' => "feeddesc"}) . "'>" . $ML{'.feeddesc'} . "</a>";
  $ret .= $GET{'sort'} eq "numreaders" ? "<th>" . $ML{'.numreaders'} . "</th>":
                                         "<th><a href='" . BML::self_link({ 'sort' => "numreaders"}) . "'>" . $ML{'.numreaders'} . "</a>";
- $ret .= "</th><th>&nbsp;</th></tr>";
+ $ret .= "</th><th>&nbsp;</th></tr></thead>";
  foreach (@data) {
      $ret .= "<tr>";
      $ret .= "<td>" . LJ::ljuser($_->{'user'}, { 'type' => 'Y' }) . "</td>";
diff -r dec5adeda112 -r 51f91108e1ed htdocs/manage/banusers.bml
--- a/htdocs/manage/banusers.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/manage/banusers.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -108,7 +108,7 @@ body<=
         my $us = LJ::load_userids(@$banned);
 
         $ret .= $u->is_community ? "<p>$ML{'.intro.unban.comm'}</p>" : "<p>$ML{'.intro.unban.self'}</p>";
-        $ret .= "<table class='userslist-table' cellspacing=0 cellpadding=0><tr><th>";
+        $ret .= "<table class='userslist-table' cellspacing=0 cellpadding=0><thead><tr><th>";
         $ret .= LJ::html_check({ id => 'all', name => 'all', onchange =>
                 "var inputs=document.ban_users_form.getElementsByTagName('input');
                 for (var i = 0; i < inputs.length; i++) {
@@ -123,7 +123,7 @@ body<=
                         inputs[i].checked = this.checked;                  
                     } 
                }", selected => 0 });
-        $ret .= "</th><th>$ML{'/community/members.bml.key.user'}</th></tr>\n";
+        $ret .= "</th><th>$ML{'/community/members.bml.key.user'}</th></tr></thead>\n";
 		
 		my $rc = 0;
 		
diff -r dec5adeda112 -r 51f91108e1ed htdocs/manage/emailpost.bml
--- a/htdocs/manage/emailpost.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/manage/emailpost.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -397,10 +397,9 @@ body<=
     $ret .= "<form method='post' action='emailpost'>\n";
     $ret .= LJ::form_auth();
     $ret .= "<div style='margin-left:40px;'>";
-    $ret .= "<table border=\"0\"><th>$ML{'.addresses.table.address'}</th>";
+    $ret .= "<table border=\"0\"><thead><tr><th>$ML{'.addresses.table.address'}</th>";
     $ret .= "<th>$ML{'setting.emailposting.option.senderrors'}</th>";
-    $ret .= "<td>&nbsp;</td>";
-    $ret .= "<th>$ML{'setting.emailposting.option.helpmessage'}</th></tr>";
+    $ret .= "<th>$ML{'setting.emailposting.option.helpmessage'}</th></tr></thead>";
     for(0..2) { # Limited to 3 addresses.
         $ret .= '<tr><td>';
         my $selected = 0;
@@ -411,7 +410,7 @@ body<=
         $ret .= '<center>' . 
             LJ::html_check({name => "check_$_", selected => $selected})
             . '</center>';
-        $ret .= '</td><td width="20"></td><td>';
+        $ret .= '</td><td>';
         $ret .= '<center>' . 
             LJ::html_check( { name => "help_$_", selected => 0 } )
             . '</center>';
diff -r dec5adeda112 -r 51f91108e1ed htdocs/manage/invitecodes.bml
--- a/htdocs/manage/invitecodes.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/manage/invitecodes.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -86,7 +86,7 @@ body<=
         } @invitecodes;
 
 
-        $ret .= "<table class='invitecodes' id='invitecodes'><tr><th>$ML{'.header.code'}</th><th>$ML{'.header.recipient'}</th><th width='200'>$ML{'.header.used'}</th><th width='200'>$ML{'.header.sent'}</th><th>$ML{'.header.email'}</th></tr>";
+        $ret .= "<table class='invitecodes' id='invitecodes'><thead><tr><th>$ML{'.header.code'}</th><th>$ML{'.header.recipient'}</th><th width='200'>$ML{'.header.used'}</th><th width='200'>$ML{'.header.sent'}</th><th>$ML{'.header.email'}</th></tr></thead>";
     
         foreach my $code ( @invitecodes ) {
             $ret .= "<tr>";
diff -r dec5adeda112 -r 51f91108e1ed htdocs/manage/invites.bml
--- a/htdocs/manage/invites.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/manage/invites.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -113,15 +113,15 @@ body<=
     # prepare table
     $ret .= "<form method='post'>\n<div align='center'><table id='invites-list' cellspacing='0' cellpadding='0'>";
     $ret .= LJ::form_auth();
-    $ret .= "<tr><th>$ML{'.community.title'}</th><th>$ML{'.abilities.title'}</th>";
+    $ret .= "<thead><tr><th>$ML{'.community.title'}</th><th>$ML{'.abilities.title'}</th>";
     $ret .= "<th colspan='2'>$ML{'.actions.title'}</th>";
-    $ret .= "</tr>";
+    $ret .= "</tr></thead>";
 
     # now list memberships
     my $rc = 0;
     foreach my $invite (@$pending) {
         # get variables we'll need for HTML generation
-        my $rstyle = ($rc++ & 1) ? "odd" : "even";
+        my $rstyle = ($rc++ & 1) ? "even" : "odd";
         my $cu = $us->{$invite->[0]};
         my $key = "pending_$invite->[0]";
         my @tags = ();
diff -r dec5adeda112 -r 51f91108e1ed htdocs/manage/logins.bml
--- a/htdocs/manage/logins.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/manage/logins.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -74,9 +74,10 @@ body<=
     } else {
         $body .= "<?h1 $ML{'.loggedin.header'} h1?>";
     }
-    $body .= "<table width='100%'><tr><th>$ML{'.loggedin.table.time'}</th><th>$ML{'.loggedin.table.ip'}</th><th width='45%'>$ML{'.loggedin.table.useragent'}</th>";
+    $body .= "<table width='100%'><thead><tr><th>$ML{'.loggedin.table.time'}</th><th>$ML{'.loggedin.table.ip'}</th><th width='45%'>$ML{'.loggedin.table.useragent'}</th>";
     $body .= "<th>$ML{'.loggedin.table.exptype'}</th><th>$ML{'.loggedin.table.bound'}</th><th>$ML{'.loggedin.table.create'}</th><th>$ML{'.loggedin.table.expire'}</th>" if $adminmode;
-    $body .= "<th>$ML{'.loggedin.table.logout'}</th></tr>\n" unless $user;
+    $body .= "<th>$ML{'.loggedin.table.logout'}</th>\n" unless $user;
+    $body .= "</tr></thead>";
 
     foreach my $login (sort { $a->[1] <=> $b->[1] } @$logins) {
         unless (defined $sessions->{$login->[1]}) {
@@ -117,7 +118,7 @@ body<=
     } else {
         $body .= "<?h1 $ML{'.prior.header'} h1?>\n";
     }
-    $body .= "<table width='100%'><tr><th>$ML{'.prior.table.time'}</th><th>$ML{'.prior.table.ip'}</th><th width='57%'>$ML{'.prior.table.useragent'}</th></tr>";
+    $body .= "<table width='100%'><thead><tr><th>$ML{'.prior.table.time'}</th><th>$ML{'.prior.table.ip'}</th><th width='57%'>$ML{'.prior.table.useragent'}</th></tr></thead>";
     foreach my $login (sort { $b->[1] <=> $a->[1] } @prior) {
         $body .= "<tr>\n";
         $body .= "<td>" . LJ::ehtml(LJ::time_to_http($login->[0])) . "</td>\n";
diff -r dec5adeda112 -r 51f91108e1ed htdocs/manage/moodthemes.bml
--- a/htdocs/manage/moodthemes.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/manage/moodthemes.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -451,7 +451,7 @@ body<=
                 $ret .= LJ::html_hidden('edit' => 1,
                                         'themeids' => join(",", map { $_->{moodthemeid} } @user_themes));
                 $ret .= "<table>";
-                $ret .= "<tr><th></th><th>$ML{'.yourthemes.example.happy'}</th><th>$ML{'.yourthemes.example.sad'}</th><th>$ML{'.yourthemes.example.angry'}</th><th></th></tr>";
+                $ret .= "<thead><tr><th></th><th>$ML{'.yourthemes.example.happy'}</th><th>$ML{'.yourthemes.example.sad'}</th><th>$ML{'.yourthemes.example.angry'}</th><th></th></tr></thead>";
                 foreach my $theme ( @user_themes ) {
                     my $ename = LJ::ehtml( $theme->{name} );
                     my $tid = $theme->{moodthemeid};
diff -r dec5adeda112 -r 51f91108e1ed htdocs/shop/history.bml
--- a/htdocs/shop/history.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/shop/history.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -39,8 +39,8 @@ body<=
 
     my $ret;
     $ret .= "<table class='shop-cart'>";
-    $ret .= "<tr><th>$ML{'.cart.header.ordernumber'}</th><th>$ML{'.cart.header.date'}</th><th>$ML{'.cart.header.total'}</th>";
-    $ret .= "<th>$ML{'.cart.header.paymentmethod'}</th><th>$ML{'.cart.header.status'}</th><th>$ML{'.cart.header.details'}</th></tr>";
+    $ret .= "<thead><tr><th>$ML{'.cart.header.ordernumber'}</th><th>$ML{'.cart.header.date'}</th><th>$ML{'.cart.header.total'}</th>";
+    $ret .= "<th>$ML{'.cart.header.paymentmethod'}</th><th>$ML{'.cart.header.status'}</th><th>$ML{'.cart.header.details'}</th></tr></thead>";
     foreach my $cart ( @carts ) {
         my $state = $cart->state;
         my $paymentmethod = $cart->paymentmethod;
diff -r dec5adeda112 -r 51f91108e1ed htdocs/support/help.bml
--- a/htdocs/support/help.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/support/help.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -258,7 +258,7 @@ body<=
 
  my %marked = map { $_ => 1 } split( ',', $GET{mark} );
  my $uri = "$LJ::SITEROOT/support/help?cat=$filtercat&state=$state";
- $ret .= "<p><table class='supporttable'><tr bgcolor='#d0d0d0'>\n";
+ $ret .= "<p><table class='supporttable'><thead><tr bgcolor='#d0d0d0'>\n";
  if ( $can_close ) {
     my $link = "$uri&sort=$sort&closeall=" . ( $GET{closeall} ? 0 : 1 );
     $ret .= "<th>&nbsp;<a href='$link'>X</a></th>\n";
@@ -272,7 +272,7 @@ body<=
      }
  }
  $ret .= "<th>$ML{'.th.status'}</th>\n";
- $ret .= "</tr>";
+ $ret .= "</tr></thead>";
 
  foreach my $sp (@support_log)
  {
diff -r dec5adeda112 -r 51f91108e1ed htdocs/support/highscores.bml
--- a/htdocs/support/highscores.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/support/highscores.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -80,12 +80,12 @@ body<=
  $ret .= $navbar;
  $ret .= "<table id='support-highscores'>";
  $ret .= qq{
-    <tr>
+    <thead><tr>
         <th>$ML{'.header.rank'}</th>
         <th>$ML{'.header.delta'}</th>
         <th>$ML{'.header.user'}</th>
         <th>$ML{'.header.points'}</th>
-    </tr>};
+    </tr></thead>};
  my $count = 0;
  foreach (@rows)
  {
diff -r dec5adeda112 -r 51f91108e1ed htdocs/support/history.bml
--- a/htdocs/support/history.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/support/history.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -86,8 +86,8 @@ body<=
             # get categories
             my $cats = LJ::Support::load_cats();
 
-            $ret .= '<table><tr><th>Summary</th><th>State</th><th>Answered By</th>' .
-                    '<th>Category</th><th>Opened By</th><th>Time Opened</th></tr>';
+            $ret .= '<table><thead><tr><th>Summary</th><th>State</th><th>Answered By</th>' .
+                    '<th>Category</th><th>Opened By</th><th>Time Opened</th></tr></thead>';
             foreach my $id (sort { $a <=> $b } keys %reqs) {
                 # verify user can see this category (public_read or has supportread in it)
                 next unless $cats->{$reqs{$id}->{spcatid}}{public_read} ||
diff -r dec5adeda112 -r 51f91108e1ed htdocs/tools/emailmanage.bml
--- a/htdocs/tools/emailmanage.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/tools/emailmanage.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -133,11 +133,11 @@ body<=
         $ret .= "<form method='post' action='emailmanage$getextra'>";
         $ret .= LJ::form_auth();
         $ret .= "<table border='1' cellpadding='2' style='margin-bottom: 3px;'>\n";
-        $ret .= qq{<tr>
+        $ret .= qq{<thead><tr>
                     <th>$ML{'.header.check'}</th>
                     <th>$ML{'.header.email'}</th>
                     <th>$ML{'.header.date'}</th>
-                </tr>};
+                </tr></thead>};
         $ret .= $rows;
         $ret .= "</table>\n";
         $ret .= LJ::html_submit(undef, $ML{'.delete_selected'});
diff -r dec5adeda112 -r 51f91108e1ed htdocs/tools/recent_comments.bml
--- a/htdocs/tools/recent_comments.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/tools/recent_comments.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -284,9 +284,9 @@ body<=
         $ret .= "<?h1 $ML{ '.latest.posted' } h1?><?p " . BML::ml('.last.num.posted.by', {num => $count, user => LJ::ljuser($u) }) . " p?>";
         my %jcount;  # jid -> ct
         $ret .= "<table style='text-align: left'>";
-        $ret .= "<tr><th>$ML{ '.time' }</th><th>&nbsp;$ML{ '.location' }</th><th>&nbsp;$ML{ '.delete' }</th>";
+        $ret .= "<thead><tr><th>$ML{ '.time' }</th><th>&nbsp;$ML{ '.location' }</th><th>&nbsp;$ML{ '.delete' }</th>";
         $ret .= "<th>&nbsp;$ML{ '.edit' }</th>" if $remote->can_edit_comments;
-        $ret .= "</tr>";
+        $ret .= "</tr></thead>";
 
         foreach my $r (@posted) {
             $jcount{$r->{'journalid'}}++;
diff -r dec5adeda112 -r 51f91108e1ed htdocs/tools/recent_emailposts.bml
--- a/htdocs/tools/recent_emailposts.bml	Wed Dec 29 11:11:03 2010 +0800
+++ b/htdocs/tools/recent_emailposts.bml	Wed Dec 29 13:13:46 2010 +0800
@@ -14,41 +14,6 @@ _c?>
 _c?>
 <?page
 title=>Email gateway log
-head<=
-    <style type="text/css">
-
-    .disp
-    {
-        width: 700px;
-        border-left: 1px solid #c2c2c2;
-        border-top: 1px solid #c2c2c2;
-    }
-
-    .disp td
-    {
-        font-size: 0.85em;
-        border-right: 1px solid #c2c2c2;
-        padding: 6px;
-        border-bottom: 1px solid #c2c2c2;
-        vertical-align: top;
-    }
-
-    .err
-    {
-        background-color: #efefef;
-    }
-
-    .disp th
-    {
-        padding: 6px;
-        border-bottom: 1px solid #999;
-        border-right: 1px solid #999;
-        background-color: #dedede;
-        text-align: left;
-    }
-    
-    </style>
-<=head
 body<=
 <?_code
 {
@@ -110,19 +75,19 @@ body<=
     }
 
     $ret .= q{
-        <table class="disp" cellspacing="0">
-            <tr>
+        <table class="grid" cellspacing="0">
+            <thead><tr>
                 <th>When</th>
                 <th>Subject</th>
                 <th>Error?</th>
                 <th>Server Message</th>
-            </tr>
+            </tr></thead>
     };
 
     foreach ( reverse sort keys %$data ) {
         my $row = {};
         LJ::decode_url_string( $data->{$_}->{extra}, $row );
-        $ret .= $row->{e} ? "<tr class='err'>" : "<tr class='ok'>";
+        $ret .= $row->{e} ? "<tr class='error-box'>" : "<tr class='ok'>";
         $ret .= qq{
             <td nowrap="1">$data->{$_}->{ftime}</td>
             <td nowrap="1"><em>$row->{s}</em></td>
diff -r dec5adeda112 -r 51f91108e1ed views/admin/rename.tt
--- a/views/admin/rename.tt	Wed Dec 29 11:11:03 2010 +0800
+++ b/views/admin/rename.tt	Wed Dec 29 13:13:46 2010 +0800
@@ -18,7 +18,7 @@ the same terms as Perl itself.  For a co
         <p>[% '.renames.list.empty' | ml( user = user ) | html %]</p>
     [% ELSE %]
         <table>
-            <tr><th>From</th><th>To</th><th>Renamed by</th><th>Account renamed</th><th>Renamed on</th></tr>
+            <thead><tr><th>From</th><th>To</th><th>Renamed by</th><th>Account renamed</th><th>Renamed on</th></tr></thead>
         
             [% FOREACH rename = renames %]
             <tr>
diff -r dec5adeda112 -r 51f91108e1ed views/interests/findsim.tt
--- a/views/interests/findsim.tt	Wed Dec 29 11:11:03 2010 +0800
+++ b/views/interests/findsim.tt	Wed Dec 29 13:13:46 2010 +0800
@@ -24,11 +24,11 @@
 
 <h1>[% '.findsim_do.similar.head' | ml %]</h1>
 <p>[% ".findsim_do.similar.text" | ml(user = findsim_u.ljuser_display) %]</p>
-<p><table cellpadding='3'><tr valign='bottom'>
+<p><table cellpadding='3'><thead><tr valign='bottom'>
     <th>#</th>
     <th width='250'>[% 'username' | ml %]</th>
     <th>[% '.findsim_do.magic' | ml %]</th>
-</tr>
+</tr></thead>
 [%- FOREACH findsim_data -%]
     <tr>
         <td>[% count %]</td>
diff -r dec5adeda112 -r 51f91108e1ed views/interests/popular.tt
--- a/views/interests/popular.tt	Wed Dec 29 11:11:03 2010 +0800
+++ b/views/interests/popular.tt	Wed Dec 29 13:13:46 2010 +0800
@@ -30,11 +30,11 @@
 </p>
 [%- IF pop_ints -%]
     [%- IF no_text_mode; pop_cloud; ELSE -%]
-        <p><table><tr>
+        <p><table><thead><tr>
             <th width='150' style="text-align: left">
             [% '.interest' | ml %]</th>
             <th>[% '.count' | ml %]</th>
-        </tr>
+        </tr></thead>
         [%- FOREACH i = pop_ints -%]
         <tr>
             <td><a href='[% i.url | url %]'>[% i.eint %]</a></td>
diff -r dec5adeda112 -r 51f91108e1ed views/stats/site.tt
--- a/views/stats/site.tt	Wed Dec 29 11:11:03 2010 +0800
+++ b/views/stats/site.tt	Wed Dec 29 13:13:46 2010 +0800
@@ -143,11 +143,11 @@ class="bargraph" />
 <h2>[% '.paid.title' | ml %]</h2>
 <p>[% '.paid.explanation' | ml %]</p>
 [% IF paid.defined %]
-    <table class='stats-matrix'><tr>
+    <table class='stats-matrix'><thead><tr>
     [% FOREACH h = [ 'level' 'number' 'pct_total' 'pct_active' ] %]
         <th>[% ".paid.colhdr.$h" | ml %]</th>
     [% END %]
-    </tr>
+    </tr></thead>
     [% allpaid = 0 %]
     [% FOREACH level = [ 'paid' 'premium' 'seed' ] %]
         <tr><th>[% ".paid.rowhdr.$level" | ml %]</th>
--------------------------------------------------------------------------------