Index: documentViewer.py
===================================================================
--- documentViewer.py	(revision 20)
+++ documentViewer.py	(revision 22)
@@ -17,4 +17,5 @@
 import cgi
 import urllib
+import zLOG
 
 def getTextFromNode(nodename):
@@ -37,6 +38,8 @@
 def getParamFromDigilib(path,param):
     """gibt param von dlInfo aus"""
-    imageUrl=genericDigilib+"/dlInfo-xml.jsp?fn="+path
-
+    imageUrl=genericDigilib+"/dirInfo-xml.jsp?mo=dir&fn="+path
+
+    zLOG.LOG("documentViewer (getparamfromdigilib)", zLOG.INFO, "dirInfo (%s) from %s"%(param,imageUrl))
+    
     try:
         dom = NonvalidatingReader.parseUri(imageUrl)
@@ -44,60 +47,17 @@
         return None
     
-    
-    params=dom.xpath("//document-parameters/parameter[@name='%s']/@value"%param)
+    params=dom.xpath("//dir/%s"%param)
+    zLOG.LOG("documentViewer (getparamfromdigilib)", zLOG.INFO, "dirInfo:%s"%params)
     
     if params:
-        return params[0].value
-    
-def parseUrlTextTool(url):
-   """parse index meta"""
-    
-   try:
-       dom = NonvalidatingReader.parseUri(url)
-   except:
-       zLOG.LOG("documentViewer (parseUrlTexttool)", zLOG.INFO,"%s (%s)"%sys.exc_info()[0:2])
-       return (None,None,None)
-   
-   archivePaths=dom.xpath("//resource/archive-path")
-   
-   if archivePaths and (len(archivePaths)>0):
-       archivePath=getTextFromNode(archivePaths[0])
-   else:
-       archivePath=None
-   
-    
-   images=dom.xpath("//texttool/image")
-   
-   if images and (len(images)>0):
-       image=getTextFromNode(images[0])
-   else:
-       image=None
-       
-   if image and archivePath:
-       image=os.path.join(archivePath,image)
-       image=image.replace("/mpiwg/online",'')
-       pt=getParamFromDigilib(image,'pt')
-
-   else:
-       image=None
-       
-   viewerUrls=dom.xpath("//texttool/digiliburlprefix")
-   
-   if viewerUrls and (len(viewerUrls)>0):
-       viewerUrl=getTextFromNode(viewerUrls[0])
-   else:
-       viewerUrl=None
-   
-   
-   textUrls=dom.xpath("//texttool/text")
-   
-   if textUrls and (len(textUrls)>0):
-       textUrl=getTextFromNode(textUrls[0])
-   else:
-       textUrl=None
-   return viewerUrl,(image,pt),textUrl
-
-
-class documentViewer(ZopePageTemplate):
+        return getTextFromNode(params[0])
+
+    
+
+
+##
+## documentViewer class
+##
+class documentViewer(Folder):
     """document viewer"""
 
@@ -105,32 +65,58 @@
     
     security=ClassSecurityInfo()
