Index: zpt/head_main.zpt
===================================================================
--- zpt/head_main.zpt	(revision 460)
+++ zpt/head_main.zpt	(revision 480)
@@ -1,4 +1,20 @@
-<tal:block tal:define="docinfo options/docinfo; pageinfo options/pageinfo; formattedLabel python:here.metadata.getFormattedLabel(bibdata=docinfo.get('bib',None))">
-  <span tal:condition="not:formattedLabel" tal:content="string:(no bibliographical information for ${docinfo/bib_type})"/>
-  <span tal:condition="formattedLabel" tal:content="structure formattedLabel"/>
-</tal:block>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+</head>
+<body>
+  <!-- block used for page header content area -->
+  <metal:block metal:define-macro="main"
+    tal:define="docpath docinfo/textURLPath | nothing;
+               query here/REQUEST/query | nothing;
+               queryType here/REQUEST/queryType | nothing;
+               bib docinfo/bib | nothing; bibType docinfo/bibType | nothing;
+               formattedLabel python:here.metadataService.getBibFormattedLabel(bibdata=bib);">
+    <span tal:condition="not:formattedLabel"
+      tal:content="string:(no bibliographical information for ${bibType})" />
+    <span tal:condition="formattedLabel" tal:content="structure formattedLabel" />
+  </metal:block>
+</body>
+</html>
Index: zpt/toc_thumbs.zpt
===================================================================
--- zpt/toc_thumbs.zpt	(revision 122)
+++ zpt/toc_thumbs.zpt	(revision 480)
@@ -1,31 +1,70 @@
-<div tal:define="docinfo options/docinfo; pageinfo options/pageinfo;  
-  start pageinfo/start; end pageinfo/end; rows pageinfo/rows; cols pageinfo/cols;
-  current pageinfo/current; grpsize pageinfo/groupsize">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+</head>
+<body>
+  <!-- block used for main content area -->
+  <div class="toc" metal:define-macro="main"
+    tal:define="start pageinfo/start;
+                grpsize pageinfo/groupsize;
+                numgroups pageinfo/numgroups;
+                pageBatch pageinfo/pageBatch; pageZero pageinfo/pageZero;
+                left python:test(flowLtr,pageBatch['prevStart'],pageBatch['nextStart']);
+                right python:test(flowLtr,pageBatch['nextStart'],pageBatch['prevStart']);">
+    <ul class="toctype">
+      <li class="sel">
+        <a tal:attributes="href python:here.getLink('tocMode','thumbs')">Thumbnails</a>
+      </li>
+      <li tal:condition="python:docinfo.get('numTocEntries', None)">
+        <a tal:attributes="href python:here.getLink('tocMode','text')">Content</a>
+      </li>
+      <li tal:condition="python:docinfo.get('numFigureEntries', None)">
+        <a tal:attributes="href python:here.getLink('tocMode','figures')">Figures</a>
+      </li>
+      <li>
+        <a tal:attributes="href python:here.getLink('tocMode','none')">None</a>
+      </li>
+    </ul>
 
