"""
    MoinMoin - FlashManager Macro

    An action macro to merge flash (swf) movies into template flash files for synchronous play

    Usage:
      put it in action and upload some files
      
    Procedure: 
      This routine is based on the work of Matthias Effer (M.Effer@fz-juelich.de) providing the flash template files
      They were created by the swfc compiler from www.swftools.org   A desrciption in german is in preparation at http://www.linuxwiki.org/SWFC
      momenatnly the templates are stored in wiki/htdocs/flash_templates

    Restrictions:
      Needs MoinMoin 1.5.x

    @copyright: 2006 Reimar Bauer
    2006-02-28 : initial version
    @license: GNU GPL, see COPYING for details.
"""

import os,re
from MoinMoin.action import AttachFile
from MoinMoin.Page import Page
from MoinMoin.parser import wiki
from MoinMoin.action.AttachFile import _get_files
from MoinMoin import config, wikiutil
from MoinMoin.formatter.text_html import Formatter
from MoinMoin.parser.wiki import Parser
from MoinMoin.parser import wiki
from MoinMoin.PageEditor import PageEditor

def swf_list(request, pagename):
    all_files=_get_files(request, pagename)
    selection_list=[]

    for test in all_files:
        if '.swf' in test > 0 and not 'SWF_Result' in test > 0:
            selection_list.append(test)

    option = ''
    for txt in selection_list:
        option += '<OPTION>%(txt)s</OPTION>\n' % {'txt': txt}

    return option


def form(option):

    formhtml = '''
<form method="post" action="">
<input type="hidden" name="action" value="%(actname)s">
<input type="hidden" name="ticket" value="%(ticket)s">
<p>
<TABLE><TR><TD>
Select up to six flash movies<br>
<SELECT NAME="List" SIZE="3" MULTIPLE>
%(option)s
</SELECT>
<p>
</TD>
</TR></TABLE>
<strong>%(querytext)s</strong>
<input type="submit" name="button" value="%(button)s">
</form>''' % {
    'querytext': '',
    'actname': 'FlashManager',
    'ticket' :wikiutil.createTicket(),
    'option': option,
    'button': 'Select'}

    return formhtml

def FlashManager(request,pagename,option):
    _ = request.getText

    request.formatter = Formatter(request)
    request.page = Page(request, pagename)
    request.formatter.page = request.page
    body = request.page.get_raw_body()
    attachment_path = AttachFile.getAttachDir(request,pagename,create=0)
    
    n = min(len(option),6)
    files = []
    for txt in option:
        files.append(os.path.join(AttachFile.getAttachDir(request,pagename), txt))
    
        
    template_path = os.path.join(request.cfg.data_dir,'../../htdocs/flash_templates')
    result = 'SWF_Result.swf'
    template = '%(template_path)s/template_%(n)sframes.swf' % {
               'template_path': template_path,
               'n': n}
    result_file = os.path.join(AttachFile.getAttachDir(request,pagename), result)
    
    i = 1
    ports = ''
    for file in files:
        ports += " viewport%(i)s='%(file)s' " % {
            'i': str(i),
            'file': file}
        i += 1    

    cmd = "/usr/local/bin/swfcombine -o '%(result_file)s' '%(template)s' %(ports)s" % {
                  'ports': ports,
                  'result_file': result_file,
                  'template': template}
    os.system(cmd)
    
   # cmd = "/usr/local/bin/swfbbox -Oe '%(result_file)s' -o '%(result_file)s'" % {'result_file': result_file} 
   # os.system(cmd)
    
    page = PageEditor(request,pagename)
    rev = page.current_rev()
    if not result in body:
        newtext = body + '[[EO('+result+',width=100%,height=100%)]]\n' 
        PageEditor.saveText(page,newtext,rev)

    thispage = Page(request,pagename)
    option = swf_list(request, pagename)
    formhtml = form(option)
    return thispage.send_page(request, msg=formhtml)

    msg = 'done'
    Page(request, pagename).send_page(request, msg=msg)

def execute(pagename, request):
    if request.user.valid:
        _ = request.getText
        actname = __name__.split('.')[-1]

        if request.user.may.read(pagename):
            thispage = Page(request,pagename)
            option = swf_list(request, pagename)
            if request.form.has_key('button') and request.form.has_key('ticket') and (len(request.form.get('List', [u''])[0]) > 0):
	        
            # check whether this is a valid recommention request (make outside
            # attacks harder by requiring two full HTTP transactions)
                if not wikiutil.checkTicket(request.form['ticket'][0]):
                    return thispage.send_page(request,
                        msg = _('Please use the interactive user interface to select data!'))

                option = request.form.get('List', [u''])
                return FlashManager(request,pagename,option)

            formhtml = form(option)

            return thispage.send_page(request, msg=formhtml)
    else:
        msg = 'Please login with your valid user name otherwise you cant''t use this macro!'
        Page(request, pagename).send_page(request, msg=msg)