-    manage_options=ZopePageTemplate.manage_options+(
+    manage_options=Folder.manage_options+(
         {'label':'main config','action':'changeDocumentViewerForm'},
         )
 
-    _default_content_fn = os.path.join(package_home(globals()),'zpt','documentViewer_template.zpt')
-    
-    def __init__(self,id,imageViewerUrl,title=""):
+    # templates and forms
+    viewer_main = PageTemplateFile('zpt/viewer_main', globals())
+    thumbs_main = PageTemplateFile('zpt/thumbs_main', globals())
+    image_main = PageTemplateFile('zpt/image_main', globals())
+    head_main = PageTemplateFile('zpt/head_main', globals())
+    docuviewer_css = PageTemplateFile('css/docuviewer.css', globals())
+
+    security.declareProtected('View management screens','changeDocumentViewerForm')    
+    changeDocumentViewerForm = PageTemplateFile('zpt/changeDocumentViewer', globals())
+
+    
+    def __init__(self,id,imageViewerUrl,title="",digilibBaseUrl=None):
         """init document viewer"""
         self.id=id
         self.title=title
         self.imageViewerUrl=imageViewerUrl
-        
-    security.declareProtected('View management screens','changeDocumentViewerForm')    
-    def changeDocumentViewerForm(self):
-        """change it"""
-        pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeDocumentViewer.zpt')).__of__(self)
-        return pt()
+        self.digilibBaseUrl = digilibBaseUrl
+        if not self.digilibBaseUrl:
+            self.digilibBaseUrl = self.findDigilibUrl()
+        # add template folder so we can always use template.something
+        self.manage_addFolder('template')
+
+
+    security.declareProtected('View','index_html')
+    def index_html(self,mode,url,start=0,pn=1):
+        '''
+        view it
+        @param mode: defines which type of document is behind url
+        @param url: url which contains display information
+        '''
+        
+        zLOG.LOG("documentViewer (index)", zLOG.INFO, "mode: %s url:%s start:%s pn:%s"%(mode,url,start,pn))
+        print "dlbaseurl:", self.digilibBaseUrl
+        
+        if not hasattr(self, 'template'):
+            # create template folder if it doesn't exist
+            print "no template folder -- creating"
+            self.manage_addFolder('template')
+            
+        if not self.digilibBaseUrl:
+            self.digilibBaseUrl = self.findDigilibUrl() or "http://nausikaa.mpiwg-berlin.mpg.de/digitallibrary"
+            
+        print "dlbaseurl:", self.digilibBaseUrl
+
+        docinfo = self.getDocinfo(mode=mode, url=url)
+        pageinfo = self.getPageinfo(start=start,current=pn)
+        pt = getattr(self.template, 'viewer_main')
+        return pt(docinfo=docinfo,pageinfo=pageinfo)
   
   
-    def changeDocumentViewer(self,imageViewerUrl,title="",RESPONSE=None):
-        """init document viewer"""
-        self.title=title
-        self.imageViewerUrl=imageViewerUrl
-        
-        if RESPONSE is not None:
-            RESPONSE.redirect('manage_main')
-    
-    
     def imageLink(self,nr):
         """link hinter den images"""
@@ -144,5 +130,13 @@
         return newUrl
         
-        
+    def getStyle(self, idx, selected, style=""):
+        """returns a string with the given style + 'sel' if path == selected."""
+        #zLOG.LOG("documentViewer (getstyle)", zLOG.INFO, "idx: %s selected: %s style: %s"%(idx,selected,style))
+        if idx == selected:
+            return style + 'sel'
+        else:
+            return style    
+
+            
     def thumbruler(self,cols,rows,start,maximum):
         """ruler for thumbs"""
@@ -163,5 +157,5 @@
 
 
-        ret+="""<select onChange="location.href='%s&start='+this.options[this.selectedIndex].value" """%newUrlSelect
+        ret+="""<select onChange="location.href='%s&start='+this.options[this.selectedIndex].value">"""%newUrlSelect
         nr,rest=divmod(maximum,cols*rows)
         if rest > 0:
@@ -183,35 +177,24 @@
         
         return ret
-        
-    def textToolThumb(self,url,start=0):
-        """understands the texttool format
-        @param url: url to index.meta with texttool tag
-        """
-        (viewerUrl,imagepath,textpath)=parseUrlTextTool(url)
-        
-        imageUrl=genericDigilib+"/servlet/Scaler?fn=%s"%imagepath[0]
-        
-        pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumbs.zpt')).__of__(self)
-        return pt(imageUrl=imageUrl,pt=imagepath[1],start=start)
-    
-    def imagePathThumb(self,path,start=0):
-        """path ist the path to the images it is assumes that the index.meta file is one level higher."""
-        
-        path=path.replace("/mpiwg/online","")
-        pt=getParamFromDigilib(path,'pt')
-        imageUrl=genericDigilib+"/servlet/Scaler?fn=%s"%path
-        
-        pageT=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumbs.zpt')).__of__(self)
-        return pageT(imageUrl=imageUrl,pt=pt,start=start)
-    
-    def headerFromIndexMeta(self,path):
-        """gibt header from index meta out"""
-        
+    
+        
+        
+    def getBibinfoFromIndexMeta(self,path,docinfo=None,dom=None):
+        """gets bibliographical info from the index.meta file at url or given by dom"""
+        zLOG.LOG("documentViewer (getbibinfofromindexmeta)", zLOG.INFO,"path: %s"%(path))
+        
+        if docinfo is None:
+            docinfo = {}
+            
         metaData=self.metadata.main.meta.bib
-        server="http://foxridge.mpiwg-berlin.mpg.de"
-        path="/".join(path.split("/")[0:-1])
-        metaUrl=server+path+"/index.meta"
-        
-        dom = NonvalidatingReader.parseUri(metaUrl)
+        if dom is None:
+            server="http://nausikaa.mpiwg-berlin.mpg.de/digitallibrary/servlet/Texter?fn="
+            path="/".join(path.split("/")[0:-1])
+            metaUrl=server+path+"/index.meta"
+            try:
+                dom = NonvalidatingReader.parseUri(metaUrl)
+            except:
+                return docinfo
+        
         type=dom.xpath("//bib/@type")
         if type and (len(type)>0):
@@ -221,11 +204,107 @@
         type=type.replace("-"," ")# wrong typesiin index meta "-" instead of " "
         hash=metaData.generateMappingForType(type)
-    
-        author=getTextFromNode(dom.xpath("//bib/%s"%hash['author'][0])[0])
-        title=getTextFromNode(dom.xpath("//bib/%s"%hash['title'][0])[0])
-        year=getTextFromNode(dom.xpath("//bib/%s"%hash['year'][0])[0])
-        
-        return author,title,year
-        
+
+        docinfo['author']=getTextFromNode(dom.xpath("//bib/%s"%hash['author'][0])[0])
+        docinfo['title']=getTextFromNode(dom.xpath("//bib/%s"%hash['title'][0])[0])
+        docinfo['year']=getTextFromNode(dom.xpath("//bib/%s"%hash['year'][0])[0])
+        
+        return docinfo
+
+        
+    def getDocinfoFromTextTool(self,url,docinfo=None):
+       """parse texttool tag in index meta"""
+       zLOG.LOG("documentViewer (getdocinfofromtexttool)", zLOG.INFO,"url: %s"%(url))
+       if docinfo is None:
+           docinfo = {}
+           
+       try:
+           dom = NonvalidatingReader.parseUri(url)
+       except:
+           zLOG.LOG("documentViewer (parseUrlTexttool)", zLOG.INFO,"%s (%s)"%sys.exc_info()[0:2])
+           return docinfo
+       
+       archivePaths=dom.xpath("//resource/archive-path")
+       
+       if archivePaths and (len(archivePaths)>0):
+           archivePath=getTextFromNode(archivePaths[0])
+       else:
+           archivePath=None
+       
+       images=dom.xpath("//texttool/image")
+       
+       if images and (len(images)>0):
+           image=getTextFromNode(images[0])
+       else:
+           image=None
+           
+       if image and archivePath:
+           image=os.path.join(archivePath,image)
+           image=image.replace("/mpiwg/online",'')
+           pt=getParamFromDigilib(image,'size')
+           docinfo['imagePath'] = image
+           docinfo['numberOfPages'] = pt
+           
+       viewerUrls=dom.xpath("//texttool/digiliburlprefix")
+       
+       if viewerUrls and (len(viewerUrls)>0):
+           viewerUrl=getTextFromNode(viewerUrls[0])
+           docinfo['imageURL'] = viewerURL
+                  
+       textUrls=dom.xpath("//texttool/text")
+       
+       if textUrls and (len(textUrls)>0):
+           textUrl=getTextFromNode(textUrls[0])
+           docinfo['textURL'] = textURL
+                     
+       docinfo = self.getBibinfoFromIndexMeta(url,docinfo=docinfo,dom=dom)
+       return docinfo
+   
+
+    def getDocinfoFromImagePath(self,path,docinfo=None):
+        """path ist the path to the images it assumes that the index.meta file is one level higher."""
+        zLOG.LOG("documentViewer (getdocinfofromimagepath)", zLOG.INFO,"path: %s"%(path))
+        if docinfo is None:
+            docinfo = {}
+        docinfo['imagePath'] = path
+        path=path.replace("/mpiwg/online","")
+        pt=getParamFromDigilib(path,'size')
+        docinfo['numberOfPages'] = pt
+        imageUrl=genericDigilib+"/servlet/Scaler?fn=%s"%path
+        docinfo['imageURL'] = imageUrl
+        
+        docinfo = self.getBibinfoFromIndexMeta(path,docinfo=docinfo)
+        return docinfo
+    
+    
+    def getDocinfo(self, mode, url):
+        """returns docinfo depending on mode"""
+        zLOG.LOG("documentViewer (getdocinfo)", zLOG.INFO,"mode: %s, url: %s"%(mode,url))
+        # look for cached docinfo in session
+        if self.REQUEST.SESSION.has_key('docinfo'):
+            docinfo = self.REQUEST.SESSION['docinfo']
+            # check if its still current
+            if docinfo is not None and docinfo.get('mode') == mode and docinfo.get('url') == url:
+                zLOG.LOG("documentViewer (getdocinfo)", zLOG.INFO,"docinfo in session: %s"%docinfo)
+                return docinfo
+        # new docinfo
+        docinfo = {'mode': mode, 'url': url}
+        if mode=="texttool": #index.meta with texttool information
+            docinfo = self.getDocinfoFromTextTool(url, docinfo=docinfo)
+        elif mode=="imagepath":
+            docinfo = self.getDocinfoFromImagePath(url, docinfo=docinfo)
+        else:
+            zLOG.LOG("documentViewer (getdocinfo)", zLOG.ERROR,"unknown mode!")
+        zLOG.LOG("documentViewer (getdocinfo)", zLOG.INFO,"docinfo: %s"%docinfo)
+        self.REQUEST.SESSION['docinfo'] = docinfo
+        return docinfo
+        
+        
+    def getPageinfo(self, start, current):
+        """returns pageinfo with the given parameters"""
+        pageinfo = {}
+        pageinfo['start'] = start
+        pageinfo['current'] = current
+        return pageinfo
+                
     def text(self,mode,url,pn):
         """give text"""
@@ -280,5 +359,6 @@
 #
 #        return list
-#    
+#
+
     def image(self,mode,url,pn):
         """give image out"""
@@ -297,25 +377,23 @@
             
         
-    def thumbs(self,mode,url,start):
-        """give thumbs out"""
-        if mode=="texttool": #index.meta with texttool information
-            return self.textToolThumb(url,int(start))
-        elif mode=="imagepath":
-            return self.imagePathThumb(url,int(start))
-        
-    security.declareProtected('View','index_html')
-    
-    
-    def index_html(self,mode,url,start=0,pn=1):
-        '''
-        view it
-        @param mode: defines which type of document is behind url
-        @param url: url which contains display information
-        '''
-        
-    
-        pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','documentViewer_template.zpt')).__of__(self)
-        return pt(mode=mode,url=url,start=start,pn=pn)
-        
+    def findDigilibUrl(self):
+        """try to get the digilib URL from zogilib"""
+        url = self.imageViewerUrl[:-1] + "/getScalerUrl"
+        try:
+            scaler = urlopen(url).read()
+            return scaler.replace("/servlet/Scaler?", "")
+        except:
+            return None
+    
+    def changeDocumentViewer(self,imageViewerUrl,title="",digilibBaseUrl=None,RESPONSE=None):
+        """init document viewer"""
+        self.title=title
+        self.imageViewerUrl=imageViewerUrl
+        self.digilibBaseUrl = digilibBaseUrl
+        
+        if RESPONSE is not None:
+            RESPONSE.redirect('manage_main')
+    
+    
         
         
@@ -324,5 +402,5 @@
 def manage_AddDocumentViewerForm(self):
     """add the viewer form"""
-    pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addDocumentViewer.zpt')).__of__(self)
+    pt=PageTemplateFile('zpt/addDocumentViewer', globals()).__of__(self)
     return pt()
   
@@ -334,3 +412,37 @@
     if RESPONSE is not None:
         RESPONSE.redirect('manage_main')
-    
+
+
+##
+## DocumentViewerTemplate class
+##
+class DocumentViewerTemplate(ZopePageTemplate):
+    """Template for document viewer"""
+    meta_type="DocumentViewer Template"
+
+
+def manage_addDocumentViewerTemplateForm(self):
+    """Form for adding"""
+    pt=PageTemplateFile('zpt/addDocumentViewerTemplate', globals()).__of__(self)
+    return pt()
+
+def manage_addDocumentViewerTemplate(self, id='viewer_main', title=None, text=None,
+                           REQUEST=None, submit=None):
+    "Add a Page Template with optional file content."
+
+    self._setObject(id, DocumentViewerTemplate(id))
+    ob = getattr(self, id)
+    ob.pt_edit(open(os.path.join(package_home(globals()),'zpt/viewer_main.zpt')).read(),None)
+    if title:
+        ob.pt_setTitle(title)
+    try:
+        u = self.DestinationURL()
+    except AttributeError:
+        u = REQUEST['URL1']
+        
+    u = "%s/%s" % (u, urllib.quote(id))
+    REQUEST.RESPONSE.redirect(u+'/manage_main')
+    return ''
+
+
+    