-<div class="thumbruler">
-  <span tal:condition="python:(start>1)">
-    <a tal:attributes="href python:here.getLink(param='start',val=max(start-grpsize,1))">&lt;</a>
-  </span>
-  <select tal:attributes="onChange python:'location.href=\''+here.getLink(param='start',val=None)+'&start=\'+this.options[this.selectedIndex].value'">
-    <option tal:repeat="grp python:range(pageinfo['numgroups'])" 
-      tal:attributes="selected python:(start==grp*grpsize+1); value python:(grp*grpsize+1)"
-      tal:content="python:(grp*grpsize+1)"/>
-  </select>
-  <span tal:condition="python:(start+grpsize<int(docinfo['numPages']))">
-    <a tal:attributes="href python:here.getLink(param='start',val=start+grpsize)">&gt;</a>
-  </span>
-</div>
-<table>
-  <tr tal:repeat="row python:range(rows)">
-    <tal:block tal:repeat="idx python:range(start+row*cols,start+(row+1)*cols)">
-      <td align="center" tal:condition="python:(idx<=end)"
-		  	tal:attributes="class python:here.getStyle(idx,current,'thumb')">
-		<a tal:attributes="href python:here.getLink(param='pn',val=idx)">
-		  <img class="thumbimg" border="0" tal:attributes="src string:${docinfo/imageURL}&pn=$idx&dw=100&dh=100"/>
-		  <div class="thumbcap" tal:content="idx"/>
-		</a>
-	  </td>
-    </tal:block>
-  </tr>
-</table>
-</div>
+    <div class="content">
+      <div class="ruler">
+        <form class="autosubmit" tal:attributes="action viewerUrl">
+          <input type="hidden" tal:define="params python:here.getParams('start',None)"
+            tal:repeat="param params"
+            tal:attributes="name param; value python:params[param]" /> 
+          <a tal:condition="left" tal:attributes="href python:here.getLink('start',left)">&lt;</a>
+          <span tal:condition="not:left">&lt;</span>
+          <select class="autosubmit" name="start"
+            tal:define="ofs python:test(pageinfo['pageZero'],0,1)">
+            <tal:block tal:repeat="grp python:range(numgroups)">
+              <option tal:define="idx python:max(grp*grpsize+ofs,1)"
+                tal:attributes="selected python:start==idx; value idx;"
+                tal:content="python:'%s - %s'%(idx,min((grp+1)*grpsize+ofs-1,numPages))" />
+            </tal:block>
+          </select>
+          <input type="submit" value="Go" /> 
+          <a tal:condition="right" tal:attributes="href python:here.getLink('start',right)">&gt;</a>
+          <span tal:condition="not:right">&gt;</span>
+        </form>
+      </div>
+
+      <table class="thumbs">
+        <tr tal:repeat="row pageBatch/pages">
+          <td tal:repeat="thumb row"
+            tal:attributes="class python:here.getStyle(thumb['idx'],pn,'thumb')">
+            <a tal:define="idx thumb/idx" tal:condition="idx"
+              tal:attributes="href python:here.getLink('pn',idx)">
+              <img
+                tal:attributes="src python:test(docinfo['imageURL'],here.getScalerUrl(pn=idx,dw=100,dh=100,docinfo=docinfo),'images/pic');
+                                alt idx" /><br/>
+              <span tal:content="idx" />
+            </a>
+          </td>
+        </tr>
+      </table>
+    </div> <!-- content -->
+  </div> <!-- toc -->
+</body>
+</html>
Index: zpt/viewer_text.zpt
===================================================================
--- zpt/viewer_text.zpt	(revision 479)
+++ zpt/viewer_text.zpt	(revision 480)
@@ -2,29 +2,63 @@
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml"
- tal:define="docinfo options/docinfo; pageinfo options/pageinfo; viewMode pageinfo/viewMode; tocMode pageinfo/tocMode">
+  tal:define="docinfo options/docinfo; pageinfo options/pageinfo; viewMode pageinfo/viewMode;
+              tocMode pageinfo/tocMode; viewType pageinfo/viewType; viewerUrl docinfo/viewerUrl;
+              numPages docinfo/numPages | nothing;">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
   <link rel="stylesheet" href="template/docuviewer_css" type="text/css">
 </head>
