javascript 
Purpose
Allows inclusion of javascript libraries and scripts as well a shorthand for inline JavascriptExamples
// 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>'
	}