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

    @copyright: 2003-2009 Nir Soffer, Thomas Waldmann, Gareth Lee
    @license: GNU GPL, see COPYING for details.
"""

from MoinMoin import wikiutil
from MoinMoin.theme import ThemeBase

class Theme(ThemeBase):

    name = "simple_cms"

    # This method produces a simplified search form which only allows full text search
    def simple_searchform(self, d):
        """
        assemble HTML code for the search forms

        @param d: parameter dictionary
        @rtype: unicode
        @return: search form html
        """
        _ = self.request.getText
        form = self.request.form
        updates = {
            'search_label': _('Search:'),
            'search_value': wikiutil.escape(form.get('value', [''])[0], 1),
            'search_full_label': _('Search'),
            'baseurl': self.request.getScriptname(),
            'pagename_quoted': wikiutil.quoteWikinameURL(d['page'].page_name),
            }
        d.update(updates)

        html = u'''
<form id="searchform" method="get" action="%(baseurl)s/%(pagename_quoted)s">
<div>
<input type="hidden" name="action" value="fullsearch">
<input type="hidden" name="context" value="180">
<label for="searchinput">%(search_label)s</label>
<input id="searchinput" type="text" name="value" value="%(search_value)s" size="20"
    onfocus="searchFocus(this)" onblur="searchBlur(this)"
    onkeyup="searchChange(this)" onchange="searchChange(this)" alt="Search">
<input id="fullsearch" name="fullsearch" type="submit"
    value="%(search_full_label)s" alt="Search Full Text">
</div>
</form>
<script type="text/javascript">
<!--// Initialize search form
var f = document.getElementById('searchform');
f.getElementsByTagName('label')[0].style.display = 'none';
var e = document.getElementById('searchinput');
searchChange(e);
searchBlur(e);
//-->
</script>
''' % d
        return html

    def navibar(self, d):
        """ Assemble the navibar

        @param d: parameter dictionary
        @rtype: unicode
        @return: navibar html
        """

        request = self.request
        found = {} # pages we found. prevent duplicates
        items = [] # navibar items
        item = u'<li class="%s">%s</li>'
        current = d['page_name']

        # Process config navi_bar
        if request.cfg.navi_bar:
            for text in request.cfg.navi_bar:
                pagename, link = self.splitNavilink(text)
                if pagename == current:
                    cls = 'wikilink current'
                else:
                    cls = 'wikilink'
                items.append(item % (cls, link))
                found[pagename] = 1

        # Assemble html
        items = u''.join(items)
        html = u'''
<ul id="navibar">
%s
</ul>
''' % items
        return html

    def header(self, d, **kw):
        """ Assemble wiki header

        @param d: parameter dictionary
        @rtype: unicode
        @return: page header html
        """
        if self.request.user.valid and self.request.user.name:
            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),
                u'<div id="locationline">',
                self.interwiki(d),
                self.title(d),
                u'</div>',
                self.trail(d),
                self.navibar(d),
                #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(),
            ]
        else:
            html = [
                # Pre header custom html
                self.emit_custom_html(self.cfg.page_header1),

                # Header
                u'<div id="header">',
                self.logo(),
                self.simple_searchform(d),
                #self.username(d),
                u'<div id="locationline">',
                self.interwiki(d),
                self.title(d),
                u'</div>',
                #self.trail(d),
                self.navibar(d),
                #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(),
            ]

        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.title(d),
            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']
        if self.request.user.valid and self.request.user.name:
            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),
                u'<div id="pageline"><hr style="display:none;"></div>',
                self.credits(d),
                self.showversion(d, **keywords),
                u'</div>',

                # Post footer custom html
                self.emit_custom_html(self.cfg.page_footer2),
                ]
        else:
            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),
                u'<div id="pageline"><hr style="display:none;"></div>',
                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)

