# 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>'
    	}