# -*- coding: utf-8 -*-
"""
    MoinMoin - jQuery macro

    This macro output proper jquery.js javascript include tag.
    
    @copyright: 2008 Jiang Xin <worldhello.net@gmail.com>
    @license: GNU GPL, see COPYING for details.
"""

from MoinMoin import wikiutil
from inspect import isfunction, isclass, ismethod

_aliasname = {
    'demo': 'example',
    'toggle': 'animatedcollapse',
    }

_sysmsg = '<p><strong class="%s">%s</strong></p>'

def externalScript(request, name):
    """ Format external script html """
    src = '%s/common/js/%s.js' % (request.cfg.url_prefix_static, name)
    return '<script type="text/javascript" src="%s"></script>' % src


class jQuery(object):
    def __init__(self, macro, args):
        self.macro = macro
        self.args = args
    
    def renderInPage(self):
        request = self.macro.request
        _ = request.getText
        args = self.args
        result = []
        if not args:
            result.append(externalScript(request, 'jquery'))
        else: # call with argument
            if ',' in args:
                name, args = args.split(',',1)
            else:
                name = args
                args = u''
            name = name.strip().lower()
            aliasname = _aliasname.get(name, name)
            
            has_function = False
            for prefix in ['jquery_', 'fn_', 'class_']:
                for item in [aliasname, name]:
                    try:
                        function = eval(prefix+item)
                    except:
                        continue
                    if isfunction(function) or ismethod(function) or isclass(function):
                        has_function = True
                        break
            if has_function:
                result.append(wikiutil.invoke_extension_function(request, function, args, fixed_args=[request]))
            elif args:
                return (_sysmsg % ('error', _('Invalid jQuery arguments "%s, %s"!')) % (name, args))
            else:
                result.append(externalScript(request, 'jquery'))
                result.append(externalScript(request, 'jquery_'+aliasname))

        result = '\n'.join(result)
        return result
        
def execute(macro, args):
    return jQuery(macro, args).renderInPage()


def jquery_animatedcollapse(request, action="init", id="", _trailing_args=[], _kwargs={}):
    """
    _trailing_args is a list of IDs...
    _kwargs is a dict of key/values...
    
    <<jQuery(toggle)>>, <<jQuery(toggle, init)>> : toggle initialized
        <script ... src='jquery.js'></script>
        <script ... src='jquery_animatedcollapse.js'></script>
        <script ...>animatedcollapse.init();</script>
    
    <<jQuery(toggle, set, #id|.class, fade=1,hide=1,group=demo,persist=1)>> : toggle initialized
        <script ...>animatedcollapse.addDiv('.demo1', 'fade=1,hide=1,group=demo,persist=1'); </script>
    
    <<jQuery(toggle, show, #id|.class, type=radio|button|link, name=name, text=text)>>
        <a href="javascript:animatedcollapse.show('.class3')">Slide Down</a>
    <<jQuery(toggle, hide, #id|.class, type=radio|button|link, name=name, text=text)>>
        <a href="javascript:animatedcollapse.hide('.class3')">Slide Up</a>
    <<jQuery(toggle, toggle, #id|.class, type=radio|button|link, name=name, text=text)>>
        <a href="javascript:animatedcollapse.toggle('.class3')"><img src="http://i25.tinypic.com/wa0img.jpg" border="0" /></a>
    """
    _ = request.getText
    result = []
    if id:
        if _trailing_args:
            id = """['%s',%s]""" % ( id, ','.join(["'%s'" % i for i in _trailing_args]) )
            _trailing_args = []
        else:
            id = "'%s'" % id
    if not action or action == "init":
        result.append(externalScript(request, 'jquery'))
        result.append(externalScript(request, 'jquery_animatedcollapse'))
        result.append("""<script type="text/javascript">animatedcollapse.init();</script>""")
    elif action == "set":
        arguments = ','.join(['%s=%s' % (k,_kwargs[k]) for k in _kwargs])
        result.append("""<script type="text/javascript">animatedcollapse.addDiv(%(id)s, '%(args)s'); </script>"""
                      % { 'id': id, 'args': arguments } )
    # display show, hide, toggle link/button/radio
    else:
        # type: link, button, radio
        if _kwargs.has_key('type'):
            type = _kwargs['type']
        else:
            type = 'link'
        
        # text: text for link, button or radio
        if _kwargs.has_key('text'):
            link_text = _kwargs['text']
        else:
            link_text = u''
        
        # name for radio/button
        if _kwargs.has_key('name'):
            link_name = 'name="%s"' % _kwargs['name']
        else:
            link_name = ""
    
        # 
        if type == 'button':
            output = u"""<span class="toggle"><input type="button" %(name)s value="%(text)s" onclick="javascript:animatedcollapse.%(action)s(%(id)s)"></span>"""
        elif type == 'radio':
            output = u"""<span class="toggle"><input type="radio"  %(name)s value="%(text)s" onclick="javascript:animatedcollapse.%(action)s(%(id)s)">%(text)s</span>"""
        else:
            output = u"""<span class="toggle"><a href="javascript:animatedcollapse.%(action)s(%(id)s)">%(text)s</a></span>"""
        
        if action == "hide":
            link_text = link_text or _('Hide')
            result.append(output % {'action': action, 'name': link_name, 'id':id, 'text':link_text})
        elif action == "show":
            link_text = link_text or _('Hide')
            result.append(output % {'action': action, 'name': link_name, 'id':id, 'text':link_text})
        elif action == "toggle":
            link_text = link_text or _('Hide')
            result.append(output % {'action': action, 'name': link_name, 'id':id, 'text':link_text})
        else:
            return (_sysmsg % ('error', _('Unknown action: %s!') % (action)))
    return u'\n'.join(result)
    
# vim:ts=4:sw=4:et