# javascript

## Purpose

Allows inclusion of javascript libraries and scripts as well a shorthand for inline Javascript

## Examples

    // actually imports '/app/js/myscript.js'
    <g:javascript src="myscript.js" />// imports all the necessary js for the scriptaculous library
    <g:javascript library="scriptaculous" /><g:javascript>alert('hello')</g:javascript>

## Description

Attributes

- `contextPath` (optional) - the context path to use (relative to the application context path). Defaults to "" or path to the plugin for a plugin view or template.
- `library` (optional) - The name of the library to include. Either "prototype", "scriptaculous", "yahoo" or "dojo"
- `src` (optional) - The name of the javascript file to import. Will look in /app/js dir
- `base` (optional - Since 0.6) - specifies the full base url to prepend to the library name
- `plugin` (optional) - The plugin to look for the javascript in

## Source

Show Source

    def javascript = { attrs, body ->        setUpRequestAttributes()        if (attrs.src) {
                javascriptInclude(attrs)
            }
            else if (attrs.library) {
                if (LIBRARY_MAPPINGS.containsKey(attrs.library)) {
                    LIBRARY_MAPPINGS[attrs.library].each {
                        if (!request[INCLUDED_JS].contains(it)) {
                            request[INCLUDED_JS] << it
                            def newattrs = [:] + attrs
                            newattrs.src = it + '.js'
                            javascriptInclude(newattrs)
                        }
                    }
                    if (!request[INCLUDED_LIBRARIES].contains(attrs.library)) {
                        request[INCLUDED_LIBRARIES] << attrs.library
                    }
                }
                else {
                    if (!request[INCLUDED_LIBRARIES].contains(attrs.library)) {
                        def newattrs = [:] + attrs
                        newattrs.src = newattrs.remove('library') + '.js'
                        javascriptInclude(newattrs)
                        request[INCLUDED_LIBRARIES] << attrs.library
                        request[INCLUDED_JS] << attrs.library
                    }
                }
            }
            else {
                out.println '<script type="text/javascript">'
                out.println body()
                out.println '</script>'
            }
        }    private javascriptInclude(attrs) {
            def requestPluginContext
            if (attrs.plugin) {
                requestPluginContext = pluginManager.getPluginPath(attrs.remove('plugin')) ?: ''
            }
            else {
                if (attrs.contextPath != null) {
                    requestPluginContext = attrs.remove('contextPath').toString()
                }
                else {
                    requestPluginContext = pageScope.pluginContextPath ?: ''
                }
            }        def writer = out
            writer << '<script type="text/javascript" src="'
            if (!attrs.base) {
                def baseUri = grailsAttributes.getApplicationUri(request)
                writer << baseUri << (baseUri.endsWith('/') ? '' : '/')
                if (requestPluginContext) {
                    writer << (requestPluginContext.startsWith("/") ? requestPluginContext.substring(1) : requestPluginContext)
                    writer << "/"
                }
                writer << 'js/'
            }
            else {
                writer << attrs.base
            }        writer << attrs.src
            writer << '"'
            def otherAttrs = [:] + attrs
            otherAttrs.remove('base')
            otherAttrs.remove('src')
            otherAttrs.remove('library')
            otherAttrs.each {k, v -> writer << " $k=\"${v.encodeAsHTML()}\"" }
            writer.println '></script>'
        }