# -*- coding: iso-8859-1 -*-
"""
    MoinMoin - gallery2Image Actionmacro

    PURPOSE:
        This action macro is used to rotate the images from Gallery2

    CALLING SEQUENCE:
        called by Gallery2 POST Method

    PROCEDURE:
        see Gallery2

        Please remove the version number from this file

    RESTRICTIONS:
        spaces in file names are not supported. I don't know how to escape them right.	

    MODIFICATION HISTORY:
        Version 1.3.3.-1
        @copyright: 2005 by Reimar Bauer (R.Bauer@fz-juelich.de)
        @license: GNU GPL, see COPYING for details.
        2005-06-24: 1.3.3.-2 feature reqeust of CraigJohnson added 
                             os.path.join used to join platform independent pathes 
                             os.unlink removed to get it more platform independend
        2005-08-06: 1.3.5-3 RB VS mode added 
                            by one step back or forward could be toggled through the selected slides
                            and the first and last one could be selected too
        2005-08-07 1.3.5-4 RB bug fixed for cgi-bin call. formatting of tables adjusted                    
        2005-08-13 1.3.5-5 RB code change from GET to POST
                              forms instead of link
                              toggle between webnail and image by click on image
                              alias (description) and exif_date added
                              this version needs Gallery2-1.3.5-7.py
        2005-08-17 1.3.5-6 RB FIRST and LAST removed (thats only for testing at the moment)
        
                              
        next ist clean up                       
                       

"""
Dependencies = []
import os,string,Image,StringIO
from MoinMoin import config, wikiutil
from MoinMoin.PageEditor import PageEditor
from MoinMoin import user, util
from MoinMoin.Page import Page
from MoinMoin.action import AttachFile
from MoinMoin.formatter.text_html import Formatter
from MoinMoin.parser import wiki

def to_wikiname(request,text):

    #taken from test_parser_wiki
    page = Page(request, 'ThisPageDoesNotExistsAndWillNeverBeReally')
    page.formatter = Formatter(request)
    request.formatter = page.formatter
    page.formatter.setPage(page)
    page.hilite_re = None
    
    out=StringIO.StringIO()
    request.redirect(out)
    wikiizer = wiki.Parser(text.strip(),request)
    wikiizer.format(page.formatter)
    naw=out.getvalue()
    request.redirect()
    del out
    
    return naw.strip()


action_name = __name__.split('.')[-1]

