#format python
# -*- coding: iso-8859-1 -*-
'''
    MoinMoin - RatingStars Macro
    Author: Nick King
    Date: September 2005, March 2006
  
    Purpose:
        This macro allows ratings of items using stars (based on Vote macro)
    Usage:
        [[RatingStars(UniqueName)]]
        e.g. 1. NiceShop [[RatingStars(shop1)]]
             1. EvenNicerShop [[RatingStars(shop2)]]
    Tested:
        Firefox 1.5 MoinMoin 1.5 Python 2.4             
'''

import os, StringIO
from MoinMoin.parser import wiki
from MoinMoin.Page import Page

def countstar(fname):
    #saved in PageName/attachments and can be viewed as normal attachments
    try:
        f = open(fname, 'r')
        result = int(f.read())
        f.close()
    except:
        result = 0    
    return result

def savestar(fname, starnum):
    try:
        f = open(fname, 'w')
        f.write(str(starnum))
        f.close()
        return True
    except:
        return False

def execute(macro, args):
    thisPage = macro.formatter.page
    thisPageName = thisPage.page_name
    thisUrl = thisPage.url(macro.request)
    thisForm = macro.form
    fname = os.path.join(thisPage.getPagePath("attachments"), 'ratingstars-' + args + ".txt") 

    src_litstar = '/wiki/modern/img/star_on.png' 
    src_unlitstar = '/wiki/modern/img/star_off.png'

    formname = args + 'form'
    starval = args + 'val'
    result=''

    if thisForm.has_key(starval):
        starnum=int(thisForm[starval][0])
        if not savestar(fname,starnum):
            result += "Error saving file!"
    else:
        starnum=countstar(fname)
 
    result += '<a name="%s">' % args
    result += '<table width="200"><tr><form method="get" name=%(formname)s action="%(url)s#%(anc)s">' % {
        'url': thisUrl, 'anc': args, 'formname':formname}
    result += '<input type="hidden" name=%s value=1>' % starval
    btnstar = '<input type="image" src=%(isrc)s OnClick="document.%(form)s.%(name)s.value=%(value)s">'  
    for i in range(1,6):
        if i <= starnum:
            result += btnstar % {'isrc':src_litstar, 'form':formname, 'name':starval, 'value': i}
        if i> starnum:
            result += btnstar % {'isrc':src_unlitstar, 'form':formname, 'name':starval, 'value': i}
    if starnum == 0:
        result += ' not yet rated'
    result += '</form></tr></table></a>'
    return result
