from mod_python import apache, util
import HTMLgen
import os
import string

mainuser='papillon'
host='mfaure.are-ata.org'
maindir='img'

def list(dir, nodirs):
    listdir = os.listdir(dir)
    if nodirs:
        fun = lambda f: not os.path.isdir(os.path.normpath(os.path.join(dir,f)))
        listdir = filter(fun, listdir)
    else:
        try:
            listdir.remove('.img')
        except ValueError:
            pass
    listdir.sort(lambda x,y: cmp(string.lower(x),string.lower(y)))
    return listdir

def readfile(dir, subdir, name):
    path = os.path.join(dir, '.img', subdir, name)
    f = open(path)
    ret = f.read().splitlines()
    f.close()
    return ret

def writefile(user, dir, subdir, name, value):
    if user != mainuser:
        raise 'Permission Denied'
#    try:
    dirpath = os.path.join(dir, '.img', subdir)
    if not os.path.exists(dirpath):
        os.mkdir(dirpath)
    path = os.path.join(dirpath, name)
    f = file(path, 'w')
    f.write(value)
    f.close()
#    except OSError:
#        pass
#    except IOError:
#        pass
        
def make_link(proto, action, dir, name):
    if proto:
        return ''.join([proto,'://',host,'/',maindir,'/?action=',action,'&file=',os.path.join(dir, name)])
    else:
        return ''.join(['/',maindir,'/?action=',action,'&file=',os.path.join(dir, name)])

def ls(fields, user):
    dir = fields.getfirst('dir', '.')
    doc = HTMLgen.SimpleDocument(title=dir, stylesheet='/img/style.css')
    if os.path.isdir(dir):
        dirs = HTMLgen.List(id='dir')
        imgs = HTMLgen.List(id='img')
        files = HTMLgen.List(id='file')
        dirs.append(HTMLgen.Href('..', '..'))
        for name in list(dir, False):
            path = os.path.normpath(os.path.join(dir, name))
            if os.path.isdir(path):
                dirs.append(HTMLgen.Href(name, name))
            elif os.path.isfile(path):
                thumbpath = os.path.join(dir, '.img', 'thumb', name)
                sizepath = os.path.join(dir, '.img', 'size', name)
                thumbname = os.path.join('.img', 'thumb', name)
                if os.path.isfile(thumbpath):
                    d = HTMLgen.Div()
                    d.append(HTMLgen.Image(thumbname))
                    d.append(HTMLgen.BR())
                    try:
                        d.append(readfile(dir, 'title', name)[0])
                    except IOError:
                        d.append(name)
                    try:
                        d.append(HTMLgen.BR())
                        d.append(readfile(dir, 'size', name)[0])
                    except IOError:
                        pass
                    imgs.append(HTMLgen.Href(make_link('', 'view', dir, name), d))
                else:
                    files.append(HTMLgen.Href(name, name))
        doc.append(dirs)
        doc.append(imgs)
        doc.append(files)
    else :
        doc.append(HTMLgen.Paragraph('Not a directory'))
    return doc

def view_or_edit(edit, dir, name):
    ls = list(dir, True)
    try:
        title = readfile(dir, 'title', name)[0]
    except IOError:
        title = name
    doc = HTMLgen.SimpleDocument(title=title, stylesheet='/img/style.css')
    try:
        i = ls.index(name)
    except ValueError:
        i = 0
    nav_bar = HTMLgen.List(id='nav_bar')
    nav_bar.append(HTMLgen.Span(HTMLgen.Href(os.path.join('/img',dir), 'up'), id='up'))
    try:
        if i == 0:
            raise IndexError
        nav_bar.append(HTMLgen.Span(HTMLgen.Href(make_link('', 'view', dir, ls[i-1]), 'prev'), id='prev'))
    except IndexError:
        nav_bar.append(HTMLgen.Span('prev', id='prev'))
    try:
        nav_bar.append(HTMLgen.Span(HTMLgen.Href(make_link('', 'view', dir, ls[i+1]), 'next'), id='next'))
    except IndexError:
        nav_bar.append(HTMLgen.Span('next', id='next'))
    doc.append(nav_bar)
    doc.append(HTMLgen.H(1, title))
    imgfile = os.path.join('/img', dir, name)
    doc.append(HTMLgen.Href(imgfile,HTMLgen.Image(imgfile)))
    if edit:
        doc.append(HTMLgen.Href(make_link('', 'view', dir, name), 'view'))
        submit = HTMLgen.Input(type='submit',value='Save')
        form = HTMLgen.Form(make_link('', 'view', dir, name), submit=submit)
        form.append(submit)
        form.append(HTMLgen.BR())
    else:
        doc.append(HTMLgen.Href(make_link('https', 'edit', dir, name), 'edit'))

    try:
        descr = readfile(dir, 'description', name)
    except IOError:
        descr = [];

    if edit:
        form.append('Title')
        form.append(HTMLgen.Input(type='text',name='title',value=title))
        form.append(HTMLgen.BR())
        p = HTMLgen.Textarea('\n'.join(descr), name='description', cols=80, rows=25)
        form.append(p)
        form.append(HTMLgen.BR())
        doc.append(form)
    else:
        if descr:
            p = HTMLgen.Paragraph()
            for l in descr:
                p.append(l)
                p.append(HTMLgen.BR())
            doc.append(p)
    return doc

def view(fields, user):
    file = fields['file']
    dir, name = os.path.split(file)
    if dir == '':
        dir = '.'
    try:
        writefile(user, dir, 'title', name, fields['title'])
    except KeyError:
        pass
    try:
        writefile(user, dir, 'description', name, fields['description'])
    except KeyError:
        pass
    return view_or_edit(False, dir, name)

def edit(fields, user):
    file = fields['file']
    dir, name = os.path.split(file)
    if dir == '':
        dir = '.'
    return view_or_edit(True, dir, name)

def handler(req):
    req.content_type = 'text/html'
    fields = util.FieldStorage(req)
    os.chdir(os.path.dirname(__file__))
    action = fields.getfirst('action', 'ls')
    doc = {
        'ls': ls,
        'view': view,
        'edit': edit}.get(action, ls)(fields, req.user)
    req.write(str(doc))
    return apache.OK
    