def execute(pagename, request):
    """ Main dispatcher for the 'Gallery' action.
    """
    _ = request.getText
    
    request.formatter = Formatter(request)
    if request.form['do'][0] == 'VS':
        web = {}
        images = string.split(request.form['target'][0],',')
        target = images[0]
        images = (images[1:])
        
        full_image = string.split(request.form['full'][0],',')
        full_target = full_image[0]
        full_image = (full_image[1:])
        
        all_description = string.split(request.form['alias'][0],'!,!')
        this_description = all_description[0]
        all_description = (all_description[1:])
        
        all_exif_date = string.split(request.form['exif_date'][0],',')
        this_exif_date = all_exif_date[0]
        all_exif_date = (all_exif_date[1:])
        
        z = 0
        for img in images :
            if (target == img):
               previous = z - 1
               next = z + 1
      
            z += 1
        n = len(images)
       
        ######## url_wiki_page #############################################################
        text = pagename
        url = pagename
        url_wiki_page = wikiutil.link_tag(request, url, text = text,
                                          formatter = request.formatter)   
        ############################################################################			 

        attachment_path = AttachFile.getAttachDir(request,pagename)

        web['src'] = AttachFile.getAttachUrl(pagename,target,request)
        web['title'] = target
        image_link = request.formatter.image(**web)
       
        request.http_headers()
        request.write('<html>')
        request.write('<head>')
        request.write('<meta http-equiv="Content-Type" content="text/html;charset=utf-8">')
        request.write('<meta name="robots" content="noindex,nofollow">')
        request.write("<H2>%s</H2>" % url_wiki_page)
        request.write('<TABLE BORDER="1" ALIGN="CENTER"><TR><TD>')
     
        if n > 1:
            request.write('<TABLE ALIGN="CENTER"><TR>')
            url = '<form action="%(baseurl)s/%(pagename)s" method="POST" enctype="multipart/form-data">' % {
                  'baseurl': request.getScriptname(),
                  'pagename': wikiutil.quoteWikinameURL(pagename)}

            url = url + '<input type="hidden" name="action" value="gallery2image">'
            url = url + '<input type="hidden" name="do" value="VS">'
            url = url + '<input type="hidden" name="full" value="'+full_image[previous]+","+string.join(full_image,',')+'">'
            url = url + '<input type="hidden" name="alias" value="'+all_description[previous]+'!,!'+string.join(all_description,'!,!')+'">'
            url = url + '<input type="hidden" name="exif_date" value="'+all_exif_date[previous]+','+string.join(all_exif_date,',')+'">'
            url = url + '<input type="hidden" name="target" value="'+images[previous]+","+string.join(images,',')+'">'
            if (previous >= 0):
                url = url + '<input type="submit" value="PREVIOUS" >'
            else:
                url = url + '<input type="submit" value="PREVIOUS" disabled>' 
            url = url + '</FORM>'
               
            request.write("<TD>%s</TD>" % url)
     
            url = '<form action="%(baseurl)s/%(pagename)s" method="POST" enctype="multipart/form-data">' % {
                  'baseurl': request.getScriptname(),
                  'pagename': wikiutil.quoteWikinameURL(pagename)}
            if next < n:
                url = url + '<input type="hidden" name="action" value="gallery2image">'
                url = url + '<input type="hidden" name="do" value="VS">'
                url = url + '<input type="hidden" name="full" value="'+full_image[next]+","+string.join(full_image,',')+'">'
                url = url + '<input type="hidden" name="exif_date" value="'+all_exif_date[next]+','+string.join(all_exif_date,',')+'">'
                url = url + '<input type="hidden" name="alias" value="'+all_description[next]+'!,!'+string.join(all_description,'!,!')+'">'
                url = url + '<input type="hidden" name="target" value="'+images[next]+","+string.join(images,',')+'">'
                url = url + '<input type="submit" value="NEXT" >'
            else:
                url = url + '<input type="submit" value="NEXT" disabled >'
            url = url + '</FORM>'
                
            request.write("<TD>%s</TD>" % url)
                              

            request.write("</TR></TABLE>")
        
        url = '<form action="%(baseurl)s/%(pagename)s" method="POST" enctype="multipart/form-data"><TT>' % {
              'baseurl': request.getScriptname(),
              'pagename': wikiutil.quoteWikinameURL(pagename)}

        url = url + '<input type="hidden" name="action" value="gallery2image">'
        url = url + '<input type="hidden" name="do" value="VS">'
        url = url + '<input type="hidden" name="full" value="'+target+","+string.join(images,',')+'">'
        url = url + '<input type="hidden" name="alias" value="'+this_description+'!,!'+string.join(all_description,'!,!')+'">'
        url = url + '<input type="hidden" name="exif_date" value="'+this_exif_date+','+string.join(all_exif_date,',')+'">'
        url = url + '<input type="hidden" name="target" value="'+full_target+","+string.join(full_image,',')+'">'
        url = url + '<input type="image" value="submit" src="'+AttachFile.getAttachUrl(pagename,target,request)+'">'
        url = url + '</FORM>'             
        
        
        request.write(url)
        
        request.write("</TD></TR>")
        request.write("<TR><TD>")
        
        request.write(to_wikiname(request,this_description))
      
        request.write("</TD></TR>")
        request.write("<TR><TD>")
        
        request.write(this_exif_date)
      
        request.write("</TD></TR>")
        request.write("<TR><TD>")
        request.write("back to %(url_wiki_page)s" % {
                      "url_wiki_page":url_wiki_page})  
      
        request.write("</TD></TR></TABLE>")	    
        request.write("</HTML>")
        
        return
        
    elif request.form['do'][0] == 'PS':
            images=string.split(request.form['target'][0],',')
            attachment_path = AttachFile.getAttachDir(request,pagename)
            target=request.form['target'][0]

            msg= _('not finished by now') #+ target

    elif request.user.may.delete(pagename):
       # only users which are allowed to delete should use this tool

        target=request.form['target'][0]
        file, ext = os.path.splitext(target)

        if ext == '.gif' or ext == '.png':
            img_type='PNG'
            thumbfile='thumbnail_'+file+".png"
            webnail='webnail_'+file+".png"
        else:
            img_type="JPEG"
            thumbfile='thumbnail_'+file+".jpg"
            webnail='webnail_'+file+".jpg"


        attachment_path = AttachFile.getAttachDir(request,pagename)
        thumb=os.path.join(attachment_path,thumbfile)
        webf=os.path.join(attachment_path,webnail)
        infile=os.path.join(attachment_path,target)

        msg = None
        if action_name in request.cfg.excluded_actions:
            msg = _('File attachments are not allowed in this wiki!')

        elif request.form['do'][0] == 'RM':
            if os.path.exists(infile+'.bak'):
               os.unlink(infile+'.bak')
            os.link(infile,infile+'.bak')
            os.unlink(infile)
            os.unlink(webf)
            os.unlink(thumb)

            msg= _('%(target)s deleted, backup in place' % {
                  'target':target})

        elif request.form['do'][0] == 'RL':
            im = Image.open(infile)
            #os.unlink(infile)
            im.rotate(90).save(infile,img_type)
            nim = Image.open(infile)
            nim.thumbnail((640,640), Image.ANTIALIAS)
            #os.unlink(webf)
            nim.save(webf, img_type)
            nim.thumbnail((128, 128), Image.ANTIALIAS)
            #os.unlink(thumb)
            nim.save(thumb, img_type)
            msg= _('%(target)s rotated to left 90 degrees' % {
                  'target':target})

        elif request.form['do'][0] == 'RR':
            im = Image.open(infile)
            #os.unlink(infile)
            im.rotate(270).save(infile,img_type)


            nim = Image.open(infile)

            nim.thumbnail((640,640), Image.ANTIALIAS)
            #os.unlink(webf)
            nim.save(webf, img_type)
            nim.thumbnail((128, 128), Image.ANTIALIAS)
            #os.unlink(thumb)
            nim.save(thumb, img_type)
            msg= _('%(target)s rotated to right 90 degrees' % {
                  'target':target})

        else:
            msg = _('action not implemented: %s') % (request.form['do'][0],)
    else:
        msg = _('Your are not allowed to change images on this page: %s') % (pagename,)

    if msg:
        AttachFile.error_msg(pagename, request, msg)

    return()
