from MoinMoin.theme.modernized import Theme as ThemeBase
from MoinMoin import wikiutil, config
from MoinMoin.Page import Page

class Theme(ThemeBase):

    name = "modernized" # we tell that we are 'modernized', so we use its static data

    def __init__(self, request):
        ThemeBase.__init__(self, request)

        import re
        self.is_mobile = re.search(r"android.+mobile|iphone|ipod", request.http_user_agent, re.I|re.M) is not None

    def html_head(self, d):
        if not self.is_mobile:
            return ThemeBase.html_head(self, d)

        html = [
            u'<title>%(title)s - %(sitename)s</title>' % {
                'title': wikiutil.escape(d['title']),
                'sitename': wikiutil.escape(d['sitename']),
            },
            self.html_stylesheets(d),
            ]
        return '\n'.join(html)

    def guiworks(self, page):
        if not self.is_mobile:
            return ThemeBase.guiworks(self, page)

        return False

    def header(self, d, **kw):
        if not self.is_mobile:
            return ThemeBase.header(self, d, **kw)

        html = [
            u'<div id="header">',
            self.logo(),
            self.username(d),
            u'<h1 id="locationline">',
            self.title_with_separators(d),
            u'</h1>',
            u'<div id="pageline"><hr style="display:none;"></div>',
            self.msg(d),
            self.editbar(d),
            u'</div>',
        ]
        return u'\n'.join(html)

    def editorheader(self, d, **kw):
        if not self.is_mobile:
            return ThemeBase.editorheader(self, d, **kw)

        html = [
            u'<div id="header">',
            u'<h1 id="locationline">',
            self.title_with_separators(d),
            u'</h1>',
            self.msg(d),
            u'</div>',
        ]
        return u'\n'.join(html)

    def footer(self, d, **keywords):
        if not self.is_mobile:
            return ThemeBase.footer(self, d, **keywords)

        page = d['page']
        html = [
            self.pageinfo(page),
            u'<div id="footer">',
            self.credits(d),
            self.showversion(d, **keywords),
            u'</div>',
            ]
        return u'\n'.join(html)

    def send_title(self, text, **keywords):
        if not self.is_mobile:
            return ThemeBase.send_title(self, text, **keywords)

        request = self.request

        if keywords.has_key('page'):
            page = keywords['page']
            pagename = page.page_name
        else:
            pagename = keywords.get('pagename', '')
            page = Page(request, pagename)

        request.content_type = "text/html; charset=%s" % (config.charset, )

        user_head = []
        user_head.append('''<meta http-equiv="Content-Type" content="%s;charset=%s">\n''' % (page.output_mimetype, page.output_charset))
        user_head.append('<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>')

        output = []
        output.append("""\
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
%s
%s
%s
""" % (
            ''.join(user_head),
            self.html_head({
                'page': page,
                'title': text,
                'sitename': request.cfg.html_pagetitle or request.cfg.sitename,
                'print_mode': keywords.get('print_mode', False),
                'media': keywords.get('media', 'screen'),
            }),
            keywords.get('html_head', ''),
        ))
        output.append("</head>\n")

        bodyattr = []
        output.append('\n<body%s>\n' % ''.join(bodyattr))

        d = {
            'theme': self.name,
            'title_text': text,
            'page': page,
            'page_name': pagename or '',
            'user_name': request.user.name,
            'user_valid': request.user.valid,
            'msg': self._status,
            'editor_mode': keywords.get('editor_mode', 0),
        }
        request.themedict = d
        if keywords.get('editor_mode', 0):
            output.append(self.editorheader(d))
        else:
            output.append(self.header(d))

        request.write(''.join(output))
        self._send_title_called = True

    def send_footer(self, pagename, **keywords):
        if not self.is_mobile:
            return ThemeBase.send_footer(self, pagename, **keywords)

        request = self.request
        d = request.themedict
        request.write(self.footer(d, **keywords))

    def send_closing_html(self):
        if not self.is_mobile:
            return ThemeBase.send_closing_html(self)

        request = self.request
        d = request.themedict
        if d['editor_mode']:
            request.write('''
<script>
document.getElementById('editor-help').style.display = "none";
(function() {
    // auto grow text area
    var textarea = document.getElementById('editor-textarea'),
        timer;
    textarea.onfocus = function() {
        timer = setInterval(function() {
            var scrollHeight = textarea.scrollHeight,
                clientHeight = textarea.clientHeight;
            if(clientHeight < scrollHeight) {
                textarea.style.height = scrollHeight + 50 + 'px';
            }
        }, 100);
    };
    textarea.onblur = function() {
        clearInterval(timer);
    };
})();
</script>
''')
        request.write('</body>\n</html>\n\n')

def execute(request):
    return Theme(request)
