# -*- coding: iso-8859-1 -*-
"""
    MoinMoin - modern theme + approve support

    @copyright: 2003-2005 by Nir Soffer, Thomas Waldmann, Robert Penz
    @license: GNU GPL, see COPYING for details.
"""

import os

from MoinMoin.theme import ThemeBase
from MoinMoin import i18n, wikiutil, config, version

class Theme(ThemeBase):

    name = "modern"
    _showApproveLink = None
    
    def approved(self, page):
	""" this methods writes approved by xxx into the output and set a flag
	    which controls the output of the """
	approvedFile = os.path.join(page.getPagePath(), "approved")
	if os.path.isfile(approvedFile):
	    approvedRevision = {}
	    for line in open(approvedFile).readlines():
		tmp = line.split("\t")
		approvedRevision[tmp[0]] = tmp[1]
	    currentRevision = "%08d" % page.get_real_rev()
	    if currentRevision in approvedRevision:
		self._showApproveLink = False
		return "approved by " + approvedRevision[currentRevision]
	if page.get_real_rev() == page.getRevList()[0]:
	    self._showApproveLink = True
	else:
	    self._showApproveLink = False
	return ""

    def approveLink(self, page):
        """ Return approve link to valid users

        @rtype: unicode
        @return: approve link
        """
        _ = self.request.getText

	#if user has perms
	title = _("Approve")
	quotedname = wikiutil.quoteWikinameURL(page.page_name)
	link = wikiutil.link_tag(self.request, quotedname +
				 '?action=ApprovePage', title)
	return link

    def editbar(self, d):
	""" This is a bad hack to add our approveLink to the editbar
	    as otherwise the whole editbar methode would be needed to be overwritten """
	output = ThemeBase.editbar(self, d)	
	if self._showApproveLink:
	    if "approve" not in self.request.cfg.actions_excluded and self.request.user.may.approve(d["page_name"]):
		output = output[:-6] + self.approveLink(d['page']) + output[-6:]
	return output
    
    def header(self, d, **kw):
        """ Assemble wiki header
        
        @param d: parameter dictionary
        @rtype: unicode
        @return: page header html
        """
	revision = self.request.page.rev or self.request.page.get_real_rev()
        html = [
            # Pre header custom html
            self.emit_custom_html(self.cfg.page_header1),
            
            # Header
            u'<div id="header">',
            self.logo(),
            self.searchform(d),
            self.username(d),
            self.trail(d),
            self.navibar(d),
	    self.approved(d['page']),
            #u'<hr id="pageline">',
            u'<div id="pageline"><hr style="display:none;"></div>',
            self.msg(d),
            self.editbar(d),
            u'</div>',
            
            # Post header custom html (not recommended)
            self.emit_custom_html(self.cfg.page_header2),
            
            # Start of page
            self.startPage(),
            self.title(d),
        ]
        return u'\n'.join(html)

    def editorheader(self, d, **kw):
        """ Assemble wiki header for editor
        
        @param d: parameter dictionary
        @rtype: unicode
        @return: page header html
        """
        html = [
            # Pre header custom html
            self.emit_custom_html(self.cfg.page_header1),
            
            # Header
            u'<div id="header">',
            self.msg(d),
            u'</div>',
            
            # Post header custom html (not recommended)
            self.emit_custom_html(self.cfg.page_header2),
            
            # Start of page
            self.startPage(),
        ]
        return u'\n'.join(html)

    def footer(self, d, **keywords):
        """ Assemble wiki footer
        
        @param d: parameter dictionary
        @keyword ...:...
        @rtype: unicode
        @return: page footer html
        """
        page = d['page']
        html = [
            # End of page
            self.pageinfo(page),
            self.endPage(),
            
            # Pre footer custom html (not recommended!)
            self.emit_custom_html(self.cfg.page_footer1),
            
            # Footer
            u'<div id="footer">',
            self.editbar(d),
            self.credits(d),
            self.showversion(d, **keywords),
            u'</div>',
            
            # Post footer custom html
            self.emit_custom_html(self.cfg.page_footer2),
            ]
        return u'\n'.join(html)

        
def execute(request):
    """
    Generate and return a theme object
        
    @param request: the request object
    @rtype: MoinTheme
    @return: Theme object
    """
    return Theme(request)