-<body tal:condition="docinfo/numPages">
-<div tal:replace="structure python:here.template.head_main(docinfo=docinfo,viewMode=viewMode,pageinfo=pageinfo)"/>
-<tal:block tal:condition="python:here.isAccessible(docinfo)">
-<table border="0" width="100%" height="100%">
-  <tr>
-    <td width="300px" valign="top">
-      <tal:block tal:replace="structure python:getattr(here.template, 'toc_%s'%tocMode)(docinfo=docinfo,pageinfo=pageinfo)"/> 
-    </td>
-    <td width="100%" valign="top">
-      <tal:block tal:content="structure python:getattr(here.template, 'page_main_%s'%viewMode)(docinfo=docinfo,pageinfo=pageinfo,mk=options['mk'])"/>
-    </td>
-  </tr>
-</table>
-</tal:block>
-<tal:block tal:condition="not:python:here.isAccessible(docinfo)">
-<div class="errortext">Sorry, access to this document is restricted.</div>
-</tal:block>
+<body tal:condition="numPages">
+  <tal:block tal:define="docpath docinfo/textURLPath;
+              pn pageinfo/pn; 
+              flowLtr python:pageinfo.get('pageFlow','ltr')!='rtl';
+              prev python:test(pn>1,pn-1,None); next python:test(pn<numPages,pn+1,None);
+              first python:test(pn>1,1,None); last python:test(pn<numPages,numPages,None);
+              left python:test(flowLtr,prev,next); right python:test(flowLtr,next,prev);
+              leftest python:test(flowLtr,first,last); rightest python:test(flowLtr,last,first);
+              textPage python:here.getTextPage(mode=viewType, pn=pn, docinfo=docinfo, pageinfo=pageinfo);">
+  <div class="page_head" metal:use-macro="here/template/head_main/macros/main" />
+  <div class="page_body" tal:condition="python:here.isAccessible(docinfo)">
+    <!--table of contents-->
+    <div class="toc"
+      metal:use-macro="python:path('here/template/toc_%s/macros/main'%tocMode)" />
+    <!-- text page -->
+    <div class="text">
+      <div class="ruler">
+        <form class="autosubmit pageruler" tal:attributes="action viewerUrl">
+          <input type="hidden" tal:define="params python:here.getParams('pn', None)"
+            tal:repeat="param params" tal:attributes="name param; value python:params[param]" />
+        page
+        <a tal:condition="leftest" tal:attributes="href python:here.getLink('pn',leftest)">|&lt;</a>
+        <span tal:condition="not:leftest">|&lt;</span>
+        <a tal:condition="left" tal:attributes="href python:here.getLink('pn',left)">&lt;</a>
+        <span tal:condition="not:left">&lt;</span>
+        <input class="autosubmit" size="3" type="text" name="pn" tal:attributes="value pn" /> 
+        <tal:block tal:define="originalPage pageinfo/pageNumberOrig | nothing"
+               tal:condition="python:originalPage!=None">
+          (<span tal:replace="originalPage"/><span tal:define="originalPageNorm pageinfo/pageNumberOrigNorm | nothing" tal:condition="python:originalPageNorm!=None">[<span tal:replace="originalPageNorm"/>]</span>)      
+        </tal:block>
+        <input type="submit" value="Go" />
+        of 
+        <span tal:replace="numPages"/>
+        <a tal:condition="right" tal:attributes="href python:here.getLink('pn',right)">&gt;</a>
+        <span tal:condition="not:right">&gt;</span>
+        <a tal:condition="rightest" tal:attributes="href python:here.getLink('pn',rightest)">&gt;|</a>
+        <span tal:condition="not:rightest">&gt;|</span>
+        </form>
+      </div>
+      <div class="page">
+        <div class="pageHeaderTitle" tal:condition="exists:pageinfo/pageHeaderTitle" tal:content="structure pageinfo/pageHeaderTitle"/>
+        <tal:block tal:replace="structure textPage"/>
+      </div>
+    </div>
+  </div>
+  <div class="page_body" tal:condition="python:not here.isAccessible(docinfo)">
+    <div class="errortext">Sorry, access to this document is restricted.</div>
+  </div>
+  </tal:block>
 </body>
-<body tal:condition="not:docinfo/numPages">
-<div class="errortext">Sorry, document doesn't exist.</div>
+<body tal:condition="not:numPages">
+  <div class="errortext">Sorry, document doesn't exist.</div>
 </body>
 </html>
