# -*- coding: iso-8859-1 -*-
"""
    MoinMoin - rightsidebar_iso theme

    Created by and for crw.
    Later it was rewritten by Nir Soffer for MoinMoin release 1.3.

    @copyright: 2005 Nir Soffer
    @license: GNU GPL, see COPYING for details.

    Changes by Frank Steinhauer, 22.04.2008:
    * Added approval changes of Oliver Siemoneit in theme "modern_iso" to this theme
    * 11.2010: improved, showing ApprovalHistory (based on approval by lameike)

"""

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

class Theme(ThemeBase):

    name = "rightsidebar_iso"

#FST new approval
    _showApproveLink = None

    def showApproval(self, page):
        """ this methods writes approved by xxx into the output and set a flag
            which controls the output of the """

        # check whether page exists at all
        if not page.exists():
            return ""

        # don't show approval stuff when login or searching
        action = self.request.query_string
        if action.startswith('action=login') or action.startswith('action=fullsearch') or action.startswith('action=user'):
            return ""

        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 showApprovalHistory(self, d):
        """ 
            Show box with approval message if there is are approved versions of this page
        """
        page = d['page']

        # check whether page exists at all
        if not page.exists():
            return ""

        approvedFile = os.path.join(page.getPagePath(), "approved")
        if os.path.isfile(approvedFile):
            action = self.request.query_string
            # Note: if (self.query_string.find('action=login') < 0) might work too...
            if not action.startswith('action=login') and not action.startswith('action=fullsearch') and not action.startswith('action=user'):
                # return the page's approval status
                return page.getApprovalMessage()
        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)
        return page.link_to(self.request, text=_('Approve', formatted=False), querystr='action=approvePage')

    def editbarItems(self, page):
        """ add our approve stuff to the list """
        links = ThemeBase.editbarItems(self,page)
        if self._showApproveLink:
            if "approve" not in self.request.cfg.actions_excluded and self.request.user.may.approve(page.page_name):
                links.append(self.approveLink(page))
        return links
#FST end of new approval

    def wikipanel(self, d):
        """ Create wiki panel """
        _ = self.request.getText
        html = [
            u'<div class="sidepanel">',
            u'<h1>%s</h1>' % _("Wiki"),
            self.navibar(d),
            u'</div>',
            ]
        return u'\n'.join(html)

    def pagepanel(self, d):
        """ Create page panel """
        _ = self.request.getText
        if self.shouldShowEditbar(d['page']):
            html = [
                u'<div class="sidepanel">',
                u'<h1>%s</h1>' % _("Page"),
                self.editbar(d),
                u'</div>',
                ]
            return u'\n'.join(html)
        return ''

    def userpanel(self, d):
        """ Create user panel """
        _ = self.request.getText

        html = [
            u'<div class="sidepanel">',
            u'<h1>%s</h1>' % _("User"),
            self.username(d),
            u'</div>'
            ]
        return u'\n'.join(html)

    def header(self, d):
        """
        Assemble page header

        @param d: parameter dictionary
        @rtype: string
        @return: page header html
        """
        _ = self.request.getText

        html = [
            # Custom html above header
            self.emit_custom_html(self.cfg.page_header1),

            # Header
            u'<div id="header">',
            self.searchform(d),
            self.logo(),
            u'<div id="locationline">',
            self.interwiki(d),
            self.title(d),
            self.showApproval(d['page']), #FST new approval
            u'</div>',
            self.trail(d),
            u'</div>',

            # Custom html below header (not recomended!)
            self.emit_custom_html(self.cfg.page_header2),

            self.showApprovalHistory(d), #FST

            # Sidebar
            u'<div id="sidebar">',
            self.wikipanel(d),
            self.pagepanel(d),
            self.userpanel(d),
            u'</div>',

            self.msg(d),

            # Page
            self.startPage(),
            ]
        return u'\n'.join(html)

    def editorheader(self, d):
        """
        Assemble page header for editor

        @param d: parameter dictionary
        @rtype: string
        @return: page header html
        """
        _ = self.request.getText

        html = [
            # Custom html above header
            self.emit_custom_html(self.cfg.page_header1),

            # Header
            #u'<div id="header">',
            #self.searchform(d),
            #self.logo(),
            #u'</div>',

            # Custom html below header (not recomended!)
            self.emit_custom_html(self.cfg.page_header2),

            # Sidebar
            u'<div id="sidebar">',
            self.wikipanel(d),
            self.pagepanel(d),
            self.userpanel(d),
            u'</div>',

            self.msg(d),

            # Page
            self.startPage(),
            #self.title(d),
            ]
        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.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)

