# -*- coding: iso-8859-1 -*-
"""
    MoinMoin - Feedback / Guestbook Page

    This way you can have a simple guestbook in your wiki.

    See: http://www.erzgebirgstraverse.de/moin/G%C3%A4stebuch

    Just copy this file to

    share/moin/YOURWIKI/data/plugin/parser/feedback.py

    Create a new pages with this content:

    #format feedback
    
    @copyright: 2007 by Thomas Güttler http://www.thomas-guettler.de/
    @license: any open source licence you like

    History:

     2007-12-14: Added JavaScript magic to stop spam robots.
     
"""

# Python Imports
import re
import cgi
import time
import textwrap

# MoinMoin Imports
from MoinMoin import wikiutil
from MoinMoin.PageEditor import PageEditor

Dependencies = []
magic="###EOM###"

class Parser:
    """
    Feedback Page
    """

    extensions = []
    Dependencies = []

    def __init__(self, raw, request, **kw):
        """
        Store the source text.
        """
        self.raw = raw
        self.request = request
        self.form = request.form
        self._ = request.getText

    def format(self, formatter):
        """
        Parse and send the table.
        """
        errors=[]
        def getvar(name):
            var=''.join(self.form.get(name, "")).strip()
            if magic in var:
                errors.append("Value contains magic: %s" % magic)
                var=""
            if len(var)>2000:
                errors.append("Value is too long")
                var=""
            return var
        frm=getvar("frm")
        subject=getvar("subject")
        message=getvar("message")

        # This variable is set via javascript in hope that it will stop
        # spam robots from submitting advertisment messages.
        reject=getvar("reject")
        
        if frm and subject and message:
            if subject.lower().startswith("ok:"):
                subject=subject[3:]
                reject="ok"
            else:
                errors.append("Sorry, you have JavaScript disabled. Please start the subject with OK:....")
                subject='OK:%s' % subject
            if reject=="ok":
                self.raw="#format feedback\nFrom: %s\nSubject: %s\n" \
                         "Date: %s\n%s\n%s\n%s" % (
                    frm, subject, time.strftime("%Y-%m-%d %H:%M"), message,
                    magic, self.raw)
                pageeditor=PageEditor(self.request, formatter.page.page_name)
                pageeditor._write_file(self.raw)
                message=""
                subject=""
        else:
            if (frm or subject or message):
                errors.append("Please fill From, Subject and Message")
            
        messages = self.raw.split('\n%s\n' % magic)
        html=[]
        for msg in messages:
            msg=msg.strip()
            if not msg:
                continue
            match=re.match(
                r'(#.*\n)?\s*From: (.+?)\nSubject: (.+?)\nDate: (.+?)\n(.*)$',
                msg, re.DOTALL)
            assert match, "Broken message %s" % msg
            comment, mfrm, msubject, date, msg = match.groups()
            msg='\n'.join(textwrap.wrap(msg))
            html.append('''
            <hr>
            <table>
             <tr>
              <td style="text-align: left">From</td><td>%s</td>
             </tr>
             <tr>
              <td style="text-align: left">Subject</td><td>%s</td>
             </tr>
             <tr>
              <td style="text-align: left">Date</td><td>%s</td>
             </tr> 
             <tr>
              <td colspan="2"><pre style="text-align: left">%s</pre></td>
             </tr>
            </table>''' % (cgi.escape(mfrm), cgi.escape(msubject),
                           cgi.escape(date), cgi.escape(msg)))
        errors='\n'.join(["<li>%s" % cgi.escape(e) for e in errors])
        if errors:
            errors='<ul style="color: red">%s</ul>' % errors

        html='''
         <div style="text-align: center; width: 100%%">
          <form action="%s" method="post">
           <table>
            <tr><td>From</td><td><input type="text" name="frm" size="20" value="%s"></td></tr>
            <tr><td>Subject</td><td><input type="text" name="subject" size="20" value="%s"></td></tr>
            <tr><td>Message</td><td><textarea name="message" cols="50" rows="10">%s</textarea></td></tr>
            <tr><td colspan="2"><input type="submit" value=" Submit " onclick="this.form.reject.value='ok';return true"></td></tr>
           </table>
           <input type="hidden" name="reject" value="unchanged">
          </form> 
          %s<br>
          %s

         </div>''' % (
            wikiutil.quoteWikinameURL(formatter.page.page_name),
            cgi.escape(frm, True), cgi.escape(subject, True), cgi.escape(message),
            errors,
            '\n'.join(html))
        self.request.write(html)
             
