0001"""
0002Javascript Helpers
0003
0004Provides functionality for working with JavaScript in your views.
0005
0006Ajax, controls and visual effects
0007---------------------------------
0008
0009* For information on using Ajax, see `Prototype Helpers
0010  <module-railshelpers.helpers.prototype.html>`_.
0011* For information on using controls and visual effects, see `Scriptaculous Helpers
0012  <module-railshelpers.helpers.scriptaculous.html>`_.
0013"""
0014# Last synced with Rails copy at Revision 6057 on Feb 8th, 2007.
0015
0016import re
0017from tags import *
0018
0019def link_to_function(name, function, **html_options):
0020    """
0021    Returns a link that'll trigger a JavaScript ``function`` using the 
0022    onclick handler and return false after the fact.
0023    
0024    Example::
0025    
0026        link_to_function("Greeting", "alert('Hello world!')")
0027    """
0028    options = dict(href="#", onclick="%s; return false;" % function)
0029    options.update(html_options)
0030    return content_tag("a", name, **options)
0031
0032def button_to_function(name, function, **html_options):
0033    """
0034    Returns a link that'll trigger a JavaScript ``function`` using the 
0035    onclick handler and return false after the fact.
0036    
0037    Example::
0038    
0039        button_to_function("Greeting", "alert('Hello world!')")
0040    """
0041    options = dict(type_="button", value=name, onclick="%s; " % function)
0042    options.update(html_options)
0043    return content_tag("input", "", **options)
0044
0045def escape_javascript(javascript):
0046    """
0047    Escape carriage returns and single and double quotes for JavaScript segments.
0048    """
0049    javascript = re.sub(r'\\', r'\\\\', (javascript or ''))
0050    javascript = re.sub(r'\r\n|\n|\r', r'\\n', javascript)
0051    javascript = re.sub(r'(["\'])', r'\\\1', javascript)
0052    return javascript
0053
0054def javascript_tag(content, **html_options):
0055    """
0056    Returns a JavaScript tag with the ``content`` inside.
0057    
0058    Example::
0059    
0060        >>> javascript_tag("alert('All is good')")
0061        '<script type="text/javascript">\\n//<![CDATA[\\nalert(\\'All is good\\')\\n//]]>\\n</script>'
0062    """
0063    return content_tag("script", javascript_cdata_section(content), type="text/javascript",
0064                       **html_options)
0065
0066def javascript_cdata_section(content):
0067    return "\n//%s\n" % cdata_section("\n%s\n//" % content)
0068
0069def options_for_javascript(options):
0070    optionlist = []
0071    for key, value in options.iteritems():
0072        if isinstance(value, bool):
0073            value = str(value).lower()
0074        optionlist.append('%s:%s' % (key, value))
0075    optionlist.sort()
0076    return '{' + ', '.join(optionlist) + '}'
0077
0078def array_or_string_for_javascript(option):
0079    jsoption = None
0080    if isinstance(option, list):
0081        jsoption = "['%s']" % '\',\''.join(option)
0082    elif isinstance(option, bool):
0083        jsoption = str(option).lower()
0084    else:
0085        jsoption = "'%s'" % option
0086    return jsoption
0087
0088__all__ = ['link_to_function', 'button_to_function', 'escape_javascript', 'javascript_tag']