diff --git a/.gitignore b/.gitignore index ae0c7ec..554f9f7 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,6 @@ docs *.log *.zip .DS_Store -grails-rendering-* \ No newline at end of file +.idea +*.iml +grails-rendering-* diff --git a/RenderingGrailsPlugin.groovy b/RenderingGrailsPlugin.groovy index b3c14ba..2ead220 100644 --- a/RenderingGrailsPlugin.groovy +++ b/RenderingGrailsPlugin.groovy @@ -15,7 +15,7 @@ */ class RenderingGrailsPlugin { - def version = "0.4.3" + def version = "0.4.4" def grailsVersion = "1.2.0 > *" def dependsOn = [:] diff --git a/_layouts/main.html b/_layouts/main.html new file mode 100644 index 0000000..22a3973 --- /dev/null +++ b/_layouts/main.html @@ -0,0 +1,57 @@ + + + + + + {{ page.title }} @ GitHub + + + + Fork me on GitHub + +
+

{{ page.title }}

+ + + + + + + + + + + + + + +
Version0.4.3 +
Grails Version1.2.0 > *
AuthorGrails Plugin Collective
+
+

Documentation

+ +
+
{{ content }}
+ + diff --git a/application.properties b/application.properties index 2f76bf3..c47bf06 100644 --- a/application.properties +++ b/application.properties @@ -1,4 +1,4 @@ #Grails Metadata file -#Mon Apr 18 09:21:38 EST 2011 -app.grails.version=1.3.4 +#Wed Jun 08 22:45:16 EST 2011 +app.grails.version=1.3.7 app.name=grails-rendering diff --git a/docs/gapi/DefaultPackage/BackgroundRenderingService.html b/docs/gapi/DefaultPackage/BackgroundRenderingService.html new file mode 100644 index 0000000..7a3e97b --- /dev/null +++ b/docs/gapi/DefaultPackage/BackgroundRenderingService.html @@ -0,0 +1,309 @@ + + + + + + + + + +BackgroundRenderingService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class BackgroundRenderingService

+
java.lang.Object
+  BackgroundRenderingService
+

+
class BackgroundRenderingService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ java.lang.Object + pdfRenderingService +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ BackgroundRenderingService() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ java.lang.Object + + fireEvent(java.lang.Object errorHolder) +
+

+
+ void + + onApplicationEvent(RenderEvent event) +
+

+
+   + + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

pdfRenderingService

+
java.lang.Object pdfRenderingService
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ BackgroundRenderingService

+
BackgroundRenderingService()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ fireEvent

+
java.lang.Object fireEvent(java.lang.Object errorHolder)
+
+
+
+

+

+
+ +

+ onApplicationEvent

+
void onApplicationEvent(RenderEvent event)
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/BackgroundRenderingSpec.html b/docs/gapi/DefaultPackage/BackgroundRenderingSpec.html new file mode 100644 index 0000000..688d0a7 --- /dev/null +++ b/docs/gapi/DefaultPackage/BackgroundRenderingSpec.html @@ -0,0 +1,321 @@ + + + + + + + + + +BackgroundRenderingSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class BackgroundRenderingSpec

+
java.lang.Object
+  spock.lang.Specification
+      grails.plugin.spock.IntegrationSpec
+          BackgroundRenderingSpec
+

+
class BackgroundRenderingSpec
+extends grails.plugin.spock.IntegrationSpec
+
+
+ + + + + + + + + + + + + + + + + + + +
+ Field Summary
+   + + +
+ Fields inherited from class grails.plugin.spock.IntegrationSpec +
$spock_sharedInstance, __timeStamp, __timeStamp__239_neverHappen1292003085656, _
+   + + +
+ Fields inherited from class spock.lang.Specification +
_
+   + + + + + + + + + + + + + + + +
+ Property Summary
+ java.lang.Object + backgroundRenderingService +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ BackgroundRenderingSpec() +
+

+
+   + + + + + + + + + + + + + + + + +
+ Method Summary
+ java.lang.Object + + background render() +
+

+
+   + + + +
+ Methods inherited from class grails.plugin.spock.IntegrationSpec +
grails.plugin.spock.IntegrationSpec#setProperty(java.lang.String, java.lang.Object), grails.plugin.spock.IntegrationSpec#getProperty(java.lang.String), grails.plugin.spock.IntegrationSpec#invokeMethod(java.lang.String, java.lang.Object), grails.plugin.spock.IntegrationSpec#getMetaClass(), grails.plugin.spock.IntegrationSpec#setMetaClass(groovy.lang.MetaClass), grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#old(java.lang.Object), grails.plugin.spock.IntegrationSpec#thrown(java.lang.Class), grails.plugin.spock.IntegrationSpec#thrown(), grails.plugin.spock.IntegrationSpec#notThrown(java.lang.Class), grails.plugin.spock.IntegrationSpec#noExceptionThrown(), grails.plugin.spock.IntegrationSpec#Mock(), grails.plugin.spock.IntegrationSpec#Mock(java.lang.Class), grails.plugin.spock.IntegrationSpec#interaction(groovy.lang.Closure), grails.plugin.spock.IntegrationSpec#wait(), grails.plugin.spock.IntegrationSpec#wait(long), grails.plugin.spock.IntegrationSpec#wait(long, int), grails.plugin.spock.IntegrationSpec#equals(java.lang.Object), grails.plugin.spock.IntegrationSpec#toString(), grails.plugin.spock.IntegrationSpec#hashCode(), grails.plugin.spock.IntegrationSpec#getClass(), grails.plugin.spock.IntegrationSpec#notify(), grails.plugin.spock.IntegrationSpec#notifyAll()
+   + + +
+ Methods inherited from class spock.lang.Specification +
spock.lang.Specification#old(java.lang.Object), spock.lang.Specification#thrown(java.lang.Class), spock.lang.Specification#thrown(), spock.lang.Specification#notThrown(java.lang.Class), spock.lang.Specification#noExceptionThrown(), spock.lang.Specification#Mock(), spock.lang.Specification#Mock(java.lang.Class), spock.lang.Specification#interaction(groovy.lang.Closure), spock.lang.Specification#wait(), spock.lang.Specification#wait(long), spock.lang.Specification#wait(long, int), spock.lang.Specification#equals(java.lang.Object), spock.lang.Specification#toString(), spock.lang.Specification#hashCode(), spock.lang.Specification#getClass(), spock.lang.Specification#notify(), spock.lang.Specification#notifyAll()
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

backgroundRenderingService

+
java.lang.Object backgroundRenderingService
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ BackgroundRenderingSpec

+
BackgroundRenderingSpec()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ background render

+
java.lang.Object background render()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/ControllerRelativeTemplateSpec.html b/docs/gapi/DefaultPackage/ControllerRelativeTemplateSpec.html new file mode 100644 index 0000000..9122e70 --- /dev/null +++ b/docs/gapi/DefaultPackage/ControllerRelativeTemplateSpec.html @@ -0,0 +1,247 @@ + + + + + + + + + +ControllerRelativeTemplateSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class ControllerRelativeTemplateSpec

+
java.lang.Object
+  FunctionalSpec
+      ControllerRelativeTemplateSpec
+

+
class ControllerRelativeTemplateSpec
+extends FunctionalSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ ControllerRelativeTemplateSpec() +
+

+
+   + + + + + + + + + + + + + + + + +
+ Method Summary
+ java.lang.Object + + accessingControllerRelativeTemplateWorks() +
+

+
+   + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ ControllerRelativeTemplateSpec

+
ControllerRelativeTemplateSpec()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ accessingControllerRelativeTemplateWorks

+
java.lang.Object accessingControllerRelativeTemplateWorks()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/DataUri.html b/docs/gapi/DefaultPackage/DataUri.html new file mode 100644 index 0000000..514c7c5 --- /dev/null +++ b/docs/gapi/DefaultPackage/DataUri.html @@ -0,0 +1,433 @@ + + + + + + + + + +DataUri (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering.datauri +
+ +[Groovy] Class DataUri

+
java.lang.Object
+  DataUri
+

+
class DataUri
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field Summary
+ private boolean + base64 +
+

+
+ private java.lang.String + charset +
+

+
+ private java.lang.String + data +
+

+
+ private java.lang.String + mimeType +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ DataUri(java.lang.String uri) +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected void + + determineParts(java.lang.String value) +
+

+
+ byte[] + + getBytes() +
+

+
+ java.io.InputStream + + getInputStream() +
+

+
+ static boolean + + isDataUri(java.lang.String uri) +
+

+
+ protected void + + processMetadata(String[] metadataPieces) +
+

+
+   + + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + +
+ Field Detail
+ +

base64

+
private boolean base64
+
+
+
+

+

+
+ +

charset

+
private java.lang.String charset
+
+
+
+

+

+
+ +

data

+
private java.lang.String data
+
+
+
+

+

+
+ +

mimeType

+
private java.lang.String mimeType
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ DataUri

+
DataUri(java.lang.String uri)
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ determineParts

+
protected void determineParts(java.lang.String value)
+
+
+
+

+

+
+ +

+ getBytes

+
byte[] getBytes()
+
+
+
+

+

+
+ +

+ getInputStream

+
java.io.InputStream getInputStream()
+
+
+
+

+

+
+ +

+ isDataUri

+
static boolean isDataUri(java.lang.String uri)
+
+
+
+

+

+
+ +

+ processMetadata

+
protected void processMetadata(String[] metadataPieces)
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/DataUriAwareITextUserAgent.html b/docs/gapi/DefaultPackage/DataUriAwareITextUserAgent.html new file mode 100644 index 0000000..d60c245 --- /dev/null +++ b/docs/gapi/DefaultPackage/DataUriAwareITextUserAgent.html @@ -0,0 +1,307 @@ + + + + + + + + + +DataUriAwareITextUserAgent (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering.datauri +
+ +[Groovy] Class DataUriAwareITextUserAgent

+
java.lang.Object
+  org.xhtmlrenderer.swing.NaiveUserAgent
+      org.xhtmlrenderer.pdf.ITextUserAgent
+          DataUriAwareITextUserAgent
+

+
class DataUriAwareITextUserAgent
+extends org.xhtmlrenderer.pdf.ITextUserAgent
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field Summary
+ private static java.lang.Object + log +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ DataUriAwareITextUserAgent(org.xhtmlrenderer.pdf.ITextOutputDevice outputDevice) +
+

+
+   + + + + + + + + + + + + + + + + +
+ Method Summary
+ org.xhtmlrenderer.resource.ImageResource + + getImageResource(java.lang.String uri) +
+

+
+   + + + +
+ Methods inherited from class org.xhtmlrenderer.pdf.ITextUserAgent +
org.xhtmlrenderer.pdf.ITextUserAgent#getSharedContext(), org.xhtmlrenderer.pdf.ITextUserAgent#setSharedContext(org.xhtmlrenderer.layout.SharedContext), org.xhtmlrenderer.pdf.ITextUserAgent#getImageResource(java.lang.String), org.xhtmlrenderer.pdf.ITextUserAgent#getBaseURL(), org.xhtmlrenderer.pdf.ITextUserAgent#resolveURI(java.lang.String), org.xhtmlrenderer.pdf.ITextUserAgent#shrinkImageCache(), org.xhtmlrenderer.pdf.ITextUserAgent#clearImageCache(), org.xhtmlrenderer.pdf.ITextUserAgent#getCSSResource(java.lang.String), org.xhtmlrenderer.pdf.ITextUserAgent#getXMLResource(java.lang.String), org.xhtmlrenderer.pdf.ITextUserAgent#getBinaryResource(java.lang.String), org.xhtmlrenderer.pdf.ITextUserAgent#isVisited(java.lang.String), org.xhtmlrenderer.pdf.ITextUserAgent#setBaseURL(java.lang.String), org.xhtmlrenderer.pdf.ITextUserAgent#documentStarted(), org.xhtmlrenderer.pdf.ITextUserAgent#documentLoaded(), org.xhtmlrenderer.pdf.ITextUserAgent#onLayoutException(java.lang.Throwable), org.xhtmlrenderer.pdf.ITextUserAgent#onRenderException(java.lang.Throwable), org.xhtmlrenderer.pdf.ITextUserAgent#wait(), org.xhtmlrenderer.pdf.ITextUserAgent#wait(long), org.xhtmlrenderer.pdf.ITextUserAgent#wait(long, int), org.xhtmlrenderer.pdf.ITextUserAgent#equals(java.lang.Object), org.xhtmlrenderer.pdf.ITextUserAgent#toString(), org.xhtmlrenderer.pdf.ITextUserAgent#hashCode(), org.xhtmlrenderer.pdf.ITextUserAgent#getClass(), org.xhtmlrenderer.pdf.ITextUserAgent#notify(), org.xhtmlrenderer.pdf.ITextUserAgent#notifyAll()
+   + + +
+ Methods inherited from class org.xhtmlrenderer.swing.NaiveUserAgent +
org.xhtmlrenderer.swing.NaiveUserAgent#getBaseURL(), org.xhtmlrenderer.swing.NaiveUserAgent#getImageResource(java.lang.String), org.xhtmlrenderer.swing.NaiveUserAgent#resolveURI(java.lang.String), org.xhtmlrenderer.swing.NaiveUserAgent#shrinkImageCache(), org.xhtmlrenderer.swing.NaiveUserAgent#clearImageCache(), org.xhtmlrenderer.swing.NaiveUserAgent#getCSSResource(java.lang.String), org.xhtmlrenderer.swing.NaiveUserAgent#getXMLResource(java.lang.String), org.xhtmlrenderer.swing.NaiveUserAgent#getBinaryResource(java.lang.String), org.xhtmlrenderer.swing.NaiveUserAgent#isVisited(java.lang.String), org.xhtmlrenderer.swing.NaiveUserAgent#setBaseURL(java.lang.String), org.xhtmlrenderer.swing.NaiveUserAgent#documentStarted(), org.xhtmlrenderer.swing.NaiveUserAgent#documentLoaded(), org.xhtmlrenderer.swing.NaiveUserAgent#onLayoutException(java.lang.Throwable), org.xhtmlrenderer.swing.NaiveUserAgent#onRenderException(java.lang.Throwable), org.xhtmlrenderer.swing.NaiveUserAgent#wait(), org.xhtmlrenderer.swing.NaiveUserAgent#wait(long), org.xhtmlrenderer.swing.NaiveUserAgent#wait(long, int), org.xhtmlrenderer.swing.NaiveUserAgent#equals(java.lang.Object), org.xhtmlrenderer.swing.NaiveUserAgent#toString(), org.xhtmlrenderer.swing.NaiveUserAgent#hashCode(), org.xhtmlrenderer.swing.NaiveUserAgent#getClass(), org.xhtmlrenderer.swing.NaiveUserAgent#notify(), org.xhtmlrenderer.swing.NaiveUserAgent#notifyAll()
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + +
+ Field Detail
+ +

log

+
private static java.lang.Object log
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ DataUriAwareITextUserAgent

+
DataUriAwareITextUserAgent(org.xhtmlrenderer.pdf.ITextOutputDevice outputDevice)
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ getImageResource

+
org.xhtmlrenderer.resource.ImageResource getImageResource(java.lang.String uri)
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/DataUriAwareNaiveUserAgent.html b/docs/gapi/DefaultPackage/DataUriAwareNaiveUserAgent.html new file mode 100644 index 0000000..66c0fda --- /dev/null +++ b/docs/gapi/DefaultPackage/DataUriAwareNaiveUserAgent.html @@ -0,0 +1,321 @@ + + + + + + + + + +DataUriAwareNaiveUserAgent (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering.datauri +
+ +[Groovy] Class DataUriAwareNaiveUserAgent

+
java.lang.Object
+  org.xhtmlrenderer.swing.NaiveUserAgent
+      DataUriAwareNaiveUserAgent
+

+
class DataUriAwareNaiveUserAgent
+extends org.xhtmlrenderer.swing.NaiveUserAgent
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field Summary
+ private static java.lang.Object + log +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ DataUriAwareNaiveUserAgent() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected java.io.InputStream + + resolveAndOpenStream(java.lang.String uri) +
+

+
+ java.lang.String + + resolveURI(java.lang.String uri) +
+

+
+   + + + +
+ Methods inherited from class org.xhtmlrenderer.swing.NaiveUserAgent +
org.xhtmlrenderer.swing.NaiveUserAgent#getBaseURL(), org.xhtmlrenderer.swing.NaiveUserAgent#getImageResource(java.lang.String), org.xhtmlrenderer.swing.NaiveUserAgent#resolveURI(java.lang.String), org.xhtmlrenderer.swing.NaiveUserAgent#shrinkImageCache(), org.xhtmlrenderer.swing.NaiveUserAgent#clearImageCache(), org.xhtmlrenderer.swing.NaiveUserAgent#getCSSResource(java.lang.String), org.xhtmlrenderer.swing.NaiveUserAgent#getXMLResource(java.lang.String), org.xhtmlrenderer.swing.NaiveUserAgent#getBinaryResource(java.lang.String), org.xhtmlrenderer.swing.NaiveUserAgent#isVisited(java.lang.String), org.xhtmlrenderer.swing.NaiveUserAgent#setBaseURL(java.lang.String), org.xhtmlrenderer.swing.NaiveUserAgent#documentStarted(), org.xhtmlrenderer.swing.NaiveUserAgent#documentLoaded(), org.xhtmlrenderer.swing.NaiveUserAgent#onLayoutException(java.lang.Throwable), org.xhtmlrenderer.swing.NaiveUserAgent#onRenderException(java.lang.Throwable), org.xhtmlrenderer.swing.NaiveUserAgent#wait(), org.xhtmlrenderer.swing.NaiveUserAgent#wait(long), org.xhtmlrenderer.swing.NaiveUserAgent#wait(long, int), org.xhtmlrenderer.swing.NaiveUserAgent#equals(java.lang.Object), org.xhtmlrenderer.swing.NaiveUserAgent#toString(), org.xhtmlrenderer.swing.NaiveUserAgent#hashCode(), org.xhtmlrenderer.swing.NaiveUserAgent#getClass(), org.xhtmlrenderer.swing.NaiveUserAgent#notify(), org.xhtmlrenderer.swing.NaiveUserAgent#notifyAll()
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + +
+ Field Detail
+ +

log

+
private static java.lang.Object log
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ DataUriAwareNaiveUserAgent

+
DataUriAwareNaiveUserAgent()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ resolveAndOpenStream

+
protected java.io.InputStream resolveAndOpenStream(java.lang.String uri)
+
+
+
+

+

+
+ +

+ resolveURI

+
java.lang.String resolveURI(java.lang.String uri)
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/DataUriSpec.html b/docs/gapi/DefaultPackage/DataUriSpec.html new file mode 100644 index 0000000..97f7b87 --- /dev/null +++ b/docs/gapi/DefaultPackage/DataUriSpec.html @@ -0,0 +1,330 @@ + + + + + + + + + +DataUriSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering.datauri +
+ +[Groovy] Class DataUriSpec

+
java.lang.Object
+  spock.lang.Specification
+      grails.plugin.spock.UnitSpec
+          DataUriSpec
+

+
class DataUriSpec
+extends grails.plugin.spock.UnitSpec
+
+
+ + + + + + + + + + + + + + + + + + + +
+ Field Summary
+   + + +
+ Fields inherited from class grails.plugin.spock.UnitSpec +
$spock_sharedInstance, __timeStamp, __timeStamp__239_neverHappen1292003085682, _
+   + + +
+ Fields inherited from class spock.lang.Specification +
_
+   + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ DataUriSpec() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ java.lang.Object + + encoding ascii octets round trip() +
+

+
+ java.lang.Object + + encoding base64 round trip() +
+

+
+ protected java.lang.Object + + getRedDotBytes() +
+

+
+   + + + +
+ Methods inherited from class grails.plugin.spock.UnitSpec +
grails.plugin.spock.UnitSpec#setProperty(java.lang.String, java.lang.Object), grails.plugin.spock.UnitSpec#getProperty(java.lang.String), grails.plugin.spock.UnitSpec#invokeMethod(java.lang.String, java.lang.Object), grails.plugin.spock.UnitSpec#getMetaClass(), grails.plugin.spock.UnitSpec#setMetaClass(groovy.lang.MetaClass), grails.plugin.spock.UnitSpec#super, grails.plugin.spock.UnitSpec#super, grails.plugin.spock.UnitSpec#super, grails.plugin.spock.UnitSpec#super, grails.plugin.spock.UnitSpec#super, grails.plugin.spock.UnitSpec#super, grails.plugin.spock.UnitSpec#super, grails.plugin.spock.UnitSpec#super, grails.plugin.spock.UnitSpec#super, grails.plugin.spock.UnitSpec#super, grails.plugin.spock.UnitSpec#super, grails.plugin.spock.UnitSpec#this, grails.plugin.spock.UnitSpec#this, grails.plugin.spock.UnitSpec#this, grails.plugin.spock.UnitSpec#getDomainClassesInfo(), grails.plugin.spock.UnitSpec#setDomainClassesInfo(org.codehaus.groovy.grails.commons.DefaultArtefactInfo), grails.plugin.spock.UnitSpec#this, grails.plugin.spock.UnitSpec#this, grails.plugin.spock.UnitSpec#this, grails.plugin.spock.UnitSpec#this, grails.plugin.spock.UnitSpec#super, grails.plugin.spock.UnitSpec#super, grails.plugin.spock.UnitSpec#super, grails.plugin.spock.UnitSpec#super, grails.plugin.spock.UnitSpec#super, grails.plugin.spock.UnitSpec#super, grails.plugin.spock.UnitSpec#super, grails.plugin.spock.UnitSpec#super, grails.plugin.spock.UnitSpec#old(java.lang.Object), grails.plugin.spock.UnitSpec#thrown(java.lang.Class), grails.plugin.spock.UnitSpec#thrown(), grails.plugin.spock.UnitSpec#notThrown(java.lang.Class), grails.plugin.spock.UnitSpec#noExceptionThrown(), grails.plugin.spock.UnitSpec#Mock(), grails.plugin.spock.UnitSpec#Mock(java.lang.Class), grails.plugin.spock.UnitSpec#interaction(groovy.lang.Closure), grails.plugin.spock.UnitSpec#wait(), grails.plugin.spock.UnitSpec#wait(long), grails.plugin.spock.UnitSpec#wait(long, int), grails.plugin.spock.UnitSpec#equals(java.lang.Object), grails.plugin.spock.UnitSpec#toString(), grails.plugin.spock.UnitSpec#hashCode(), grails.plugin.spock.UnitSpec#getClass(), grails.plugin.spock.UnitSpec#notify(), grails.plugin.spock.UnitSpec#notifyAll()
+   + + +
+ Methods inherited from class spock.lang.Specification +
spock.lang.Specification#old(java.lang.Object), spock.lang.Specification#thrown(java.lang.Class), spock.lang.Specification#thrown(), spock.lang.Specification#notThrown(java.lang.Class), spock.lang.Specification#noExceptionThrown(), spock.lang.Specification#Mock(), spock.lang.Specification#Mock(java.lang.Class), spock.lang.Specification#interaction(groovy.lang.Closure), spock.lang.Specification#wait(), spock.lang.Specification#wait(long), spock.lang.Specification#wait(long, int), spock.lang.Specification#equals(java.lang.Object), spock.lang.Specification#toString(), spock.lang.Specification#hashCode(), spock.lang.Specification#getClass(), spock.lang.Specification#notify(), spock.lang.Specification#notifyAll()
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ DataUriSpec

+
DataUriSpec()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ encoding ascii octets round trip

+
java.lang.Object encoding ascii octets round trip()
+
+
+
+

+

+
+ +

+ encoding base64 round trip

+
java.lang.Object encoding base64 round trip()
+
+
+
+

+

+
+ +

+ getRedDotBytes

+
protected java.lang.Object getRedDotBytes()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/GifRenderingService.html b/docs/gapi/DefaultPackage/GifRenderingService.html new file mode 100644 index 0000000..ace7fb8 --- /dev/null +++ b/docs/gapi/DefaultPackage/GifRenderingService.html @@ -0,0 +1,268 @@ + + + + + + + + + +GifRenderingService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class GifRenderingService

+
java.lang.Object
+  grails.plugin.rendering.image.ImageRenderingService
+      GifRenderingService
+

+
class GifRenderingService
+extends ImageRenderingService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ GifRenderingService() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected java.lang.Object + + getDefaultContentType() +
+

+
+ protected java.lang.Object + + getImageType() +
+

+
+   + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ GifRenderingService

+
GifRenderingService()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ getDefaultContentType

+
protected java.lang.Object getDefaultContentType()
+
+
+
+

+

+
+ +

+ getImageType

+
protected java.lang.Object getImageType()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/GifRenderingServiceSpec.html b/docs/gapi/DefaultPackage/GifRenderingServiceSpec.html new file mode 100644 index 0000000..0623707 --- /dev/null +++ b/docs/gapi/DefaultPackage/GifRenderingServiceSpec.html @@ -0,0 +1,288 @@ + + + + + + + + + +GifRenderingServiceSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering.image +
+ +[Groovy] Class GifRenderingServiceSpec

+
java.lang.Object
+  grails.plugin.rendering.image.ImageRenderingServiceSpec
+      GifRenderingServiceSpec
+

+
class GifRenderingServiceSpec
+extends ImageRenderingServiceSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ java.lang.Object + gifRenderingService +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ GifRenderingServiceSpec() +
+

+
+   + + + + + + + + + + + + + + + + +
+ Method Summary
+ java.lang.Object + + getRenderer() +
+

+
+   + + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

gifRenderingService

+
java.lang.Object gifRenderingService
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ GifRenderingServiceSpec

+
GifRenderingServiceSpec()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ getRenderer

+
java.lang.Object getRenderer()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/GrailsRenderingException.html b/docs/gapi/DefaultPackage/GrailsRenderingException.html new file mode 100644 index 0000000..8cd6eca --- /dev/null +++ b/docs/gapi/DefaultPackage/GrailsRenderingException.html @@ -0,0 +1,244 @@ + + + + + + + + + +GrailsRenderingException (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering +
+ +[Groovy] Class GrailsRenderingException

+
java.lang.Object
+  java.lang.Throwable
+      java.lang.Exception
+          java.lang.RuntimeException
+              GrailsRenderingException
+

+
class GrailsRenderingException
+extends java.lang.RuntimeException
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ GrailsRenderingException(java.lang.CharSequence message, java.lang.Throwable cause = null) +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.RuntimeException +
java.lang.RuntimeException#printStackTrace(java.io.PrintStream), java.lang.RuntimeException#printStackTrace(), java.lang.RuntimeException#printStackTrace(java.io.PrintWriter), java.lang.RuntimeException#fillInStackTrace(), java.lang.RuntimeException#getCause(), java.lang.RuntimeException#initCause(java.lang.Throwable), java.lang.RuntimeException#toString(), java.lang.RuntimeException#getMessage(), java.lang.RuntimeException#getLocalizedMessage(), java.lang.RuntimeException#getStackTrace(), java.lang.RuntimeException#setStackTrace([Ljava.lang.StackTraceElement;), java.lang.RuntimeException#wait(), java.lang.RuntimeException#wait(long), java.lang.RuntimeException#wait(long, int), java.lang.RuntimeException#equals(java.lang.Object), java.lang.RuntimeException#hashCode(), java.lang.RuntimeException#getClass(), java.lang.RuntimeException#notify(), java.lang.RuntimeException#notifyAll()
+   + + +
+ Methods inherited from class java.lang.Exception +
java.lang.Exception#printStackTrace(java.io.PrintStream), java.lang.Exception#printStackTrace(), java.lang.Exception#printStackTrace(java.io.PrintWriter), java.lang.Exception#fillInStackTrace(), java.lang.Exception#getCause(), java.lang.Exception#initCause(java.lang.Throwable), java.lang.Exception#toString(), java.lang.Exception#getMessage(), java.lang.Exception#getLocalizedMessage(), java.lang.Exception#getStackTrace(), java.lang.Exception#setStackTrace([Ljava.lang.StackTraceElement;), java.lang.Exception#wait(), java.lang.Exception#wait(long), java.lang.Exception#wait(long, int), java.lang.Exception#equals(java.lang.Object), java.lang.Exception#hashCode(), java.lang.Exception#getClass(), java.lang.Exception#notify(), java.lang.Exception#notifyAll()
+   + + +
+ Methods inherited from class java.lang.Throwable +
java.lang.Throwable#printStackTrace(java.io.PrintStream), java.lang.Throwable#printStackTrace(), java.lang.Throwable#printStackTrace(java.io.PrintWriter), java.lang.Throwable#fillInStackTrace(), java.lang.Throwable#getCause(), java.lang.Throwable#initCause(java.lang.Throwable), java.lang.Throwable#toString(), java.lang.Throwable#getMessage(), java.lang.Throwable#getLocalizedMessage(), java.lang.Throwable#getStackTrace(), java.lang.Throwable#setStackTrace([Ljava.lang.StackTraceElement;), java.lang.Throwable#wait(), java.lang.Throwable#wait(long), java.lang.Throwable#wait(long, int), java.lang.Throwable#equals(java.lang.Object), java.lang.Throwable#hashCode(), java.lang.Throwable#getClass(), java.lang.Throwable#notify(), java.lang.Throwable#notifyAll()
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ GrailsRenderingException

+
GrailsRenderingException(java.lang.CharSequence message, java.lang.Throwable cause = null)
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/ImageRenderingService.html b/docs/gapi/DefaultPackage/ImageRenderingService.html new file mode 100644 index 0000000..2e1cd94 --- /dev/null +++ b/docs/gapi/DefaultPackage/ImageRenderingService.html @@ -0,0 +1,513 @@ + + + + + + + + + +ImageRenderingService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class ImageRenderingService

+
java.lang.Object
+  grails.plugin.rendering.RenderingService
+      ImageRenderingService
+

+
abstract class ImageRenderingService
+extends RenderingService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ static java.lang.Object + DEFAULT_BUFFERED_IMAGE_TYPE +
+

+
+ static java.lang.Object + transactional +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ ImageRenderingService() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected java.lang.Object + + configureRenderer(org.xhtmlrenderer.simple.Graphics2DRenderer renderer) +
+

+
+ protected java.lang.Object + + convert(java.util.Map args, java.awt.image.BufferedImage image, java.io.OutputStream outputStream) +
+

+
+ protected java.awt.image.BufferedImage + + createBufferedImage(java.util.Map args, org.w3c.dom.Document document) +
+

+
+ protected java.lang.Object + + doRender(java.util.Map args, org.w3c.dom.Document document, java.io.OutputStream outputStream) +
+

+
+ protected java.lang.Object + + doScaleTransform(java.lang.Object image, java.lang.Object width, java.lang.Object height, java.lang.Object widthScale, java.lang.Object heightScale, java.lang.Object bufferedImageType) +
+

+
+ protected java.lang.Object + + getDefaultBufferedImageType() +
+

+
+ protected java.lang.Object + + getImageType() +
+

+
+ protected java.lang.Object + + resize(java.lang.Object image, java.util.Map resizeArgs, java.lang.Object bufferedImageType) +
+

+
+ protected java.lang.Object + + resize(java.lang.Object image, java.lang.Object width, java.lang.Object height, java.lang.Object bufferedImageType) +
+

+
+ protected java.lang.Object + + scale(java.lang.Object image, java.util.Map scaleArgs, java.lang.Object bufferedImageType) +
+

+
+ protected java.lang.Object + + scale(java.lang.Object image, java.lang.Object widthScale, java.lang.Object heightScale, java.lang.Object bufferedImageType) +
+

+
+   + + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

DEFAULT_BUFFERED_IMAGE_TYPE

+
static java.lang.Object DEFAULT_BUFFERED_IMAGE_TYPE
+
+
+
+

+

+
+ +

transactional

+
static java.lang.Object transactional
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ ImageRenderingService

+
ImageRenderingService()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ configureRenderer

+
protected java.lang.Object configureRenderer(org.xhtmlrenderer.simple.Graphics2DRenderer renderer)
+
+
+
+

+

+
+ +

+ convert

+
protected java.lang.Object convert(java.util.Map args, java.awt.image.BufferedImage image, java.io.OutputStream outputStream)
+
+
+
+

+

+
+ +

+ createBufferedImage

+
protected java.awt.image.BufferedImage createBufferedImage(java.util.Map args, org.w3c.dom.Document document)
+
+
+
+

+

+
+ +

+ doRender

+
protected java.lang.Object doRender(java.util.Map args, org.w3c.dom.Document document, java.io.OutputStream outputStream)
+
+
+
+

+

+
+ +

+ doScaleTransform

+
protected java.lang.Object doScaleTransform(java.lang.Object image, java.lang.Object width, java.lang.Object height, java.lang.Object widthScale, java.lang.Object heightScale, java.lang.Object bufferedImageType)
+
+
+
+

+

+
+ +

+ getDefaultBufferedImageType

+
protected java.lang.Object getDefaultBufferedImageType()
+
+
+
+

+

+
+ +

+ getImageType

+
protected java.lang.Object getImageType()
+
+
+
+

+

+
+ +

+ resize

+
protected java.lang.Object resize(java.lang.Object image, java.util.Map resizeArgs, java.lang.Object bufferedImageType)
+
+
+
+

+

+
+ +

+ resize

+
protected java.lang.Object resize(java.lang.Object image, java.lang.Object width, java.lang.Object height, java.lang.Object bufferedImageType)
+
+
+
+

+

+
+ +

+ scale

+
protected java.lang.Object scale(java.lang.Object image, java.util.Map scaleArgs, java.lang.Object bufferedImageType)
+
+
+
+

+

+
+ +

+ scale

+
protected java.lang.Object scale(java.lang.Object image, java.lang.Object widthScale, java.lang.Object heightScale, java.lang.Object bufferedImageType)
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/ImageRenderingServiceSpec.html b/docs/gapi/DefaultPackage/ImageRenderingServiceSpec.html new file mode 100644 index 0000000..72bcb21 --- /dev/null +++ b/docs/gapi/DefaultPackage/ImageRenderingServiceSpec.html @@ -0,0 +1,356 @@ + + + + + + + + + +ImageRenderingServiceSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering.image +
+ +[Groovy] Class ImageRenderingServiceSpec

+
java.lang.Object
+  grails.plugin.rendering.RenderingServiceSpec
+      ImageRenderingServiceSpec
+

+
abstract class ImageRenderingServiceSpec
+extends RenderingServiceSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ ImageRenderingServiceSpec() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected java.lang.Object + + image(java.util.Map args) +
+

+
+ java.lang.Object + + imageResize() +
+

+
+ java.lang.Object + + imageScale() +
+

+
+ java.lang.Object + + renderImageWithAutoHeight() +
+

+
+ java.lang.Object + + renderImageWithHeight() +
+

+
+ protected java.lang.Object + + toBufferedImage(java.lang.Object baos) +
+

+
+   + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ ImageRenderingServiceSpec

+
ImageRenderingServiceSpec()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ image

+
protected java.lang.Object image(java.util.Map args)
+
+
+
+

+

+
+ +

+ imageResize

+
java.lang.Object imageResize()
+
+
+
+

+

+
+ +

+ imageScale

+
java.lang.Object imageScale()
+
+
+
+

+

+
+ +

+ renderImageWithAutoHeight

+
java.lang.Object renderImageWithAutoHeight()
+
+
+
+

+

+
+ +

+ renderImageWithHeight

+
java.lang.Object renderImageWithHeight()
+
+
+
+

+

+
+ +

+ toBufferedImage

+
protected java.lang.Object toBufferedImage(java.lang.Object baos)
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/JpegRenderingService.html b/docs/gapi/DefaultPackage/JpegRenderingService.html new file mode 100644 index 0000000..807fc4f --- /dev/null +++ b/docs/gapi/DefaultPackage/JpegRenderingService.html @@ -0,0 +1,289 @@ + + + + + + + + + +JpegRenderingService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class JpegRenderingService

+
java.lang.Object
+  grails.plugin.rendering.image.ImageRenderingService
+      JpegRenderingService
+

+
class JpegRenderingService
+extends ImageRenderingService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ JpegRenderingService() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected java.lang.Object + + getDefaultBufferedImageType() +
+

+
+ protected java.lang.Object + + getDefaultContentType() +
+

+
+ protected java.lang.Object + + getImageType() +
+

+
+   + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ JpegRenderingService

+
JpegRenderingService()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ getDefaultBufferedImageType

+
protected java.lang.Object getDefaultBufferedImageType()
+
+
+
+

+

+
+ +

+ getDefaultContentType

+
protected java.lang.Object getDefaultContentType()
+
+
+
+

+

+
+ +

+ getImageType

+
protected java.lang.Object getImageType()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/JpegRenderingServiceSpec.html b/docs/gapi/DefaultPackage/JpegRenderingServiceSpec.html new file mode 100644 index 0000000..d0eb186 --- /dev/null +++ b/docs/gapi/DefaultPackage/JpegRenderingServiceSpec.html @@ -0,0 +1,288 @@ + + + + + + + + + +JpegRenderingServiceSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering.image +
+ +[Groovy] Class JpegRenderingServiceSpec

+
java.lang.Object
+  grails.plugin.rendering.image.ImageRenderingServiceSpec
+      JpegRenderingServiceSpec
+

+
class JpegRenderingServiceSpec
+extends ImageRenderingServiceSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ java.lang.Object + jpegRenderingService +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ JpegRenderingServiceSpec() +
+

+
+   + + + + + + + + + + + + + + + + +
+ Method Summary
+ java.lang.Object + + getRenderer() +
+

+
+   + + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

jpegRenderingService

+
java.lang.Object jpegRenderingService
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ JpegRenderingServiceSpec

+
JpegRenderingServiceSpec()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ getRenderer

+
java.lang.Object getRenderer()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/PdfGrailsPlugin.html b/docs/gapi/DefaultPackage/PdfGrailsPlugin.html new file mode 100644 index 0000000..436eb3b --- /dev/null +++ b/docs/gapi/DefaultPackage/PdfGrailsPlugin.html @@ -0,0 +1,520 @@ + + + + + + + + + +PdfGrailsPlugin (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +DefaultPackage +
+Class PdfGrailsPlugin

+
java.lang.Object
+  DefaultPackage.PdfGrailsPlugin
+

+
class PdfGrailsPlugin
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ def + author +
+

+
+ def + authorEmail +
+

+
+ def + dependsOn +
+

+
+ def + description +
+

+
+ def + doWithDynamicMethods +
+

+
+ def + documentation +
+

+
+ def + grailsVersion +
+

+
+ def + loadAfter +
+

+
+ def + observe +
+

/*", + "grails-app/controllers/*

+
+ def + onChange +
+

+
+ def + pluginExcludes +
+

+
+ def + title +
+

+
+ def + version +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ PdfGrailsPlugin() +
+

+
+   + + + + + + + + + + + + + + + + +
+ Method Summary
+ def + + addRenderPdf(def pdfRenderingService, def clazz) +
+

+
+   + + + +
+ Methods inherited from class java.lang.Object +
wait, wait, wait, hashCode, getClass, equals, toString, notify, notifyAll
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

author

+
def author
+
+
+
+

+

+
+ +

authorEmail

+
def authorEmail
+
+
+
+

+

+
+ +

dependsOn

+
def dependsOn
+
+
+
+

+

+
+ +

description

+
def description
+
+
+
+

+

+
+ +

doWithDynamicMethods

+
def doWithDynamicMethods
+
+
+
+

+

+
+ +

documentation

+
def documentation
+
+
+
+

+

+
+ +

grailsVersion

+
def grailsVersion
+
+
+
+

+

+
+ +

loadAfter

+
def loadAfter
+
+
+
+

+

+
+ +

observe

+
def observe
+
+
/*", + "grails-app/controllers/* +
+

+

+
+ +

onChange

+
def onChange
+
+
+
+

+

+
+ +

pluginExcludes

+
def pluginExcludes
+
+
+
+

+

+
+ +

title

+
def title
+
+
+
+

+

+
+ +

version

+
def version
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ PdfGrailsPlugin

+
PdfGrailsPlugin()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ addRenderPdf

+
public def addRenderPdf(def pdfRenderingService, def clazz)
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/PdfPluginTestGrailsPlugin.html b/docs/gapi/DefaultPackage/PdfPluginTestGrailsPlugin.html new file mode 100644 index 0000000..25b7793 --- /dev/null +++ b/docs/gapi/DefaultPackage/PdfPluginTestGrailsPlugin.html @@ -0,0 +1,521 @@ + + + + + + + + + +PdfPluginTestGrailsPlugin (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class PdfPluginTestGrailsPlugin

+
java.lang.Object
+  PdfPluginTestGrailsPlugin
+

+
class PdfPluginTestGrailsPlugin
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ java.lang.Object + author +
+

+
+ java.lang.Object + authorEmail +
+

+
+ java.lang.Object + dependsOn +
+

+
+ java.lang.Object + description +
+

+
+ java.lang.Object + doWithApplicationContext +
+

+
+ java.lang.Object + doWithDynamicMethods +
+

+
+ java.lang.Object + doWithSpring +
+

+
+ java.lang.Object + doWithWebDescriptor +
+

+
+ java.lang.Object + documentation +
+

+
+ java.lang.Object + grailsVersion +
+

+
+ java.lang.Object + onChange +
+

+
+ java.lang.Object + onConfigChange +
+

+
+ java.lang.Object + pluginExcludes +
+

+
+ java.lang.Object + title +
+

+
+ java.lang.Object + version +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ PdfPluginTestGrailsPlugin() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

author

+
java.lang.Object author
+
+
+
+

+

+
+ +

authorEmail

+
java.lang.Object authorEmail
+
+
+
+

+

+
+ +

dependsOn

+
java.lang.Object dependsOn
+
+
+
+

+

+
+ +

description

+
java.lang.Object description
+
+
+
+

+

+
+ +

doWithApplicationContext

+
java.lang.Object doWithApplicationContext
+
+
+
+

+

+
+ +

doWithDynamicMethods

+
java.lang.Object doWithDynamicMethods
+
+
+
+

+

+
+ +

doWithSpring

+
java.lang.Object doWithSpring
+
+
+
+

+

+
+ +

doWithWebDescriptor

+
java.lang.Object doWithWebDescriptor
+
+
+
+

+

+
+ +

documentation

+
java.lang.Object documentation
+
+
+
+

+

+
+ +

grailsVersion

+
java.lang.Object grailsVersion
+
+
+
+

+

+
+ +

onChange

+
java.lang.Object onChange
+
+
+
+

+

+
+ +

onConfigChange

+
java.lang.Object onConfigChange
+
+
+
+

+

+
+ +

pluginExcludes

+
java.lang.Object pluginExcludes
+
+
+
+

+

+
+ +

title

+
java.lang.Object title
+
+
+
+

+

+
+ +

version

+
java.lang.Object version
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ PdfPluginTestGrailsPlugin

+
PdfPluginTestGrailsPlugin()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/PdfRenderingService.html b/docs/gapi/DefaultPackage/PdfRenderingService.html new file mode 100644 index 0000000..71f4bf1 --- /dev/null +++ b/docs/gapi/DefaultPackage/PdfRenderingService.html @@ -0,0 +1,326 @@ + + + + + + + + + +PdfRenderingService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class PdfRenderingService

+
java.lang.Object
+  grails.plugin.rendering.RenderingService
+      PdfRenderingService
+

+
class PdfRenderingService
+extends RenderingService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ static java.lang.Object + transactional +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ PdfRenderingService() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected java.lang.Object + + configureRenderer(org.xhtmlrenderer.pdf.ITextRenderer renderer) +
+

+
+ protected java.lang.Object + + doRender(java.util.Map args, org.w3c.dom.Document document, java.io.OutputStream outputStream) +
+

+
+ protected java.lang.Object + + getDefaultContentType() +
+

+
+   + + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

transactional

+
static java.lang.Object transactional
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ PdfRenderingService

+
PdfRenderingService()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ configureRenderer

+
protected java.lang.Object configureRenderer(org.xhtmlrenderer.pdf.ITextRenderer renderer)
+
+
+
+

+

+
+ +

+ doRender

+
protected java.lang.Object doRender(java.util.Map args, org.w3c.dom.Document document, java.io.OutputStream outputStream)
+
+
+
+

+

+
+ +

+ getDefaultContentType

+
protected java.lang.Object getDefaultContentType()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/PdfRenderingServiceSpec.html b/docs/gapi/DefaultPackage/PdfRenderingServiceSpec.html new file mode 100644 index 0000000..d187f28 --- /dev/null +++ b/docs/gapi/DefaultPackage/PdfRenderingServiceSpec.html @@ -0,0 +1,389 @@ + + + + + + + + + +PdfRenderingServiceSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class PdfRenderingServiceSpec

+
java.lang.Object
+  grails.plugin.rendering.RenderingServiceSpec
+      PdfRenderingServiceSpec
+

+
class PdfRenderingServiceSpec
+extends RenderingServiceSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ java.lang.Object + pdfRenderingService +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ PdfRenderingServiceSpec() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected java.lang.Object + + createPdf(java.util.Map renderArgs) +
+

+
+ protected java.lang.Object + + createPdf(java.io.InputStream inputStream) +
+

+
+ protected java.lang.Object + + extractTextLines(java.util.Map renderArgs) +
+

+
+ protected java.lang.Object + + extractTextLines(byte[] bytes) +
+

+
+ protected java.lang.Object + + extractTextLines(org.apache.pdfbox.pdmodel.PDDocument pdf) +
+

+
+ java.lang.Object + + getRenderer() +
+

+
+   + + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

pdfRenderingService

+
java.lang.Object pdfRenderingService
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ PdfRenderingServiceSpec

+
PdfRenderingServiceSpec()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ createPdf

+
protected java.lang.Object createPdf(java.util.Map renderArgs)
+
+
+
+

+

+
+ +

+ createPdf

+
protected java.lang.Object createPdf(java.io.InputStream inputStream)
+
+
+
+

+

+
+ +

+ extractTextLines

+
protected java.lang.Object extractTextLines(java.util.Map renderArgs)
+
+
+
+

+

+
+ +

+ extractTextLines

+
protected java.lang.Object extractTextLines(byte[] bytes)
+
+
+
+

+

+
+ +

+ extractTextLines

+
protected java.lang.Object extractTextLines(org.apache.pdfbox.pdmodel.PDDocument pdf)
+
+
+
+

+

+
+ +

+ getRenderer

+
java.lang.Object getRenderer()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/PngRenderingService.html b/docs/gapi/DefaultPackage/PngRenderingService.html new file mode 100644 index 0000000..f5beea0 --- /dev/null +++ b/docs/gapi/DefaultPackage/PngRenderingService.html @@ -0,0 +1,268 @@ + + + + + + + + + +PngRenderingService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class PngRenderingService

+
java.lang.Object
+  grails.plugin.rendering.image.ImageRenderingService
+      PngRenderingService
+

+
class PngRenderingService
+extends ImageRenderingService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ PngRenderingService() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected java.lang.Object + + getDefaultContentType() +
+

+
+ protected java.lang.Object + + getImageType() +
+

+
+   + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ PngRenderingService

+
PngRenderingService()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ getDefaultContentType

+
protected java.lang.Object getDefaultContentType()
+
+
+
+

+

+
+ +

+ getImageType

+
protected java.lang.Object getImageType()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/PngRenderingServiceSpec.html b/docs/gapi/DefaultPackage/PngRenderingServiceSpec.html new file mode 100644 index 0000000..7a40350 --- /dev/null +++ b/docs/gapi/DefaultPackage/PngRenderingServiceSpec.html @@ -0,0 +1,284 @@ + + + + + + + + + +PngRenderingServiceSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class PngRenderingServiceSpec

+
java.lang.Object
+  grails.plugin.rendering.image.ImageRenderingServiceSpec
+      PngRenderingServiceSpec
+

+
class PngRenderingServiceSpec
+extends ImageRenderingServiceSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ java.lang.Object + pngRenderingService +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ PngRenderingServiceSpec() +
+

+
+   + + + + + + + + + + + + + + + + +
+ Method Summary
+ java.lang.Object + + getRenderer() +
+

+
+   + + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

pngRenderingService

+
java.lang.Object pngRenderingService
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ PngRenderingServiceSpec

+
PngRenderingServiceSpec()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ getRenderer

+
java.lang.Object getRenderer()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/RenderEnvironment.html b/docs/gapi/DefaultPackage/RenderEnvironment.html new file mode 100644 index 0000000..66183bb --- /dev/null +++ b/docs/gapi/DefaultPackage/RenderEnvironment.html @@ -0,0 +1,487 @@ + + + + + + + + + +RenderEnvironment (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class RenderEnvironment

+
java.lang.Object
+  RenderEnvironment
+

+
class RenderEnvironment
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field Summary
+ private java.lang.Object + originalOut +
+

+
+ private java.lang.Object + originalRequestAttributes +
+

+
+ private java.lang.Object + renderRequestAttributes +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ org.springframework.context.ApplicationContext + applicationContext +
+

+
+ java.util.Locale + locale +
+

+
+ java.io.Writer + out +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderEnvironment(org.springframework.context.ApplicationContext applicationContext, java.io.Writer out, java.util.Locale locale = null) +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ private java.lang.Object + + close() +
+

+
+ java.lang.String + + getControllerName() +
+

+
+ private java.lang.Object + + init() +
+

+
+ static java.lang.Object + + with(org.springframework.context.ApplicationContext applicationContext, java.io.Writer out, groovy.lang.Closure block) +
+

Establish an environment inheriting the locale of the current request if there is one

+
+ static java.lang.Object + + with(org.springframework.context.ApplicationContext applicationContext, java.io.Writer out, java.util.Locale locale, groovy.lang.Closure block) +
+

Establish an environment with a specific locale

+
+   + + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + +
+ Field Detail
+ +

originalOut

+
private java.lang.Object originalOut
+
+
+
+

+

+
+ +

originalRequestAttributes

+
private java.lang.Object originalRequestAttributes
+
+
+
+

+

+
+ +

renderRequestAttributes

+
private java.lang.Object renderRequestAttributes
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Property Detail
+ +

applicationContext

+
final org.springframework.context.ApplicationContext applicationContext
+
+
+
+

+

+
+ +

locale

+
final java.util.Locale locale
+
+
+
+

+

+
+ +

out

+
final java.io.Writer out
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderEnvironment

+
RenderEnvironment(org.springframework.context.ApplicationContext applicationContext, java.io.Writer out, java.util.Locale locale = null)
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ close

+
private java.lang.Object close()
+
+
+
+

+

+
+ +

+ getControllerName

+
java.lang.String getControllerName()
+
+
+
+

+

+
+ +

+ init

+
private java.lang.Object init()
+
+
+
+

+

+
+ +

+ with

+
static java.lang.Object with(org.springframework.context.ApplicationContext applicationContext, java.io.Writer out, groovy.lang.Closure block)
+
+
Establish an environment inheriting the locale of the current request if there is one + +
+

+

+
+ +

+ with

+
static java.lang.Object with(org.springframework.context.ApplicationContext applicationContext, java.io.Writer out, java.util.Locale locale, groovy.lang.Closure block)
+
+
Establish an environment with a specific locale + +
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/RenderEvent.html b/docs/gapi/DefaultPackage/RenderEvent.html new file mode 100644 index 0000000..200bd8f --- /dev/null +++ b/docs/gapi/DefaultPackage/RenderEvent.html @@ -0,0 +1,233 @@ + + + + + + + + + +RenderEvent (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class RenderEvent

+
java.lang.Object
+  java.util.EventObject
+      org.springframework.context.ApplicationEvent
+          RenderEvent
+

+
class RenderEvent
+extends org.springframework.context.ApplicationEvent
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderEvent(java.lang.Object renderError) +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class org.springframework.context.ApplicationEvent +
org.springframework.context.ApplicationEvent#getTimestamp(), org.springframework.context.ApplicationEvent#toString(), org.springframework.context.ApplicationEvent#getSource(), org.springframework.context.ApplicationEvent#wait(), org.springframework.context.ApplicationEvent#wait(long), org.springframework.context.ApplicationEvent#wait(long, int), org.springframework.context.ApplicationEvent#equals(java.lang.Object), org.springframework.context.ApplicationEvent#hashCode(), org.springframework.context.ApplicationEvent#getClass(), org.springframework.context.ApplicationEvent#notify(), org.springframework.context.ApplicationEvent#notifyAll()
+   + + +
+ Methods inherited from class java.util.EventObject +
java.util.EventObject#toString(), java.util.EventObject#getSource(), java.util.EventObject#wait(), java.util.EventObject#wait(long), java.util.EventObject#wait(long, int), java.util.EventObject#equals(java.lang.Object), java.util.EventObject#hashCode(), java.util.EventObject#getClass(), java.util.EventObject#notify(), java.util.EventObject#notifyAll()
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderEvent

+
RenderEvent(java.lang.Object renderError)
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/RenderingController.html b/docs/gapi/DefaultPackage/RenderingController.html new file mode 100644 index 0000000..ec8da18 --- /dev/null +++ b/docs/gapi/DefaultPackage/RenderingController.html @@ -0,0 +1,421 @@ + + + + + + + + + +RenderingController (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class RenderingController

+
java.lang.Object
+  RenderingController
+

+
class RenderingController
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ java.lang.Object + dataUriImg +
+

+
+ java.lang.Object + dataUriPdf +
+

+
+ java.lang.Object + encodingTest +
+

+
+ java.lang.Object + gif +
+

+
+ java.lang.Object + jpeg +
+

+
+ java.lang.Object + pdf +
+

+
+ java.lang.Object + png +
+

+
+ java.lang.Object + relative +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderingController() +
+

+
+   + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected java.lang.Object + + getTemplate() +
+

+
+   + + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

dataUriImg

+
java.lang.Object dataUriImg
+
+
+
+

+

+
+ +

dataUriPdf

+
java.lang.Object dataUriPdf
+
+
+
+

+

+
+ +

encodingTest

+
java.lang.Object encodingTest
+
+
+
+

+

+
+ +

gif

+
java.lang.Object gif
+
+
+
+

+

+
+ +

jpeg

+
java.lang.Object jpeg
+
+
+
+

+

+
+ +

pdf

+
java.lang.Object pdf
+
+
+
+

+

+
+ +

png

+
java.lang.Object png
+
+
+
+

+

+
+ +

relative

+
java.lang.Object relative
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderingController

+
RenderingController()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ getTemplate

+
protected java.lang.Object getTemplate()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/RenderingException.html b/docs/gapi/DefaultPackage/RenderingException.html new file mode 100644 index 0000000..69054d8 --- /dev/null +++ b/docs/gapi/DefaultPackage/RenderingException.html @@ -0,0 +1,245 @@ + + + + + + + + + +RenderingException (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering +
+ +[Groovy] Class RenderingException

+
java.lang.Object
+  java.lang.Throwable
+      java.lang.Exception
+          java.lang.RuntimeException
+              GrailsRenderingException
+                  RenderingException
+

+
class RenderingException
+extends GrailsRenderingException
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderingException(java.lang.Object cause) +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.RuntimeException +
java.lang.RuntimeException#printStackTrace(java.io.PrintStream), java.lang.RuntimeException#printStackTrace(), java.lang.RuntimeException#printStackTrace(java.io.PrintWriter), java.lang.RuntimeException#fillInStackTrace(), java.lang.RuntimeException#getCause(), java.lang.RuntimeException#initCause(java.lang.Throwable), java.lang.RuntimeException#toString(), java.lang.RuntimeException#getMessage(), java.lang.RuntimeException#getLocalizedMessage(), java.lang.RuntimeException#getStackTrace(), java.lang.RuntimeException#setStackTrace([Ljava.lang.StackTraceElement;), java.lang.RuntimeException#wait(), java.lang.RuntimeException#wait(long), java.lang.RuntimeException#wait(long, int), java.lang.RuntimeException#equals(java.lang.Object), java.lang.RuntimeException#hashCode(), java.lang.RuntimeException#getClass(), java.lang.RuntimeException#notify(), java.lang.RuntimeException#notifyAll()
+   + + +
+ Methods inherited from class java.lang.Exception +
java.lang.Exception#printStackTrace(java.io.PrintStream), java.lang.Exception#printStackTrace(), java.lang.Exception#printStackTrace(java.io.PrintWriter), java.lang.Exception#fillInStackTrace(), java.lang.Exception#getCause(), java.lang.Exception#initCause(java.lang.Throwable), java.lang.Exception#toString(), java.lang.Exception#getMessage(), java.lang.Exception#getLocalizedMessage(), java.lang.Exception#getStackTrace(), java.lang.Exception#setStackTrace([Ljava.lang.StackTraceElement;), java.lang.Exception#wait(), java.lang.Exception#wait(long), java.lang.Exception#wait(long, int), java.lang.Exception#equals(java.lang.Object), java.lang.Exception#hashCode(), java.lang.Exception#getClass(), java.lang.Exception#notify(), java.lang.Exception#notifyAll()
+   + + +
+ Methods inherited from class java.lang.Throwable +
java.lang.Throwable#printStackTrace(java.io.PrintStream), java.lang.Throwable#printStackTrace(), java.lang.Throwable#printStackTrace(java.io.PrintWriter), java.lang.Throwable#fillInStackTrace(), java.lang.Throwable#getCause(), java.lang.Throwable#initCause(java.lang.Throwable), java.lang.Throwable#toString(), java.lang.Throwable#getMessage(), java.lang.Throwable#getLocalizedMessage(), java.lang.Throwable#getStackTrace(), java.lang.Throwable#setStackTrace([Ljava.lang.StackTraceElement;), java.lang.Throwable#wait(), java.lang.Throwable#wait(long), java.lang.Throwable#wait(long, int), java.lang.Throwable#equals(java.lang.Object), java.lang.Throwable#hashCode(), java.lang.Throwable#getClass(), java.lang.Throwable#notify(), java.lang.Throwable#notifyAll()
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderingException

+
RenderingException(java.lang.Object cause)
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/RenderingGrailsPlugin.html b/docs/gapi/DefaultPackage/RenderingGrailsPlugin.html new file mode 100644 index 0000000..d10950a --- /dev/null +++ b/docs/gapi/DefaultPackage/RenderingGrailsPlugin.html @@ -0,0 +1,537 @@ + + + + + + + + + +RenderingGrailsPlugin (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class RenderingGrailsPlugin

+
java.lang.Object
+  RenderingGrailsPlugin
+

+
class RenderingGrailsPlugin
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ java.lang.Object + author +
+

+
+ java.lang.Object + authorEmail +
+

+
+ java.lang.Object + dependsOn +
+

+
+ java.lang.Object + description +
+

+
+ java.lang.Object + doWithDynamicMethods +
+

+
+ java.lang.Object + documentation +
+

+
+ java.lang.Object + grailsVersion +
+

+
+ java.lang.Object + loadAfter +
+

+
+ java.lang.Object + observe +
+

/*", + "grails-app/controllers/*

+
+ java.lang.Object + onChange +
+

+
+ java.lang.Object + pluginExcludes +
+

+
+ java.lang.Object + renderMethodTemplate +
+

+
+ java.lang.Object + title +
+

+
+ java.lang.Object + version +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderingGrailsPlugin() +
+

+
+   + + + + + + + + + + + + + + + + +
+ Method Summary
+ java.lang.Object + + addRenderMethods(java.lang.Object ctx, java.lang.Object clazz) +
+

+
+   + + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

author

+
java.lang.Object author
+
+
+
+

+

+
+ +

authorEmail

+
java.lang.Object authorEmail
+
+
+
+

+

+
+ +

dependsOn

+
java.lang.Object dependsOn
+
+
+
+

+

+
+ +

description

+
java.lang.Object description
+
+
+
+

+

+
+ +

doWithDynamicMethods

+
java.lang.Object doWithDynamicMethods
+
+
+
+

+

+
+ +

documentation

+
java.lang.Object documentation
+
+
+
+

+

+
+ +

grailsVersion

+
java.lang.Object grailsVersion
+
+
+
+

+

+
+ +

loadAfter

+
java.lang.Object loadAfter
+
+
+
+

+

+
+ +

observe

+
java.lang.Object observe
+
+
/*", + "grails-app/controllers/* +
+

+

+
+ +

onChange

+
java.lang.Object onChange
+
+
+
+

+

+
+ +

pluginExcludes

+
java.lang.Object pluginExcludes
+
+
+
+

+

+
+ +

renderMethodTemplate

+
java.lang.Object renderMethodTemplate
+
+
+
+

+

+
+ +

title

+
java.lang.Object title
+
+
+
+

+

+
+ +

version

+
java.lang.Object version
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderingGrailsPlugin

+
RenderingGrailsPlugin()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ addRenderMethods

+
java.lang.Object addRenderMethods(java.lang.Object ctx, java.lang.Object clazz)
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/RenderingGrailsPluginSpec.html b/docs/gapi/DefaultPackage/RenderingGrailsPluginSpec.html new file mode 100644 index 0000000..90e30d4 --- /dev/null +++ b/docs/gapi/DefaultPackage/RenderingGrailsPluginSpec.html @@ -0,0 +1,368 @@ + + + + + + + + + +RenderingGrailsPluginSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering +
+ +[Groovy] Class RenderingGrailsPluginSpec

+
java.lang.Object
+  spock.lang.Specification
+      grails.plugin.spock.IntegrationSpec
+          RenderingGrailsPluginSpec
+

+
class RenderingGrailsPluginSpec
+extends grails.plugin.spock.IntegrationSpec
+
+
+ + + + + + + + + + + + + + + + + + + +
+ Field Summary
+   + + +
+ Fields inherited from class grails.plugin.spock.IntegrationSpec +
$spock_sharedInstance, __timeStamp, __timeStamp__239_neverHappen1292003085656, _
+   + + +
+ Fields inherited from class spock.lang.Specification +
_
+   + + + + + + + + + + + + + + + +
+ Property Summary
+ java.lang.Object + grailsApplication +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderingGrailsPluginSpec() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected java.lang.Object + + createController() +
+

+
+ protected java.lang.Object + + reloadControllerClass() +
+

+
+ java.lang.Object + + supportReloadingControllerClasses() +
+

+
+   + + + +
+ Methods inherited from class grails.plugin.spock.IntegrationSpec +
grails.plugin.spock.IntegrationSpec#setProperty(java.lang.String, java.lang.Object), grails.plugin.spock.IntegrationSpec#getProperty(java.lang.String), grails.plugin.spock.IntegrationSpec#invokeMethod(java.lang.String, java.lang.Object), grails.plugin.spock.IntegrationSpec#getMetaClass(), grails.plugin.spock.IntegrationSpec#setMetaClass(groovy.lang.MetaClass), grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#old(java.lang.Object), grails.plugin.spock.IntegrationSpec#thrown(java.lang.Class), grails.plugin.spock.IntegrationSpec#thrown(), grails.plugin.spock.IntegrationSpec#notThrown(java.lang.Class), grails.plugin.spock.IntegrationSpec#noExceptionThrown(), grails.plugin.spock.IntegrationSpec#Mock(), grails.plugin.spock.IntegrationSpec#Mock(java.lang.Class), grails.plugin.spock.IntegrationSpec#interaction(groovy.lang.Closure), grails.plugin.spock.IntegrationSpec#wait(), grails.plugin.spock.IntegrationSpec#wait(long), grails.plugin.spock.IntegrationSpec#wait(long, int), grails.plugin.spock.IntegrationSpec#equals(java.lang.Object), grails.plugin.spock.IntegrationSpec#toString(), grails.plugin.spock.IntegrationSpec#hashCode(), grails.plugin.spock.IntegrationSpec#getClass(), grails.plugin.spock.IntegrationSpec#notify(), grails.plugin.spock.IntegrationSpec#notifyAll()
+   + + +
+ Methods inherited from class spock.lang.Specification +
spock.lang.Specification#old(java.lang.Object), spock.lang.Specification#thrown(java.lang.Class), spock.lang.Specification#thrown(), spock.lang.Specification#notThrown(java.lang.Class), spock.lang.Specification#noExceptionThrown(), spock.lang.Specification#Mock(), spock.lang.Specification#Mock(java.lang.Class), spock.lang.Specification#interaction(groovy.lang.Closure), spock.lang.Specification#wait(), spock.lang.Specification#wait(long), spock.lang.Specification#wait(long, int), spock.lang.Specification#equals(java.lang.Object), spock.lang.Specification#toString(), spock.lang.Specification#hashCode(), spock.lang.Specification#getClass(), spock.lang.Specification#notify(), spock.lang.Specification#notifyAll()
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

grailsApplication

+
java.lang.Object grailsApplication
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderingGrailsPluginSpec

+
RenderingGrailsPluginSpec()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ createController

+
protected java.lang.Object createController()
+
+
+
+

+

+
+ +

+ reloadControllerClass

+
protected java.lang.Object reloadControllerClass()
+
+
+
+

+

+
+ +

+ supportReloadingControllerClasses

+
@Unroll("rendering #action works from controllers and survives a reload")
+java.lang.Object supportReloadingControllerClasses()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/RenderingService.html b/docs/gapi/DefaultPackage/RenderingService.html new file mode 100644 index 0000000..d7a30e7 --- /dev/null +++ b/docs/gapi/DefaultPackage/RenderingService.html @@ -0,0 +1,557 @@ + + + + + + + + + +RenderingService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class RenderingService

+
java.lang.Object
+  RenderingService
+

+
abstract class RenderingService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ java.lang.Object + grailsApplication +
+

+
+ static java.lang.Object + transactional +
+

+
+ java.lang.Object + xhtmlDocumentService +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderingService() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected java.lang.Object + + configureResponse(java.util.Map args, javax.servlet.http.HttpServletResponse response) +
+

+
+ protected java.lang.Object + + doRender(java.util.Map args, org.w3c.dom.Document document, java.io.OutputStream outputStream) +
+

+
+ protected java.lang.Object + + getDefaultContentType() +
+

+
+ protected java.lang.Object + + processArgs(java.util.Map args) +
+

+
+ java.io.OutputStream + + render(java.util.Map args, java.io.OutputStream outputStream = new ByteArrayOutputStream() +
+

+
+ java.io.OutputStream + + render(java.util.Map args, org.w3c.dom.Document document, java.io.OutputStream outputStream = new ByteArrayOutputStream() +
+

+
+ boolean + + render(java.util.Map args, javax.servlet.http.HttpServletResponse response) +
+

+
+ protected java.lang.Object + + setContentDisposition(java.util.Map args, javax.servlet.http.HttpServletResponse response) +
+

+
+ protected java.lang.Object + + setContentType(java.util.Map args, javax.servlet.http.HttpServletResponse response) +
+

+
+ protected java.lang.Object + + setResponseHeaders(java.util.Map args, javax.servlet.http.HttpServletResponse response) +
+

+
+ protected java.lang.Object + + writeToResponse(java.util.Map args, javax.servlet.http.HttpServletResponse response, java.io.InputStream input) +
+

+
+ protected java.lang.Object + + writeToResponse(java.util.Map args, javax.servlet.http.HttpServletResponse response, byte[] bytes) +
+

+
+   + + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

grailsApplication

+
java.lang.Object grailsApplication
+
+
+
+

+

+
+ +

transactional

+
static java.lang.Object transactional
+
+
+
+

+

+
+ +

xhtmlDocumentService

+
java.lang.Object xhtmlDocumentService
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderingService

+
RenderingService()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ configureResponse

+
protected java.lang.Object configureResponse(java.util.Map args, javax.servlet.http.HttpServletResponse response)
+
+
+
+

+

+
+ +

+ doRender

+
protected java.lang.Object doRender(java.util.Map args, org.w3c.dom.Document document, java.io.OutputStream outputStream)
+
+
+
+

+

+
+ +

+ getDefaultContentType

+
protected java.lang.Object getDefaultContentType()
+
+
+
+

+

+
+ +

+ processArgs

+
protected java.lang.Object processArgs(java.util.Map args)
+
+
+
+

+

+
+ +

+ render

+
java.io.OutputStream render(java.util.Map args, java.io.OutputStream outputStream = new ByteArrayOutputStream()
+
+
+
+

+

+
+ +

+ render

+
java.io.OutputStream render(java.util.Map args, org.w3c.dom.Document document, java.io.OutputStream outputStream = new ByteArrayOutputStream()
+
+
+
+

+

+
+ +

+ render

+
boolean render(java.util.Map args, javax.servlet.http.HttpServletResponse response)
+
+
+
+

+

+
+ +

+ setContentDisposition

+
protected java.lang.Object setContentDisposition(java.util.Map args, javax.servlet.http.HttpServletResponse response)
+
+
+
+

+

+
+ +

+ setContentType

+
protected java.lang.Object setContentType(java.util.Map args, javax.servlet.http.HttpServletResponse response)
+
+
+
+

+

+
+ +

+ setResponseHeaders

+
protected java.lang.Object setResponseHeaders(java.util.Map args, javax.servlet.http.HttpServletResponse response)
+
+
+
+

+

+
+ +

+ writeToResponse

+
protected java.lang.Object writeToResponse(java.util.Map args, javax.servlet.http.HttpServletResponse response, java.io.InputStream input)
+
+
+
+

+

+
+ +

+ writeToResponse

+
protected java.lang.Object writeToResponse(java.util.Map args, javax.servlet.http.HttpServletResponse response, byte[] bytes)
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/RenderingServiceSpec.html b/docs/gapi/DefaultPackage/RenderingServiceSpec.html new file mode 100644 index 0000000..539424a --- /dev/null +++ b/docs/gapi/DefaultPackage/RenderingServiceSpec.html @@ -0,0 +1,613 @@ + + + + + + + + + +RenderingServiceSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class RenderingServiceSpec

+
java.lang.Object
+  spock.lang.Specification
+      grails.plugin.spock.IntegrationSpec
+          RenderingServiceSpec
+

+
abstract class RenderingServiceSpec
+extends grails.plugin.spock.IntegrationSpec
+
+
+ + + + + + + + + + + + + + + + + + + +
+ Field Summary
+   + + +
+ Fields inherited from class grails.plugin.spock.IntegrationSpec +
$spock_sharedInstance, __timeStamp, __timeStamp__239_neverHappen1292003085656, _
+   + + +
+ Fields inherited from class spock.lang.Specification +
_
+   + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ java.lang.Object + grailsApplication +
+

+
+ java.lang.Object + pluginManager +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderingServiceSpec() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ java.lang.Object + + badXmlThrowsXmlParseException() +
+

+
+ java.lang.Object + + can handle data uris() +
+

+
+ protected java.lang.Object + + createController() +
+

+
+ protected java.lang.Object + + createMockResponse() +
+

+
+ protected java.lang.Object + + getDataUriTemplate() +
+

+
+ protected java.lang.Object + + getPluginTemplate(java.util.Map args = [:]) +
+

+
+ java.lang.Object + + getRenderer() +
+

+
+ protected java.lang.Object + + getSimpleTemplate(java.util.Map args = [:]) +
+

+
+ java.lang.Object + + renderTemplateInPlugin() +
+

+
+ java.lang.Object + + renderToResponse() +
+

+
+ java.lang.Object + + renderToResponseViaBytes() +
+

+
+ java.lang.Object + + renderWithNoTemplateThrowsException() +
+

+
+ java.lang.Object + + renderWithUnknownTemplateThrowsException() +
+

+
+ java.lang.Object + + simpleRender() +
+

+
+   + + + +
+ Methods inherited from class grails.plugin.spock.IntegrationSpec +
grails.plugin.spock.IntegrationSpec#setProperty(java.lang.String, java.lang.Object), grails.plugin.spock.IntegrationSpec#getProperty(java.lang.String), grails.plugin.spock.IntegrationSpec#invokeMethod(java.lang.String, java.lang.Object), grails.plugin.spock.IntegrationSpec#getMetaClass(), grails.plugin.spock.IntegrationSpec#setMetaClass(groovy.lang.MetaClass), grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#old(java.lang.Object), grails.plugin.spock.IntegrationSpec#thrown(java.lang.Class), grails.plugin.spock.IntegrationSpec#thrown(), grails.plugin.spock.IntegrationSpec#notThrown(java.lang.Class), grails.plugin.spock.IntegrationSpec#noExceptionThrown(), grails.plugin.spock.IntegrationSpec#Mock(), grails.plugin.spock.IntegrationSpec#Mock(java.lang.Class), grails.plugin.spock.IntegrationSpec#interaction(groovy.lang.Closure), grails.plugin.spock.IntegrationSpec#wait(), grails.plugin.spock.IntegrationSpec#wait(long), grails.plugin.spock.IntegrationSpec#wait(long, int), grails.plugin.spock.IntegrationSpec#equals(java.lang.Object), grails.plugin.spock.IntegrationSpec#toString(), grails.plugin.spock.IntegrationSpec#hashCode(), grails.plugin.spock.IntegrationSpec#getClass(), grails.plugin.spock.IntegrationSpec#notify(), grails.plugin.spock.IntegrationSpec#notifyAll()
+   + + +
+ Methods inherited from class spock.lang.Specification +
spock.lang.Specification#old(java.lang.Object), spock.lang.Specification#thrown(java.lang.Class), spock.lang.Specification#thrown(), spock.lang.Specification#notThrown(java.lang.Class), spock.lang.Specification#noExceptionThrown(), spock.lang.Specification#Mock(), spock.lang.Specification#Mock(java.lang.Class), spock.lang.Specification#interaction(groovy.lang.Closure), spock.lang.Specification#wait(), spock.lang.Specification#wait(long), spock.lang.Specification#wait(long, int), spock.lang.Specification#equals(java.lang.Object), spock.lang.Specification#toString(), spock.lang.Specification#hashCode(), spock.lang.Specification#getClass(), spock.lang.Specification#notify(), spock.lang.Specification#notifyAll()
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

grailsApplication

+
java.lang.Object grailsApplication
+
+
+
+

+

+
+ +

pluginManager

+
java.lang.Object pluginManager
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderingServiceSpec

+
RenderingServiceSpec()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ badXmlThrowsXmlParseException

+
java.lang.Object badXmlThrowsXmlParseException()
+
+
+
+

+

+
+ +

+ can handle data uris

+
java.lang.Object can handle data uris()
+
+
+
+

+

+
+ +

+ createController

+
protected java.lang.Object createController()
+
+
+
+

+

+
+ +

+ createMockResponse

+
protected java.lang.Object createMockResponse()
+
+
+
+

+

+
+ +

+ getDataUriTemplate

+
protected java.lang.Object getDataUriTemplate()
+
+
+
+

+

+
+ +

+ getPluginTemplate

+
protected java.lang.Object getPluginTemplate(java.util.Map args = [:])
+
+
+
+

+

+
+ +

+ getRenderer

+
java.lang.Object getRenderer()
+
+
+
+

+

+
+ +

+ getSimpleTemplate

+
protected java.lang.Object getSimpleTemplate(java.util.Map args = [:])
+
+
+
+

+

+
+ +

+ renderTemplateInPlugin

+
java.lang.Object renderTemplateInPlugin()
+
+
+
+

+

+
+ +

+ renderToResponse

+
java.lang.Object renderToResponse()
+
+
+
+

+

+
+ +

+ renderToResponseViaBytes

+
java.lang.Object renderToResponseViaBytes()
+
+
+
+

+

+
+ +

+ renderWithNoTemplateThrowsException

+
java.lang.Object renderWithNoTemplateThrowsException()
+
+
+
+

+

+
+ +

+ renderWithUnknownTemplateThrowsException

+
java.lang.Object renderWithUnknownTemplateThrowsException()
+
+
+
+

+

+
+ +

+ simpleRender

+
java.lang.Object simpleRender()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/RenderingTagLib.html b/docs/gapi/DefaultPackage/RenderingTagLib.html new file mode 100644 index 0000000..e4f3c50 --- /dev/null +++ b/docs/gapi/DefaultPackage/RenderingTagLib.html @@ -0,0 +1,337 @@ + + + + + + + + + +RenderingTagLib (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class RenderingTagLib

+
java.lang.Object
+  RenderingTagLib
+

+
class RenderingTagLib
+
+
+ +

+

todo:
need tests for this.
+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ java.lang.Object + inlineGif +
+

+
+ java.lang.Object + inlineImage +
+

+
+ java.lang.Object + inlineJpeg +
+

+
+ java.lang.Object + inlinePng +
+

+
+ static java.lang.Object + namespace +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderingTagLib() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

inlineGif

+
java.lang.Object inlineGif
+
+
+
+

+

+
+ +

inlineImage

+
java.lang.Object inlineImage
+
+
+
+

+

+
+ +

inlineJpeg

+
java.lang.Object inlineJpeg
+
+
+
+

+

+
+ +

inlinePng

+
java.lang.Object inlinePng
+
+
+
+

+

+
+ +

namespace

+
static java.lang.Object namespace
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderingTagLib

+
RenderingTagLib()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/RenderingTagLibSpec.html b/docs/gapi/DefaultPackage/RenderingTagLibSpec.html new file mode 100644 index 0000000..9a2341e --- /dev/null +++ b/docs/gapi/DefaultPackage/RenderingTagLibSpec.html @@ -0,0 +1,527 @@ + + + + + + + + + +RenderingTagLibSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering +
+ +[Groovy] Class RenderingTagLibSpec

+
java.lang.Object
+  spock.lang.Specification
+      grails.plugin.spock.IntegrationSpec
+          grails.plugin.spock.GroovyPagesSpec
+              RenderingTagLibSpec
+

+
class RenderingTagLibSpec
+extends grails.plugin.spock.GroovyPagesSpec
+
+
+ + + + + + + + + + + + + + + + + + + +
+ Field Summary
+   + + +
+ Fields inherited from class grails.plugin.spock.GroovyPagesSpec +
__timeStamp, __timeStamp__239_neverHappen1292003085707, $spock_sharedInstance, __timeStamp, __timeStamp__239_neverHappen1292003085656, _
+   + + +
+ Fields inherited from class grails.plugin.spock.IntegrationSpec +
$spock_sharedInstance, __timeStamp, __timeStamp__239_neverHappen1292003085656, _
+   + + +
+ Fields inherited from class spock.lang.Specification +
_
+   + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ java.lang.Object + bytes +
+

+
+ java.lang.Object + encoded +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderingTagLibSpec() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected java.lang.Object + + getDataUri() +
+

+
+ protected java.lang.Object + + getOutputBytes() +
+

+
+ protected java.lang.Object + + getOutputMimeType() +
+

+
+ protected java.lang.Object + + getSrcAttribute() +
+

+
+ java.lang.Object + + gif tag() +
+

+
+ java.lang.Object + + inline image tag() +
+

+
+ java.lang.Object + + jpeg tag() +
+

+
+ java.lang.Object + + png tag() +
+

+
+ java.lang.Object + + setup() +
+

+
+   + + + +
+ Methods inherited from class grails.plugin.spock.GroovyPagesSpec +
grails.plugin.spock.GroovyPagesSpec#getParams(), grails.plugin.spock.GroovyPagesSpec#setParams(java.util.Map), grails.plugin.spock.GroovyPagesSpec#this, grails.plugin.spock.GroovyPagesSpec#this, grails.plugin.spock.GroovyPagesSpec#this, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#getOutput(), grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#getTemplate(), grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#getRequest(), grails.plugin.spock.GroovyPagesSpec#setControllerName(java.lang.String), grails.plugin.spock.GroovyPagesSpec#getGroovyPagesTemplateEngine(), grails.plugin.spock.GroovyPagesSpec#setGroovyPagesTemplateEngine(org.codehaus.groovy.grails.web.pages.GroovyPagesTemplateEngine), grails.plugin.spock.GroovyPagesSpec#setTemplate(java.lang.String), grails.plugin.spock.GroovyPagesSpec#this, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#setProperty(java.lang.String, java.lang.Object), grails.plugin.spock.GroovyPagesSpec#getProperty(java.lang.String), grails.plugin.spock.GroovyPagesSpec#invokeMethod(java.lang.String, java.lang.Object), grails.plugin.spock.GroovyPagesSpec#getMetaClass(), grails.plugin.spock.GroovyPagesSpec#setMetaClass(groovy.lang.MetaClass), grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#this, grails.plugin.spock.GroovyPagesSpec#this, grails.plugin.spock.GroovyPagesSpec#this, grails.plugin.spock.GroovyPagesSpec#this, grails.plugin.spock.GroovyPagesSpec#this, grails.plugin.spock.GroovyPagesSpec#this, grails.plugin.spock.GroovyPagesSpec#this, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#super, grails.plugin.spock.GroovyPagesSpec#this, grails.plugin.spock.GroovyPagesSpec#this, grails.plugin.spock.GroovyPagesSpec#this, grails.plugin.spock.GroovyPagesSpec#old(java.lang.Object), grails.plugin.spock.GroovyPagesSpec#thrown(java.lang.Class), grails.plugin.spock.GroovyPagesSpec#thrown(), grails.plugin.spock.GroovyPagesSpec#notThrown(java.lang.Class), grails.plugin.spock.GroovyPagesSpec#noExceptionThrown(), grails.plugin.spock.GroovyPagesSpec#Mock(), grails.plugin.spock.GroovyPagesSpec#Mock(java.lang.Class), grails.plugin.spock.GroovyPagesSpec#interaction(groovy.lang.Closure), grails.plugin.spock.GroovyPagesSpec#wait(), grails.plugin.spock.GroovyPagesSpec#wait(long), grails.plugin.spock.GroovyPagesSpec#wait(long, int), grails.plugin.spock.GroovyPagesSpec#equals(java.lang.Object), grails.plugin.spock.GroovyPagesSpec#toString(), grails.plugin.spock.GroovyPagesSpec#hashCode(), grails.plugin.spock.GroovyPagesSpec#getClass(), grails.plugin.spock.GroovyPagesSpec#notify(), grails.plugin.spock.GroovyPagesSpec#notifyAll()
+   + + +
+ Methods inherited from class grails.plugin.spock.IntegrationSpec +
grails.plugin.spock.IntegrationSpec#setProperty(java.lang.String, java.lang.Object), grails.plugin.spock.IntegrationSpec#getProperty(java.lang.String), grails.plugin.spock.IntegrationSpec#invokeMethod(java.lang.String, java.lang.Object), grails.plugin.spock.IntegrationSpec#getMetaClass(), grails.plugin.spock.IntegrationSpec#setMetaClass(groovy.lang.MetaClass), grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#old(java.lang.Object), grails.plugin.spock.IntegrationSpec#thrown(java.lang.Class), grails.plugin.spock.IntegrationSpec#thrown(), grails.plugin.spock.IntegrationSpec#notThrown(java.lang.Class), grails.plugin.spock.IntegrationSpec#noExceptionThrown(), grails.plugin.spock.IntegrationSpec#Mock(), grails.plugin.spock.IntegrationSpec#Mock(java.lang.Class), grails.plugin.spock.IntegrationSpec#interaction(groovy.lang.Closure), grails.plugin.spock.IntegrationSpec#wait(), grails.plugin.spock.IntegrationSpec#wait(long), grails.plugin.spock.IntegrationSpec#wait(long, int), grails.plugin.spock.IntegrationSpec#equals(java.lang.Object), grails.plugin.spock.IntegrationSpec#toString(), grails.plugin.spock.IntegrationSpec#hashCode(), grails.plugin.spock.IntegrationSpec#getClass(), grails.plugin.spock.IntegrationSpec#notify(), grails.plugin.spock.IntegrationSpec#notifyAll()
+   + + +
+ Methods inherited from class spock.lang.Specification +
spock.lang.Specification#old(java.lang.Object), spock.lang.Specification#thrown(java.lang.Class), spock.lang.Specification#thrown(), spock.lang.Specification#notThrown(java.lang.Class), spock.lang.Specification#noExceptionThrown(), spock.lang.Specification#Mock(), spock.lang.Specification#Mock(java.lang.Class), spock.lang.Specification#interaction(groovy.lang.Closure), spock.lang.Specification#wait(), spock.lang.Specification#wait(long), spock.lang.Specification#wait(long, int), spock.lang.Specification#equals(java.lang.Object), spock.lang.Specification#toString(), spock.lang.Specification#hashCode(), spock.lang.Specification#getClass(), spock.lang.Specification#notify(), spock.lang.Specification#notifyAll()
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

bytes

+
@Shared
+java.lang.Object bytes
+
+
+
+

+

+
+ +

encoded

+
@Shared
+java.lang.Object encoded
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderingTagLibSpec

+
RenderingTagLibSpec()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ getDataUri

+
protected java.lang.Object getDataUri()
+
+
+
+

+

+
+ +

+ getOutputBytes

+
protected java.lang.Object getOutputBytes()
+
+
+
+

+

+
+ +

+ getOutputMimeType

+
protected java.lang.Object getOutputMimeType()
+
+
+
+

+

+
+ +

+ getSrcAttribute

+
protected java.lang.Object getSrcAttribute()
+
+
+
+

+

+
+ +

+ gif tag

+
java.lang.Object gif tag()
+
+
+
+

+

+
+ +

+ inline image tag

+
java.lang.Object inline image tag()
+
+
+
+

+

+
+ +

+ jpeg tag

+
java.lang.Object jpeg tag()
+
+
+
+

+

+
+ +

+ png tag

+
java.lang.Object png tag()
+
+
+
+

+

+
+ +

+ setup

+
java.lang.Object setup()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/UnknownTemplateException.html b/docs/gapi/DefaultPackage/UnknownTemplateException.html new file mode 100644 index 0000000..5467f1c --- /dev/null +++ b/docs/gapi/DefaultPackage/UnknownTemplateException.html @@ -0,0 +1,212 @@ + + + + + + + + + +UnknownTemplateException (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering.document +
+ +[Groovy] Class UnknownTemplateException

+
java.lang.Object
+  grails.plugin.rendering.GrailsRenderingException
+      UnknownTemplateException
+

+
class UnknownTemplateException
+extends GrailsRenderingException
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ UnknownTemplateException(java.lang.String template, java.lang.String plugin = null) +
+

+
+   + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ UnknownTemplateException

+
UnknownTemplateException(java.lang.String template, java.lang.String plugin = null)
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/UrlMappings.html b/docs/gapi/DefaultPackage/UrlMappings.html new file mode 100644 index 0000000..ac8f37d --- /dev/null +++ b/docs/gapi/DefaultPackage/UrlMappings.html @@ -0,0 +1,255 @@ + + + + + + + + + +UrlMappings (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class UrlMappings

+
java.lang.Object
+  UrlMappings
+

+
class UrlMappings
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ static java.lang.Object + mappings +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ UrlMappings() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

mappings

+
static java.lang.Object mappings
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ UrlMappings

+
UrlMappings()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/XhtmlDocumentService.html b/docs/gapi/DefaultPackage/XhtmlDocumentService.html new file mode 100644 index 0000000..2993982 --- /dev/null +++ b/docs/gapi/DefaultPackage/XhtmlDocumentService.html @@ -0,0 +1,450 @@ + + + + + + + + + +XhtmlDocumentService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class XhtmlDocumentService

+
java.lang.Object
+  XhtmlDocumentService
+

+
class XhtmlDocumentService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ java.lang.Object + grailsApplication +
+

+
+ java.lang.Object + groovyPagesTemplateEngine +
+

+
+ java.lang.Object + groovyPagesUriService +
+

+
+ static java.lang.Object + transactional +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ XhtmlDocumentService() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ org.w3c.dom.Document + + createDocument(java.util.Map args) +
+

+
+ protected java.lang.Object + + createDocument(java.lang.String xhtml) +
+

+
+ protected java.lang.Object + + createDocument(org.xml.sax.InputSource xhtml) +
+

+
+ protected java.lang.Object + + createTemplate(java.util.Map args) +
+

+
+ protected java.lang.Object + + generateXhtml(java.util.Map args) +
+

+
+ protected java.lang.Object + + getContextPath(java.lang.Object args) +
+

+
+   + + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

grailsApplication

+
java.lang.Object grailsApplication
+
+
+
+

+

+
+ +

groovyPagesTemplateEngine

+
java.lang.Object groovyPagesTemplateEngine
+
+
+
+

+

+
+ +

groovyPagesUriService

+
java.lang.Object groovyPagesUriService
+
+
+
+

+

+
+ +

transactional

+
static java.lang.Object transactional
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ XhtmlDocumentService

+
XhtmlDocumentService()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ createDocument

+
org.w3c.dom.Document createDocument(java.util.Map args)
+
+
+
+

+

+
+ +

+ createDocument

+
protected java.lang.Object createDocument(java.lang.String xhtml)
+
+
+
+

+

+
+ +

+ createDocument

+
protected java.lang.Object createDocument(org.xml.sax.InputSource xhtml)
+
+
+
+

+

+
+ +

+ createTemplate

+
protected java.lang.Object createTemplate(java.util.Map args)
+
+
+
+

+

+
+ +

+ generateXhtml

+
protected java.lang.Object generateXhtml(java.util.Map args)
+
+
+
+

+

+
+ +

+ getContextPath

+
protected java.lang.Object getContextPath(java.lang.Object args)
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/XhtmlDocumentServiceSpec.html b/docs/gapi/DefaultPackage/XhtmlDocumentServiceSpec.html new file mode 100644 index 0000000..c8ad218 --- /dev/null +++ b/docs/gapi/DefaultPackage/XhtmlDocumentServiceSpec.html @@ -0,0 +1,332 @@ + + + + + + + + + +XhtmlDocumentServiceSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering.document +
+ +[Groovy] Class XhtmlDocumentServiceSpec

+
java.lang.Object
+  spock.lang.Specification
+      grails.plugin.spock.IntegrationSpec
+          XhtmlDocumentServiceSpec
+

+
class XhtmlDocumentServiceSpec
+extends grails.plugin.spock.IntegrationSpec
+
+
+ +

+ The xhtmlDocumentService is exercised in the rendering + service tests. This is here for testing future functionality. + +

+
+ + + + + + + + + + + + + + + + + + + +
+ Field Summary
+   + + +
+ Fields inherited from class grails.plugin.spock.IntegrationSpec +
$spock_sharedInstance, __timeStamp, __timeStamp__239_neverHappen1292003085656, _
+   + + +
+ Fields inherited from class spock.lang.Specification +
_
+   + + + + + + + + + + + + + + + +
+ Property Summary
+ java.lang.Object + xhtmlDocumentService +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ XhtmlDocumentServiceSpec() +
+

+
+   + + + + + + + + + + + + + + + + +
+ Method Summary
+ java.lang.Object + + emptyScenario() +
+

+
+   + + + +
+ Methods inherited from class grails.plugin.spock.IntegrationSpec +
grails.plugin.spock.IntegrationSpec#setProperty(java.lang.String, java.lang.Object), grails.plugin.spock.IntegrationSpec#getProperty(java.lang.String), grails.plugin.spock.IntegrationSpec#invokeMethod(java.lang.String, java.lang.Object), grails.plugin.spock.IntegrationSpec#getMetaClass(), grails.plugin.spock.IntegrationSpec#setMetaClass(groovy.lang.MetaClass), grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#super, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#this, grails.plugin.spock.IntegrationSpec#old(java.lang.Object), grails.plugin.spock.IntegrationSpec#thrown(java.lang.Class), grails.plugin.spock.IntegrationSpec#thrown(), grails.plugin.spock.IntegrationSpec#notThrown(java.lang.Class), grails.plugin.spock.IntegrationSpec#noExceptionThrown(), grails.plugin.spock.IntegrationSpec#Mock(), grails.plugin.spock.IntegrationSpec#Mock(java.lang.Class), grails.plugin.spock.IntegrationSpec#interaction(groovy.lang.Closure), grails.plugin.spock.IntegrationSpec#wait(), grails.plugin.spock.IntegrationSpec#wait(long), grails.plugin.spock.IntegrationSpec#wait(long, int), grails.plugin.spock.IntegrationSpec#equals(java.lang.Object), grails.plugin.spock.IntegrationSpec#toString(), grails.plugin.spock.IntegrationSpec#hashCode(), grails.plugin.spock.IntegrationSpec#getClass(), grails.plugin.spock.IntegrationSpec#notify(), grails.plugin.spock.IntegrationSpec#notifyAll()
+   + + +
+ Methods inherited from class spock.lang.Specification +
spock.lang.Specification#old(java.lang.Object), spock.lang.Specification#thrown(java.lang.Class), spock.lang.Specification#thrown(), spock.lang.Specification#notThrown(java.lang.Class), spock.lang.Specification#noExceptionThrown(), spock.lang.Specification#Mock(), spock.lang.Specification#Mock(java.lang.Class), spock.lang.Specification#interaction(groovy.lang.Closure), spock.lang.Specification#wait(), spock.lang.Specification#wait(long), spock.lang.Specification#wait(long, int), spock.lang.Specification#equals(java.lang.Object), spock.lang.Specification#toString(), spock.lang.Specification#hashCode(), spock.lang.Specification#getClass(), spock.lang.Specification#notify(), spock.lang.Specification#notifyAll()
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

xhtmlDocumentService

+
java.lang.Object xhtmlDocumentService
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ XhtmlDocumentServiceSpec

+
XhtmlDocumentServiceSpec()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ emptyScenario

+
java.lang.Object emptyScenario()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/XmlParseException.html b/docs/gapi/DefaultPackage/XmlParseException.html new file mode 100644 index 0000000..1b60708 --- /dev/null +++ b/docs/gapi/DefaultPackage/XmlParseException.html @@ -0,0 +1,212 @@ + + + + + + + + + +XmlParseException (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering.document +
+ +[Groovy] Class XmlParseException

+
java.lang.Object
+  grails.plugin.rendering.GrailsRenderingException
+      XmlParseException
+

+
class XmlParseException
+extends GrailsRenderingException
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ XmlParseException(java.lang.Object xml, java.lang.Object cause) +
+

+
+   + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ XmlParseException

+
XmlParseException(java.lang.Object xml, java.lang.Object cause)
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/DefaultPackage/package-frame.html b/docs/gapi/DefaultPackage/package-frame.html new file mode 100644 index 0000000..32cfacb --- /dev/null +++ b/docs/gapi/DefaultPackage/package-frame.html @@ -0,0 +1,38 @@ + + + + +DefaultPackage + + + + + + + + + + + +DefaultPackage + + + + + + + + +
+Classes  +
BackgroundRenderingSpec
ControllerRelativeTemplateSpec
PdfRenderingServiceSpec
PngRenderingServiceSpec
RenderEnvironment
RenderingServiceSpec
UrlMappings
BackgroundRenderingSpec
ControllerRelativeTemplateSpec
RenderingServiceSpec
RenderEnvironment
PngRenderingServiceSpec
PdfRenderingServiceSpec
+ + + + + + + + + + diff --git a/docs/gapi/DefaultPackage/package-summary.html b/docs/gapi/DefaultPackage/package-summary.html new file mode 100644 index 0000000..4072c2f --- /dev/null +++ b/docs/gapi/DefaultPackage/package-summary.html @@ -0,0 +1,174 @@ + + + + +DefaultPackage (grails-rendering) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package DefaultPackage +

+ + + +

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Class Summary
BackgroundRenderingSpec
ControllerRelativeTemplateSpec
PdfRenderingServiceSpec
PngRenderingServiceSpec
RenderEnvironment
RenderingServiceSpec
UrlMappings
BackgroundRenderingSpec
ControllerRelativeTemplateSpec
RenderingServiceSpec
RenderEnvironment
PngRenderingServiceSpec
PdfRenderingServiceSpec
+  +

+

+
+
+ + + + + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/allclasses-frame.html b/docs/gapi/allclasses-frame.html new file mode 100644 index 0000000..5df2bfe --- /dev/null +++ b/docs/gapi/allclasses-frame.html @@ -0,0 +1,157 @@ + + + + +All Classes + + + + + + + + + +All Classes + +
+ + + + + +
+ + +BackgroundRenderingService +
+BackgroundRenderingService +
+BackgroundRenderingSpec +
+BackgroundRenderingSpec +
+ControllerRelativeTemplateSpec +
+ControllerRelativeTemplateSpec +
+DataUri +
+DataUri +
+DataUriAwareITextUserAgent +
+DataUriAwareITextUserAgent +
+DataUriAwareNaiveUserAgent +
+DataUriAwareNaiveUserAgent +
+DataUriSpec +
+DataUriSpec +
+GifRenderingService +
+GifRenderingService +
+GifRenderingServiceSpec +
+GifRenderingServiceSpec +
+GrailsRenderingException +
+GrailsRenderingException +
+ImageRenderingService +
+ImageRenderingService +
+ImageRenderingServiceSpec +
+ImageRenderingServiceSpec +
+JpegRenderingService +
+JpegRenderingService +
+JpegRenderingServiceSpec +
+JpegRenderingServiceSpec +
+PdfPluginTestGrailsPlugin +
+PdfRenderingService +
+PdfRenderingService +
+PdfRenderingServiceSpec +
+PdfRenderingServiceSpec +
+PngRenderingService +
+PngRenderingService +
+PngRenderingServiceSpec +
+PngRenderingServiceSpec +
+RenderEnvironment +
+RenderEnvironment +
+RenderEvent +
+RenderingController +
+RenderingException +
+RenderingException +
+RenderingGrailsPlugin +
+RenderingGrailsPluginSpec +
+RenderingGrailsPluginSpec +
+RenderingService +
+RenderingService +
+RenderingServiceSpec +
+RenderingServiceSpec +
+RenderingTagLib +
+RenderingTagLib +
+RenderingTagLibSpec +
+RenderingTagLibSpec +
+UnknownTemplateException +
+UnknownTemplateException +
+UrlMappings +
+XhtmlDocumentService +
+XhtmlDocumentService +
+XhtmlDocumentServiceSpec +
+XhtmlDocumentServiceSpec +
+XmlParseException +
+XmlParseException +
+ + +
+ + + diff --git a/docs/gapi/deprecated-list.html b/docs/gapi/deprecated-list.html new file mode 100644 index 0000000..8d60864 --- /dev/null +++ b/docs/gapi/deprecated-list.html @@ -0,0 +1,97 @@ + + + + + +Deprecated API (grails-rendering) + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + +
+
+

Deprecated API

+
+
+ + + + + + + + + + + + + +
+

Groovy Documentation

+
+ + diff --git a/docs/gapi/grails-app/conf/BuildConfig.html b/docs/gapi/grails-app/conf/BuildConfig.html new file mode 100644 index 0000000..4f8df2a --- /dev/null +++ b/docs/gapi/grails-app/conf/BuildConfig.html @@ -0,0 +1,220 @@ + + + + + + + + + +BuildConfig (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +grails-app.conf +
+Class BuildConfig

+
java.lang.Object
+  grails-app.conf.BuildConfig
+

+
class BuildConfig
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ BuildConfig() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ BuildConfig

+
BuildConfig()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails-app/conf/Config.html b/docs/gapi/grails-app/conf/Config.html new file mode 100644 index 0000000..f85e5b0 --- /dev/null +++ b/docs/gapi/grails-app/conf/Config.html @@ -0,0 +1,220 @@ + + + + + + + + + +Config (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +grails-app.conf +
+Class Config

+
java.lang.Object
+  grails-app.conf.Config
+

+
class Config
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ Config() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ Config

+
Config()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails-app/conf/DataSource.html b/docs/gapi/grails-app/conf/DataSource.html new file mode 100644 index 0000000..77d1dd1 --- /dev/null +++ b/docs/gapi/grails-app/conf/DataSource.html @@ -0,0 +1,220 @@ + + + + + + + + + +DataSource (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +grails-app.conf +
+Class DataSource

+
java.lang.Object
+  grails-app.conf.DataSource
+

+
class DataSource
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ DataSource() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ DataSource

+
DataSource()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails-app/conf/UrlMappings.html b/docs/gapi/grails-app/conf/UrlMappings.html new file mode 100644 index 0000000..812ac7b --- /dev/null +++ b/docs/gapi/grails-app/conf/UrlMappings.html @@ -0,0 +1,257 @@ + + + + + + + + + +UrlMappings (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +grails-app.conf +
+Class UrlMappings

+
java.lang.Object
+  grails-app.conf.UrlMappings
+

+
class UrlMappings
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ static def + mappings +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ UrlMappings() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

mappings

+
static def mappings
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ UrlMappings

+
UrlMappings()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails-app/conf/package-frame.html b/docs/gapi/grails-app/conf/package-frame.html new file mode 100644 index 0000000..0275eb6 --- /dev/null +++ b/docs/gapi/grails-app/conf/package-frame.html @@ -0,0 +1,37 @@ + + + + +grails-app.conf + + + + + + + + + + + +grails-app.conf + + + + + + + + +
+Classes  +
BuildConfig
Config
DataSource
UrlMappings
+ + + + + + + + + diff --git a/docs/gapi/grails-app/conf/package-summary.html b/docs/gapi/grails-app/conf/package-summary.html new file mode 100644 index 0000000..f28bf14 --- /dev/null +++ b/docs/gapi/grails-app/conf/package-summary.html @@ -0,0 +1,132 @@ + + + + +grails-app.conf (grails-rendering) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package grails-app.conf +

+ + + +

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Class Summary
BuildConfig
Config
DataSource
UrlMappings
+  +

+

+
+
+ + + + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/grails-app/controllers/PdfTestController.html b/docs/gapi/grails-app/controllers/PdfTestController.html new file mode 100644 index 0000000..bbcc5b6 --- /dev/null +++ b/docs/gapi/grails-app/controllers/PdfTestController.html @@ -0,0 +1,257 @@ + + + + + + + + + +PdfTestController (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +grails-app.controllers +
+Class PdfTestController

+
java.lang.Object
+  grails-app.controllers.PdfTestController
+

+
class PdfTestController
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ def + doit +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ PdfTestController() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
wait, wait, wait, hashCode, getClass, equals, toString, notify, notifyAll
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

doit

+
def doit
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ PdfTestController

+
PdfTestController()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails-app/controllers/RenderingController.html b/docs/gapi/grails-app/controllers/RenderingController.html new file mode 100644 index 0000000..c09c55d --- /dev/null +++ b/docs/gapi/grails-app/controllers/RenderingController.html @@ -0,0 +1,366 @@ + + + + + + + + + +RenderingController (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +grails-app.controllers +
+Class RenderingController

+
java.lang.Object
+  grails-app.controllers.RenderingController
+

+
class RenderingController
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ def + gif +
+

+
+ def + jpeg +
+

+
+ def + pdf +
+

+
+ def + png +
+

+
+ def + relative +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderingController() +
+

+
+   + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected def + + getTemplate() +
+

+
+   + + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

gif

+
def gif
+
+
+
+

+

+
+ +

jpeg

+
def jpeg
+
+
+
+

+

+
+ +

pdf

+
def pdf
+
+
+
+

+

+
+ +

png

+
def png
+
+
+
+

+

+
+ +

relative

+
def relative
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderingController

+
RenderingController()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ getTemplate

+
protected def getTemplate()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails-app/controllers/package-frame.html b/docs/gapi/grails-app/controllers/package-frame.html new file mode 100644 index 0000000..4260c44 --- /dev/null +++ b/docs/gapi/grails-app/controllers/package-frame.html @@ -0,0 +1,37 @@ + + + + +grails-app.controllers + + + + + + + + + + + +grails-app.controllers + + + + + + + + +
+Classes  +
RenderingController
+ + + + + + + + + diff --git a/docs/gapi/grails-app/controllers/package-summary.html b/docs/gapi/grails-app/controllers/package-summary.html new file mode 100644 index 0000000..b1ac9c4 --- /dev/null +++ b/docs/gapi/grails-app/controllers/package-summary.html @@ -0,0 +1,114 @@ + + + + +grails-app.controllers (grails-rendering) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package grails-app.controllers +

+ + + +

 

+ + + + + + + + + + + + + + + +
+ Class Summary
RenderingController
+  +

+

+
+
+ + + + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/grails-app/services/grails/plugin/pdf/PdfRenderingService.html b/docs/gapi/grails-app/services/grails/plugin/pdf/PdfRenderingService.html new file mode 100644 index 0000000..0f50fcb --- /dev/null +++ b/docs/gapi/grails-app/services/grails/plugin/pdf/PdfRenderingService.html @@ -0,0 +1,414 @@ + + + + + + + + + +PdfRenderingService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +grails-app.services.grails.plugin.pdf +
+Class PdfRenderingService

+
java.lang.Object
+  grails-app.services.grails.plugin.pdf.PdfRenderingService
+

+
class PdfRenderingService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ def + groovyPagesTemplateEngine +
+

+
+ static def + transactional +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ PdfRenderingService() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected def + + assertTemplateArgumentProvided(java.util.Map args) +
+

+
+ protected def + + createTemplate(def args) +
+

+
+ java.io.OutputStream + + render(java.util.Map args, java.io.OutputStream outputStream = new ByteArrayOutputStream() +
+

+
+ java.io.OutputStream + + render(java.util.Map args, HttpServletResponse response) +
+

+
+ protected def + + resolveGspTemplateResource(java.util.Map args) +
+

+
+ protected def + + throwUnknownTemplateError(java.util.Map args) +
+

+
+   + + + +
+ Methods inherited from class java.lang.Object +
wait, wait, wait, hashCode, getClass, equals, toString, notify, notifyAll
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

groovyPagesTemplateEngine

+
def groovyPagesTemplateEngine
+
+
+
+

+

+
+ +

transactional

+
static def transactional
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ PdfRenderingService

+
PdfRenderingService()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ assertTemplateArgumentProvided

+
protected def assertTemplateArgumentProvided(java.util.Map args)
+
+
+
+

+

+
+ +

+ createTemplate

+
protected def createTemplate(def args)
+
+
+
+

+

+
+ +

+ render

+
java.io.OutputStream render(java.util.Map args, java.io.OutputStream outputStream = new ByteArrayOutputStream()
+
+
+
+

+

+
+ +

+ render

+
java.io.OutputStream render(java.util.Map args, HttpServletResponse response)
+
+
+
+

+

+
+ +

+ resolveGspTemplateResource

+
protected def resolveGspTemplateResource(java.util.Map args)
+
+
+
+

+

+
+ +

+ throwUnknownTemplateError

+
protected def throwUnknownTemplateError(java.util.Map args)
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails-app/services/grails/plugin/pdf/package-frame.html b/docs/gapi/grails-app/services/grails/plugin/pdf/package-frame.html new file mode 100644 index 0000000..2bf63a5 --- /dev/null +++ b/docs/gapi/grails-app/services/grails/plugin/pdf/package-frame.html @@ -0,0 +1,37 @@ + + + + +grails-app.services.grails.plugin.pdf + + + + + + + + + + + +grails-app.services.grails.plugin.pdf + + + + + + + + +
+Classes  +
PdfRenderingService
+ + + + + + + + + diff --git a/docs/gapi/grails-app/services/grails/plugin/pdf/package-summary.html b/docs/gapi/grails-app/services/grails/plugin/pdf/package-summary.html new file mode 100644 index 0000000..f99fef4 --- /dev/null +++ b/docs/gapi/grails-app/services/grails/plugin/pdf/package-summary.html @@ -0,0 +1,114 @@ + + + + +grails-app.services.grails.plugin.pdf (pdf) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package grails-app.services.grails.plugin.pdf +

+ + + +

 

+ + + + + + + + + + + + + + + +
+ Class Summary
PdfRenderingService
+  +

+

+
+
+ + + + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/grails-app/services/grails/plugin/rendering/RenderingService.html b/docs/gapi/grails-app/services/grails/plugin/rendering/RenderingService.html new file mode 100644 index 0000000..5f6f473 --- /dev/null +++ b/docs/gapi/grails-app/services/grails/plugin/rendering/RenderingService.html @@ -0,0 +1,559 @@ + + + + + + + + + +RenderingService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +grails-app.services.grails.plugin.rendering +
+Class RenderingService

+
java.lang.Object
+  grails-app.services.grails.plugin.rendering.RenderingService
+

+
class RenderingService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ def + grailsApplication +
+

+
+ static def + transactional +
+

+
+ def + xhtmlDocumentService +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderingService() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected def + + configureResponse(java.util.Map args, javax.servlet.http.HttpServletResponse response) +
+

+
+ protected def + + doRender(java.util.Map args, org.w3c.dom.Document document, java.io.OutputStream outputStream) +
+

+
+ protected def + + getDefaultContentType() +
+

+
+ protected def + + processArgs(java.util.Map args) +
+

+
+ java.io.OutputStream + + render(java.util.Map args, java.io.OutputStream outputStream = new ByteArrayOutputStream() +
+

+
+ java.io.OutputStream + + render(java.util.Map args, org.w3c.dom.Document document, java.io.OutputStream outputStream = new ByteArrayOutputStream() +
+

+
+ boolean + + render(java.util.Map args, javax.servlet.http.HttpServletResponse response) +
+

+
+ protected def + + setContentDisposition(java.util.Map args, javax.servlet.http.HttpServletResponse response) +
+

+
+ protected def + + setContentType(java.util.Map args, javax.servlet.http.HttpServletResponse response) +
+

+
+ protected def + + setResponseHeaders(java.util.Map args, javax.servlet.http.HttpServletResponse response) +
+

+
+ protected def + + writeToResponse(java.util.Map args, javax.servlet.http.HttpServletResponse response, java.io.InputStream input) +
+

+
+ protected def + + writeToResponse(java.util.Map args, javax.servlet.http.HttpServletResponse response, byte[] bytes) +
+

+
+   + + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

grailsApplication

+
def grailsApplication
+
+
+
+

+

+
+ +

transactional

+
static def transactional
+
+
+
+

+

+
+ +

xhtmlDocumentService

+
def xhtmlDocumentService
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderingService

+
RenderingService()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ configureResponse

+
protected def configureResponse(java.util.Map args, javax.servlet.http.HttpServletResponse response)
+
+
+
+

+

+
+ +

+ doRender

+
protected def doRender(java.util.Map args, org.w3c.dom.Document document, java.io.OutputStream outputStream)
+
+
+
+

+

+
+ +

+ getDefaultContentType

+
protected def getDefaultContentType()
+
+
+
+

+

+
+ +

+ processArgs

+
protected def processArgs(java.util.Map args)
+
+
+
+

+

+
+ +

+ render

+
java.io.OutputStream render(java.util.Map args, java.io.OutputStream outputStream = new ByteArrayOutputStream()
+
+
+
+

+

+
+ +

+ render

+
java.io.OutputStream render(java.util.Map args, org.w3c.dom.Document document, java.io.OutputStream outputStream = new ByteArrayOutputStream()
+
+
+
+

+

+
+ +

+ render

+
boolean render(java.util.Map args, javax.servlet.http.HttpServletResponse response)
+
+
+
+

+

+
+ +

+ setContentDisposition

+
protected def setContentDisposition(java.util.Map args, javax.servlet.http.HttpServletResponse response)
+
+
+
+

+

+
+ +

+ setContentType

+
protected def setContentType(java.util.Map args, javax.servlet.http.HttpServletResponse response)
+
+
+
+

+

+
+ +

+ setResponseHeaders

+
protected def setResponseHeaders(java.util.Map args, javax.servlet.http.HttpServletResponse response)
+
+
+
+

+

+
+ +

+ writeToResponse

+
protected def writeToResponse(java.util.Map args, javax.servlet.http.HttpServletResponse response, java.io.InputStream input)
+
+
+
+

+

+
+ +

+ writeToResponse

+
protected def writeToResponse(java.util.Map args, javax.servlet.http.HttpServletResponse response, byte[] bytes)
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails-app/services/grails/plugin/rendering/document/XhtmlDocumentService.html b/docs/gapi/grails-app/services/grails/plugin/rendering/document/XhtmlDocumentService.html new file mode 100644 index 0000000..d66c7d8 --- /dev/null +++ b/docs/gapi/grails-app/services/grails/plugin/rendering/document/XhtmlDocumentService.html @@ -0,0 +1,433 @@ + + + + + + + + + +XhtmlDocumentService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +grails-app.services.grails.plugin.rendering.document +
+Class XhtmlDocumentService

+
java.lang.Object
+  grails-app.services.grails.plugin.rendering.document.XhtmlDocumentService
+

+
class XhtmlDocumentService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ def + groovyPagesTemplateEngine +
+

+
+ def + groovyPagesUriService +
+

+
+ static def + transactional +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ XhtmlDocumentService() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ org.w3c.dom.Document + + createDocument(java.util.Map args) +
+

+
+ protected def + + createDocument(java.lang.String xhtml) +
+

+
+ protected def + + createDocument(org.xml.sax.InputSource xhtml) +
+

+
+ protected def + + createTemplate(java.util.Map args) +
+

+
+ protected def + + generateXhtml(java.util.Map args) +
+

+
+ protected def + + getContextPath(def args) +
+

+
+   + + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

groovyPagesTemplateEngine

+
def groovyPagesTemplateEngine
+
+
+
+

+

+
+ +

groovyPagesUriService

+
def groovyPagesUriService
+
+
+
+

+

+
+ +

transactional

+
static def transactional
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ XhtmlDocumentService

+
XhtmlDocumentService()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ createDocument

+
org.w3c.dom.Document createDocument(java.util.Map args)
+
+
+
+

+

+
+ +

+ createDocument

+
protected def createDocument(java.lang.String xhtml)
+
+
+
+

+

+
+ +

+ createDocument

+
protected def createDocument(org.xml.sax.InputSource xhtml)
+
+
+
+

+

+
+ +

+ createTemplate

+
protected def createTemplate(java.util.Map args)
+
+
+
+

+

+
+ +

+ generateXhtml

+
protected def generateXhtml(java.util.Map args)
+
+
+
+

+

+
+ +

+ getContextPath

+
protected def getContextPath(def args)
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails-app/services/grails/plugin/rendering/document/package-frame.html b/docs/gapi/grails-app/services/grails/plugin/rendering/document/package-frame.html new file mode 100644 index 0000000..e1b1f9d --- /dev/null +++ b/docs/gapi/grails-app/services/grails/plugin/rendering/document/package-frame.html @@ -0,0 +1,37 @@ + + + + +grails-app.services.grails.plugin.rendering.document + + + + + + + + + + + +grails-app.services.grails.plugin.rendering.document + + + + + + + + +
+Classes  +
XhtmlDocumentService
+ + + + + + + + + diff --git a/docs/gapi/grails-app/services/grails/plugin/rendering/document/package-summary.html b/docs/gapi/grails-app/services/grails/plugin/rendering/document/package-summary.html new file mode 100644 index 0000000..ed9ab06 --- /dev/null +++ b/docs/gapi/grails-app/services/grails/plugin/rendering/document/package-summary.html @@ -0,0 +1,114 @@ + + + + +grails-app.services.grails.plugin.rendering.document (grails-rendering) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package grails-app.services.grails.plugin.rendering.document +

+ + + +

 

+ + + + + + + + + + + + + + + +
+ Class Summary
XhtmlDocumentService
+  +

+

+
+
+ + + + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/grails-app/services/grails/plugin/rendering/image/GifRenderingService.html b/docs/gapi/grails-app/services/grails/plugin/rendering/image/GifRenderingService.html new file mode 100644 index 0000000..2750e7b --- /dev/null +++ b/docs/gapi/grails-app/services/grails/plugin/rendering/image/GifRenderingService.html @@ -0,0 +1,277 @@ + + + + + + + + + +GifRenderingService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +grails-app.services.grails.plugin.rendering.image +
+Class GifRenderingService

+
java.lang.Object
+  grails.plugin.rendering.RenderingService
+      grails-app.services.grails.plugin.rendering.image.ImageRenderingService
+          grails-app.services.grails.plugin.rendering.image.GifRenderingService
+

+
class GifRenderingService
+extends ImageRenderingService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ GifRenderingService() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected def + + getDefaultContentType() +
+

+
+ protected def + + getImageType() +
+

+
+   + + + +
+ Methods inherited from class ImageRenderingService +
convert, createBufferedImage, doRender, doScaleTransform, getImageType, resize, resize, scale, scale
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ GifRenderingService

+
GifRenderingService()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ getDefaultContentType

+
protected def getDefaultContentType()
+
+
+
+

+

+
+ +

+ getImageType

+
protected def getImageType()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails-app/services/grails/plugin/rendering/image/ImageRenderingService.html b/docs/gapi/grails-app/services/grails/plugin/rendering/image/ImageRenderingService.html new file mode 100644 index 0000000..40d81e5 --- /dev/null +++ b/docs/gapi/grails-app/services/grails/plugin/rendering/image/ImageRenderingService.html @@ -0,0 +1,473 @@ + + + + + + + + + +ImageRenderingService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +grails-app.services.grails.plugin.rendering.image +
+Class ImageRenderingService

+
java.lang.Object
+  grails.plugin.rendering.RenderingService
+      grails-app.services.grails.plugin.rendering.image.ImageRenderingService
+

+
class ImageRenderingService
+extends RenderingService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ static def + DEFAULT_BUFFERED_IMAGE_TYPE +
+

+
+ static def + transactional +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ ImageRenderingService() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected def + + convert(java.util.Map args, java.awt.image.BufferedImage image, java.io.OutputStream outputStream) +
+

+
+ protected java.awt.image.BufferedImage + + createBufferedImage(java.util.Map args, org.w3c.dom.Document document) +
+

+
+ protected def + + doRender(java.util.Map args, org.w3c.dom.Document document, java.io.OutputStream outputStream) +
+

+
+ protected def + + doScaleTransform(def image, def width, def height, def widthScale, def heightScale, def bufferedImageType) +
+

+
+ protected def + + getImageType() +
+

+
+ protected def + + resize(def image, java.util.Map resizeArgs, def bufferedImageType) +
+

+
+ protected def + + resize(def image, def width, def height, def bufferedImageType) +
+

+
+ protected def + + scale(def image, java.util.Map scaleArgs, def bufferedImageType) +
+

+
+ protected def + + scale(def image, def widthScale, def heightScale, def bufferedImageType) +
+

+
+   + + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

DEFAULT_BUFFERED_IMAGE_TYPE

+
static def DEFAULT_BUFFERED_IMAGE_TYPE
+
+
+
+

+

+
+ +

transactional

+
static def transactional
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ ImageRenderingService

+
ImageRenderingService()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ convert

+
protected def convert(java.util.Map args, java.awt.image.BufferedImage image, java.io.OutputStream outputStream)
+
+
+
+

+

+
+ +

+ createBufferedImage

+
protected java.awt.image.BufferedImage createBufferedImage(java.util.Map args, org.w3c.dom.Document document)
+
+
+
+

+

+
+ +

+ doRender

+
protected def doRender(java.util.Map args, org.w3c.dom.Document document, java.io.OutputStream outputStream)
+
+
+
+

+

+
+ +

+ doScaleTransform

+
protected def doScaleTransform(def image, def width, def height, def widthScale, def heightScale, def bufferedImageType)
+
+
+
+

+

+
+ +

+ getImageType

+
protected def getImageType()
+
+
+
+

+

+
+ +

+ resize

+
protected def resize(def image, java.util.Map resizeArgs, def bufferedImageType)
+
+
+
+

+

+
+ +

+ resize

+
protected def resize(def image, def width, def height, def bufferedImageType)
+
+
+
+

+

+
+ +

+ scale

+
protected def scale(def image, java.util.Map scaleArgs, def bufferedImageType)
+
+
+
+

+

+
+ +

+ scale

+
protected def scale(def image, def widthScale, def heightScale, def bufferedImageType)
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails-app/services/grails/plugin/rendering/image/JpegRenderingService.html b/docs/gapi/grails-app/services/grails/plugin/rendering/image/JpegRenderingService.html new file mode 100644 index 0000000..c8da351 --- /dev/null +++ b/docs/gapi/grails-app/services/grails/plugin/rendering/image/JpegRenderingService.html @@ -0,0 +1,277 @@ + + + + + + + + + +JpegRenderingService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +grails-app.services.grails.plugin.rendering.image +
+Class JpegRenderingService

+
java.lang.Object
+  grails.plugin.rendering.RenderingService
+      grails-app.services.grails.plugin.rendering.image.ImageRenderingService
+          grails-app.services.grails.plugin.rendering.image.JpegRenderingService
+

+
class JpegRenderingService
+extends ImageRenderingService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ JpegRenderingService() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected def + + getDefaultContentType() +
+

+
+ protected def + + getImageType() +
+

+
+   + + + +
+ Methods inherited from class ImageRenderingService +
convert, createBufferedImage, doRender, doScaleTransform, getImageType, resize, resize, scale, scale
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ JpegRenderingService

+
JpegRenderingService()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ getDefaultContentType

+
protected def getDefaultContentType()
+
+
+
+

+

+
+ +

+ getImageType

+
protected def getImageType()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails-app/services/grails/plugin/rendering/image/PngRenderingService.html b/docs/gapi/grails-app/services/grails/plugin/rendering/image/PngRenderingService.html new file mode 100644 index 0000000..118f567 --- /dev/null +++ b/docs/gapi/grails-app/services/grails/plugin/rendering/image/PngRenderingService.html @@ -0,0 +1,277 @@ + + + + + + + + + +PngRenderingService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +grails-app.services.grails.plugin.rendering.image +
+Class PngRenderingService

+
java.lang.Object
+  grails.plugin.rendering.RenderingService
+      grails-app.services.grails.plugin.rendering.image.ImageRenderingService
+          grails-app.services.grails.plugin.rendering.image.PngRenderingService
+

+
class PngRenderingService
+extends ImageRenderingService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ PngRenderingService() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected def + + getDefaultContentType() +
+

+
+ protected def + + getImageType() +
+

+
+   + + + +
+ Methods inherited from class ImageRenderingService +
convert, createBufferedImage, doRender, doScaleTransform, getImageType, resize, resize, scale, scale
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ PngRenderingService

+
PngRenderingService()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ getDefaultContentType

+
protected def getDefaultContentType()
+
+
+
+

+

+
+ +

+ getImageType

+
protected def getImageType()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails-app/services/grails/plugin/rendering/image/package-frame.html b/docs/gapi/grails-app/services/grails/plugin/rendering/image/package-frame.html new file mode 100644 index 0000000..d6a803f --- /dev/null +++ b/docs/gapi/grails-app/services/grails/plugin/rendering/image/package-frame.html @@ -0,0 +1,37 @@ + + + + +grails-app.services.grails.plugin.rendering.image + + + + + + + + + + + +grails-app.services.grails.plugin.rendering.image + + + + + + + + +
+Classes  +
GifRenderingService
ImageRenderingService
JpegRenderingService
PngRenderingService
+ + + + + + + + + diff --git a/docs/gapi/grails-app/services/grails/plugin/rendering/image/package-summary.html b/docs/gapi/grails-app/services/grails/plugin/rendering/image/package-summary.html new file mode 100644 index 0000000..7ebf3e7 --- /dev/null +++ b/docs/gapi/grails-app/services/grails/plugin/rendering/image/package-summary.html @@ -0,0 +1,132 @@ + + + + +grails-app.services.grails.plugin.rendering.image (grails-rendering) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package grails-app.services.grails.plugin.rendering.image +

+ + + +

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Class Summary
GifRenderingService
ImageRenderingService
JpegRenderingService
PngRenderingService
+  +

+

+
+
+ + + + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/grails-app/services/grails/plugin/rendering/package-frame.html b/docs/gapi/grails-app/services/grails/plugin/rendering/package-frame.html new file mode 100644 index 0000000..bb8a627 --- /dev/null +++ b/docs/gapi/grails-app/services/grails/plugin/rendering/package-frame.html @@ -0,0 +1,37 @@ + + + + +grails-app.services.grails.plugin.rendering + + + + + + + + + + + +grails-app.services.grails.plugin.rendering + + + + + + + + +
+Classes  +
RenderingService
+ + + + + + + + + diff --git a/docs/gapi/grails-app/services/grails/plugin/rendering/package-summary.html b/docs/gapi/grails-app/services/grails/plugin/rendering/package-summary.html new file mode 100644 index 0000000..64e07d7 --- /dev/null +++ b/docs/gapi/grails-app/services/grails/plugin/rendering/package-summary.html @@ -0,0 +1,114 @@ + + + + +grails-app.services.grails.plugin.rendering (grails-rendering) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package grails-app.services.grails.plugin.rendering +

+ + + +

 

+ + + + + + + + + + + + + + + +
+ Class Summary
RenderingService
+  +

+

+
+
+ + + + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/grails-app/services/grails/plugin/rendering/pdf/PdfRenderingService.html b/docs/gapi/grails-app/services/grails/plugin/rendering/pdf/PdfRenderingService.html new file mode 100644 index 0000000..feacee0 --- /dev/null +++ b/docs/gapi/grails-app/services/grails/plugin/rendering/pdf/PdfRenderingService.html @@ -0,0 +1,307 @@ + + + + + + + + + +PdfRenderingService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +grails-app.services.grails.plugin.rendering.pdf +
+Class PdfRenderingService

+
java.lang.Object
+  grails.plugin.rendering.RenderingService
+      grails-app.services.grails.plugin.rendering.pdf.PdfRenderingService
+

+
class PdfRenderingService
+extends RenderingService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ static def + transactional +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ PdfRenderingService() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected def + + doRender(java.util.Map args, org.w3c.dom.Document document, java.io.OutputStream outputStream) +
+

+
+ protected def + + getDefaultContentType() +
+

+
+   + + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

transactional

+
static def transactional
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ PdfRenderingService

+
PdfRenderingService()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ doRender

+
protected def doRender(java.util.Map args, org.w3c.dom.Document document, java.io.OutputStream outputStream)
+
+
+
+

+

+
+ +

+ getDefaultContentType

+
protected def getDefaultContentType()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails-app/services/grails/plugin/rendering/pdf/package-frame.html b/docs/gapi/grails-app/services/grails/plugin/rendering/pdf/package-frame.html new file mode 100644 index 0000000..53f3ad1 --- /dev/null +++ b/docs/gapi/grails-app/services/grails/plugin/rendering/pdf/package-frame.html @@ -0,0 +1,37 @@ + + + + +grails-app.services.grails.plugin.rendering.pdf + + + + + + + + + + + +grails-app.services.grails.plugin.rendering.pdf + + + + + + + + +
+Classes  +
PdfRenderingService
+ + + + + + + + + diff --git a/docs/gapi/grails-app/services/grails/plugin/rendering/pdf/package-summary.html b/docs/gapi/grails-app/services/grails/plugin/rendering/pdf/package-summary.html new file mode 100644 index 0000000..460c230 --- /dev/null +++ b/docs/gapi/grails-app/services/grails/plugin/rendering/pdf/package-summary.html @@ -0,0 +1,114 @@ + + + + +grails-app.services.grails.plugin.rendering.pdf (grails-rendering) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package grails-app.services.grails.plugin.rendering.pdf +

+ + + +

 

+ + + + + + + + + + + + + + + +
+ Class Summary
PdfRenderingService
+  +

+

+
+
+ + + + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/grails-app/services/grails/plugin/rendering/test/BackgroundRenderingService.html b/docs/gapi/grails-app/services/grails/plugin/rendering/test/BackgroundRenderingService.html new file mode 100644 index 0000000..fdac6d5 --- /dev/null +++ b/docs/gapi/grails-app/services/grails/plugin/rendering/test/BackgroundRenderingService.html @@ -0,0 +1,311 @@ + + + + + + + + + +BackgroundRenderingService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +grails-app.services.grails.plugin.rendering.test +
+Class BackgroundRenderingService

+
java.lang.Object
+  grails-app.services.grails.plugin.rendering.test.BackgroundRenderingService
+

+
class BackgroundRenderingService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ def + pdfRenderingService +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ BackgroundRenderingService() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ def + + fireEvent(def errorHolder) +
+

+
+ void + + onApplicationEvent(RenderEvent event) +
+

+
+   + + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

pdfRenderingService

+
def pdfRenderingService
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ BackgroundRenderingService

+
BackgroundRenderingService()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ fireEvent

+
public def fireEvent(def errorHolder)
+
+
+
+

+

+
+ +

+ onApplicationEvent

+
void onApplicationEvent(RenderEvent event)
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails-app/services/grails/plugin/rendering/test/RenderEvent.html b/docs/gapi/grails-app/services/grails/plugin/rendering/test/RenderEvent.html new file mode 100644 index 0000000..ce85a73 --- /dev/null +++ b/docs/gapi/grails-app/services/grails/plugin/rendering/test/RenderEvent.html @@ -0,0 +1,235 @@ + + + + + + + + + +RenderEvent (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +grails-app.services.grails.plugin.rendering.test +
+Class RenderEvent

+
java.lang.Object
+  java.util.EventObject
+      org.springframework.context.ApplicationEvent
+          grails-app.services.grails.plugin.rendering.test.RenderEvent
+

+
class RenderEvent
+extends org.springframework.context.ApplicationEvent
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderEvent(def renderError) +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class org.springframework.context.ApplicationEvent +
org.springframework.context.ApplicationEvent#getTimestamp(), org.springframework.context.ApplicationEvent#toString(), org.springframework.context.ApplicationEvent#getSource(), org.springframework.context.ApplicationEvent#wait(), org.springframework.context.ApplicationEvent#wait(long), org.springframework.context.ApplicationEvent#wait(long, int), org.springframework.context.ApplicationEvent#equals(java.lang.Object), org.springframework.context.ApplicationEvent#hashCode(), org.springframework.context.ApplicationEvent#getClass(), org.springframework.context.ApplicationEvent#notify(), org.springframework.context.ApplicationEvent#notifyAll()
+   + + +
+ Methods inherited from class java.util.EventObject +
java.util.EventObject#toString(), java.util.EventObject#getSource(), java.util.EventObject#wait(), java.util.EventObject#wait(long), java.util.EventObject#wait(long, int), java.util.EventObject#equals(java.lang.Object), java.util.EventObject#hashCode(), java.util.EventObject#getClass(), java.util.EventObject#notify(), java.util.EventObject#notifyAll()
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderEvent

+
public RenderEvent(def renderError)
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails-app/services/grails/plugin/rendering/test/package-frame.html b/docs/gapi/grails-app/services/grails/plugin/rendering/test/package-frame.html new file mode 100644 index 0000000..9e4e4e3 --- /dev/null +++ b/docs/gapi/grails-app/services/grails/plugin/rendering/test/package-frame.html @@ -0,0 +1,37 @@ + + + + +grails-app.services.grails.plugin.rendering.test + + + + + + + + + + + +grails-app.services.grails.plugin.rendering.test + + + + + + + + +
+Classes  +
BackgroundRenderingService
RenderEvent
+ + + + + + + + + diff --git a/docs/gapi/grails-app/services/grails/plugin/rendering/test/package-summary.html b/docs/gapi/grails-app/services/grails/plugin/rendering/test/package-summary.html new file mode 100644 index 0000000..05e68dd --- /dev/null +++ b/docs/gapi/grails-app/services/grails/plugin/rendering/test/package-summary.html @@ -0,0 +1,120 @@ + + + + +grails-app.services.grails.plugin.rendering.test (grails-rendering) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package grails-app.services.grails.plugin.rendering.test +

+ + + +

 

+ + + + + + + + + + + + + + + + + + + + + +
+ Class Summary
BackgroundRenderingService
RenderEvent
+  +

+

+
+
+ + + + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/grails/plugin/rendering/BackgroundRenderingSpec.html b/docs/gapi/grails/plugin/rendering/BackgroundRenderingSpec.html new file mode 100644 index 0000000..356629f --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/BackgroundRenderingSpec.html @@ -0,0 +1,218 @@ + + + + + + + + + +BackgroundRenderingSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class BackgroundRenderingSpec

+
java.lang.Object
+  grails.plugin.rendering.BackgroundRenderingSpec
+

+
class BackgroundRenderingSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ BackgroundRenderingSpec() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ BackgroundRenderingSpec

+
BackgroundRenderingSpec()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/ControllerRelativeTemplateSpec.html b/docs/gapi/grails/plugin/rendering/ControllerRelativeTemplateSpec.html new file mode 100644 index 0000000..fea567c --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/ControllerRelativeTemplateSpec.html @@ -0,0 +1,218 @@ + + + + + + + + + +ControllerRelativeTemplateSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class ControllerRelativeTemplateSpec

+
java.lang.Object
+  grails.plugin.rendering.ControllerRelativeTemplateSpec
+

+
class ControllerRelativeTemplateSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ ControllerRelativeTemplateSpec() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ ControllerRelativeTemplateSpec

+
ControllerRelativeTemplateSpec()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/GrailsRenderingException.html b/docs/gapi/grails/plugin/rendering/GrailsRenderingException.html new file mode 100644 index 0000000..b762d88 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/GrailsRenderingException.html @@ -0,0 +1,222 @@ + + + + + + + + + +GrailsRenderingException (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering +
+ +[Groovy] Class GrailsRenderingException

+
java.lang.Object
+  grails.plugin.rendering.GrailsRenderingException
+

+
class GrailsRenderingException
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ GrailsRenderingException() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ GrailsRenderingException

+
GrailsRenderingException()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/RenderingException.html b/docs/gapi/grails/plugin/rendering/RenderingException.html new file mode 100644 index 0000000..5221ea7 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/RenderingException.html @@ -0,0 +1,222 @@ + + + + + + + + + +RenderingException (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering +
+ +[Groovy] Class RenderingException

+
java.lang.Object
+  grails.plugin.rendering.RenderingException
+

+
class RenderingException
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderingException() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderingException

+
RenderingException()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/RenderingGrailsPluginSpec.html b/docs/gapi/grails/plugin/rendering/RenderingGrailsPluginSpec.html new file mode 100644 index 0000000..de80773 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/RenderingGrailsPluginSpec.html @@ -0,0 +1,222 @@ + + + + + + + + + +RenderingGrailsPluginSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering +
+ +[Groovy] Class RenderingGrailsPluginSpec

+
java.lang.Object
+  grails.plugin.rendering.RenderingGrailsPluginSpec
+

+
class RenderingGrailsPluginSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderingGrailsPluginSpec() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderingGrailsPluginSpec

+
RenderingGrailsPluginSpec()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/RenderingService.html b/docs/gapi/grails/plugin/rendering/RenderingService.html new file mode 100644 index 0000000..6c76e44 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/RenderingService.html @@ -0,0 +1,218 @@ + + + + + + + + + +RenderingService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class RenderingService

+
java.lang.Object
+  grails.plugin.rendering.RenderingService
+

+
class RenderingService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderingService() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderingService

+
RenderingService()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/RenderingServiceSpec.html b/docs/gapi/grails/plugin/rendering/RenderingServiceSpec.html new file mode 100644 index 0000000..eb8cc71 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/RenderingServiceSpec.html @@ -0,0 +1,218 @@ + + + + + + + + + +RenderingServiceSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class RenderingServiceSpec

+
java.lang.Object
+  grails.plugin.rendering.RenderingServiceSpec
+

+
class RenderingServiceSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderingServiceSpec() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderingServiceSpec

+
RenderingServiceSpec()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/RenderingTagLib.html b/docs/gapi/grails/plugin/rendering/RenderingTagLib.html new file mode 100644 index 0000000..7438997 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/RenderingTagLib.html @@ -0,0 +1,218 @@ + + + + + + + + + +RenderingTagLib (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class RenderingTagLib

+
java.lang.Object
+  grails.plugin.rendering.RenderingTagLib
+

+
class RenderingTagLib
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderingTagLib() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderingTagLib

+
RenderingTagLib()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/RenderingTagLibSpec.html b/docs/gapi/grails/plugin/rendering/RenderingTagLibSpec.html new file mode 100644 index 0000000..b5b6b94 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/RenderingTagLibSpec.html @@ -0,0 +1,222 @@ + + + + + + + + + +RenderingTagLibSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering +
+ +[Groovy] Class RenderingTagLibSpec

+
java.lang.Object
+  grails.plugin.rendering.RenderingTagLibSpec
+

+
class RenderingTagLibSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderingTagLibSpec() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderingTagLibSpec

+
RenderingTagLibSpec()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/datauri/DataUri.html b/docs/gapi/grails/plugin/rendering/datauri/DataUri.html new file mode 100644 index 0000000..9840645 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/datauri/DataUri.html @@ -0,0 +1,222 @@ + + + + + + + + + +DataUri (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering.datauri +
+ +[Groovy] Class DataUri

+
java.lang.Object
+  grails.plugin.rendering.datauri.DataUri
+

+
class DataUri
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ DataUri() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ DataUri

+
DataUri()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/datauri/DataUriAwareITextUserAgent.html b/docs/gapi/grails/plugin/rendering/datauri/DataUriAwareITextUserAgent.html new file mode 100644 index 0000000..49f671b --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/datauri/DataUriAwareITextUserAgent.html @@ -0,0 +1,222 @@ + + + + + + + + + +DataUriAwareITextUserAgent (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering.datauri +
+ +[Groovy] Class DataUriAwareITextUserAgent

+
java.lang.Object
+  grails.plugin.rendering.datauri.DataUriAwareITextUserAgent
+

+
class DataUriAwareITextUserAgent
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ DataUriAwareITextUserAgent() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ DataUriAwareITextUserAgent

+
DataUriAwareITextUserAgent()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/datauri/DataUriAwareNaiveUserAgent.html b/docs/gapi/grails/plugin/rendering/datauri/DataUriAwareNaiveUserAgent.html new file mode 100644 index 0000000..d749008 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/datauri/DataUriAwareNaiveUserAgent.html @@ -0,0 +1,222 @@ + + + + + + + + + +DataUriAwareNaiveUserAgent (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering.datauri +
+ +[Groovy] Class DataUriAwareNaiveUserAgent

+
java.lang.Object
+  grails.plugin.rendering.datauri.DataUriAwareNaiveUserAgent
+

+
class DataUriAwareNaiveUserAgent
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ DataUriAwareNaiveUserAgent() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ DataUriAwareNaiveUserAgent

+
DataUriAwareNaiveUserAgent()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/datauri/DataUriSpec.html b/docs/gapi/grails/plugin/rendering/datauri/DataUriSpec.html new file mode 100644 index 0000000..37f5418 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/datauri/DataUriSpec.html @@ -0,0 +1,222 @@ + + + + + + + + + +DataUriSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering.datauri +
+ +[Groovy] Class DataUriSpec

+
java.lang.Object
+  grails.plugin.rendering.datauri.DataUriSpec
+

+
class DataUriSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ DataUriSpec() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ DataUriSpec

+
DataUriSpec()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/datauri/package-frame.html b/docs/gapi/grails/plugin/rendering/datauri/package-frame.html new file mode 100644 index 0000000..ec778f9 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/datauri/package-frame.html @@ -0,0 +1,38 @@ + + + + +grails.plugin.rendering.datauri + + + + + + + + + + + +grails.plugin.rendering.datauri + + + + + + + + +
+Classes  +
DataUri
DataUriAwareITextUserAgent
DataUriAwareNaiveUserAgent
DataUriSpec
DataUri
DataUriAwareITextUserAgent
DataUriAwareNaiveUserAgent
DataUriSpec
+ + + + + + + + + + diff --git a/docs/gapi/grails/plugin/rendering/datauri/package-summary.html b/docs/gapi/grails/plugin/rendering/datauri/package-summary.html new file mode 100644 index 0000000..0cc8472 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/datauri/package-summary.html @@ -0,0 +1,149 @@ + + + + +grails.plugin.rendering.datauri (grails-rendering) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package grails.plugin.rendering.datauri +

+ + + +

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Class Summary
DataUri
DataUriAwareITextUserAgent
DataUriAwareNaiveUserAgent
DataUriSpec
DataUri
DataUriAwareITextUserAgent
DataUriAwareNaiveUserAgent
DataUriSpec
+  +

+

+
+
+ + + + + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/grails/plugin/rendering/document/RenderEnvironment.html b/docs/gapi/grails/plugin/rendering/document/RenderEnvironment.html new file mode 100644 index 0000000..33fce45 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/document/RenderEnvironment.html @@ -0,0 +1,218 @@ + + + + + + + + + +RenderEnvironment (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class RenderEnvironment

+
java.lang.Object
+  grails.plugin.rendering.document.RenderEnvironment
+

+
class RenderEnvironment
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderEnvironment() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderEnvironment

+
RenderEnvironment()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/document/UnknownTemplateException.html b/docs/gapi/grails/plugin/rendering/document/UnknownTemplateException.html new file mode 100644 index 0000000..e558fe0 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/document/UnknownTemplateException.html @@ -0,0 +1,222 @@ + + + + + + + + + +UnknownTemplateException (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering.document +
+ +[Groovy] Class UnknownTemplateException

+
java.lang.Object
+  grails.plugin.rendering.document.UnknownTemplateException
+

+
class UnknownTemplateException
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ UnknownTemplateException() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ UnknownTemplateException

+
UnknownTemplateException()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/document/XhtmlDocumentService.html b/docs/gapi/grails/plugin/rendering/document/XhtmlDocumentService.html new file mode 100644 index 0000000..8d44ad0 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/document/XhtmlDocumentService.html @@ -0,0 +1,218 @@ + + + + + + + + + +XhtmlDocumentService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class XhtmlDocumentService

+
java.lang.Object
+  grails.plugin.rendering.document.XhtmlDocumentService
+

+
class XhtmlDocumentService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ XhtmlDocumentService() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ XhtmlDocumentService

+
XhtmlDocumentService()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/document/XhtmlDocumentServiceSpec.html b/docs/gapi/grails/plugin/rendering/document/XhtmlDocumentServiceSpec.html new file mode 100644 index 0000000..6e23d14 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/document/XhtmlDocumentServiceSpec.html @@ -0,0 +1,222 @@ + + + + + + + + + +XhtmlDocumentServiceSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering.document +
+ +[Groovy] Class XhtmlDocumentServiceSpec

+
java.lang.Object
+  grails.plugin.rendering.document.XhtmlDocumentServiceSpec
+

+
class XhtmlDocumentServiceSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ XhtmlDocumentServiceSpec() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ XhtmlDocumentServiceSpec

+
XhtmlDocumentServiceSpec()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/document/XmlParseException.html b/docs/gapi/grails/plugin/rendering/document/XmlParseException.html new file mode 100644 index 0000000..a8d6cdb --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/document/XmlParseException.html @@ -0,0 +1,222 @@ + + + + + + + + + +XmlParseException (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering.document +
+ +[Groovy] Class XmlParseException

+
java.lang.Object
+  grails.plugin.rendering.document.XmlParseException
+

+
class XmlParseException
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ XmlParseException() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ XmlParseException

+
XmlParseException()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/document/package-frame.html b/docs/gapi/grails/plugin/rendering/document/package-frame.html new file mode 100644 index 0000000..bda9376 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/document/package-frame.html @@ -0,0 +1,38 @@ + + + + +grails.plugin.rendering.document + + + + + + + + + + + +grails.plugin.rendering.document + + + + + + + + +
+Classes  +
UnknownTemplateException
XhtmlDocumentServiceSpec
XmlParseException
UnknownTemplateException
XhtmlDocumentServiceSpec
XmlParseException
+ + + + + + + + + + diff --git a/docs/gapi/grails/plugin/rendering/document/package-summary.html b/docs/gapi/grails/plugin/rendering/document/package-summary.html new file mode 100644 index 0000000..e2c8d67 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/document/package-summary.html @@ -0,0 +1,140 @@ + + + + +grails.plugin.rendering.document (grails-rendering) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package grails.plugin.rendering.document +

+ + + +

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Class Summary
UnknownTemplateException
XhtmlDocumentServiceSpecThe xhtmlDocumentService is exercised in the rendering + service tests.
XmlParseException
UnknownTemplateException
XhtmlDocumentServiceSpec
XmlParseException
+  +

+

+
+
+ + + + + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/grails/plugin/rendering/image/GifRenderingService.html b/docs/gapi/grails/plugin/rendering/image/GifRenderingService.html new file mode 100644 index 0000000..eb39918 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/image/GifRenderingService.html @@ -0,0 +1,218 @@ + + + + + + + + + +GifRenderingService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class GifRenderingService

+
java.lang.Object
+  grails.plugin.rendering.image.GifRenderingService
+

+
class GifRenderingService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ GifRenderingService() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ GifRenderingService

+
GifRenderingService()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/image/GifRenderingServiceSpec.html b/docs/gapi/grails/plugin/rendering/image/GifRenderingServiceSpec.html new file mode 100644 index 0000000..ec538e0 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/image/GifRenderingServiceSpec.html @@ -0,0 +1,222 @@ + + + + + + + + + +GifRenderingServiceSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering.image +
+ +[Groovy] Class GifRenderingServiceSpec

+
java.lang.Object
+  grails.plugin.rendering.image.GifRenderingServiceSpec
+

+
class GifRenderingServiceSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ GifRenderingServiceSpec() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ GifRenderingServiceSpec

+
GifRenderingServiceSpec()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/image/ImageRenderingService.html b/docs/gapi/grails/plugin/rendering/image/ImageRenderingService.html new file mode 100644 index 0000000..4a051b6 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/image/ImageRenderingService.html @@ -0,0 +1,218 @@ + + + + + + + + + +ImageRenderingService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class ImageRenderingService

+
java.lang.Object
+  grails.plugin.rendering.image.ImageRenderingService
+

+
class ImageRenderingService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ ImageRenderingService() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ ImageRenderingService

+
ImageRenderingService()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/image/ImageRenderingServiceSpec.html b/docs/gapi/grails/plugin/rendering/image/ImageRenderingServiceSpec.html new file mode 100644 index 0000000..76249b6 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/image/ImageRenderingServiceSpec.html @@ -0,0 +1,222 @@ + + + + + + + + + +ImageRenderingServiceSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering.image +
+ +[Groovy] Class ImageRenderingServiceSpec

+
java.lang.Object
+  grails.plugin.rendering.image.ImageRenderingServiceSpec
+

+
class ImageRenderingServiceSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ ImageRenderingServiceSpec() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ ImageRenderingServiceSpec

+
ImageRenderingServiceSpec()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/image/JpegRenderingService.html b/docs/gapi/grails/plugin/rendering/image/JpegRenderingService.html new file mode 100644 index 0000000..a00f89e --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/image/JpegRenderingService.html @@ -0,0 +1,218 @@ + + + + + + + + + +JpegRenderingService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class JpegRenderingService

+
java.lang.Object
+  grails.plugin.rendering.image.JpegRenderingService
+

+
class JpegRenderingService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ JpegRenderingService() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ JpegRenderingService

+
JpegRenderingService()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/image/JpegRenderingServiceSpec.html b/docs/gapi/grails/plugin/rendering/image/JpegRenderingServiceSpec.html new file mode 100644 index 0000000..9a73283 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/image/JpegRenderingServiceSpec.html @@ -0,0 +1,222 @@ + + + + + + + + + +JpegRenderingServiceSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ + +grails.plugin.rendering.image +
+ +[Groovy] Class JpegRenderingServiceSpec

+
java.lang.Object
+  grails.plugin.rendering.image.JpegRenderingServiceSpec
+

+
class JpegRenderingServiceSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ JpegRenderingServiceSpec() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ JpegRenderingServiceSpec

+
JpegRenderingServiceSpec()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/image/PngRenderingService.html b/docs/gapi/grails/plugin/rendering/image/PngRenderingService.html new file mode 100644 index 0000000..39730c0 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/image/PngRenderingService.html @@ -0,0 +1,218 @@ + + + + + + + + + +PngRenderingService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class PngRenderingService

+
java.lang.Object
+  grails.plugin.rendering.image.PngRenderingService
+

+
class PngRenderingService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ PngRenderingService() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ PngRenderingService

+
PngRenderingService()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/image/PngRenderingServiceSpec.html b/docs/gapi/grails/plugin/rendering/image/PngRenderingServiceSpec.html new file mode 100644 index 0000000..649fe47 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/image/PngRenderingServiceSpec.html @@ -0,0 +1,218 @@ + + + + + + + + + +PngRenderingServiceSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class PngRenderingServiceSpec

+
java.lang.Object
+  grails.plugin.rendering.image.PngRenderingServiceSpec
+

+
class PngRenderingServiceSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ PngRenderingServiceSpec() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ PngRenderingServiceSpec

+
PngRenderingServiceSpec()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/image/package-frame.html b/docs/gapi/grails/plugin/rendering/image/package-frame.html new file mode 100644 index 0000000..918c500 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/image/package-frame.html @@ -0,0 +1,38 @@ + + + + +grails.plugin.rendering.image + + + + + + + + + + + +grails.plugin.rendering.image + + + + + + + + +
+Classes  +
GifRenderingServiceSpec
ImageRenderingServiceSpec
JpegRenderingServiceSpec
GifRenderingServiceSpec
ImageRenderingServiceSpec
JpegRenderingServiceSpec
+ + + + + + + + + + diff --git a/docs/gapi/grails/plugin/rendering/image/package-summary.html b/docs/gapi/grails/plugin/rendering/image/package-summary.html new file mode 100644 index 0000000..13d76f7 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/image/package-summary.html @@ -0,0 +1,139 @@ + + + + +grails.plugin.rendering.image (grails-rendering) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package grails.plugin.rendering.image +

+ + + +

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Class Summary
GifRenderingServiceSpec
ImageRenderingServiceSpec
JpegRenderingServiceSpec
GifRenderingServiceSpec
ImageRenderingServiceSpec
JpegRenderingServiceSpec
+  +

+

+
+
+ + + + + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/grails/plugin/rendering/package-frame.html b/docs/gapi/grails/plugin/rendering/package-frame.html new file mode 100644 index 0000000..bdcc373 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/package-frame.html @@ -0,0 +1,47 @@ + + + + +grails.plugin.rendering + + + + + + + + + + + +grails.plugin.rendering + + + + + + + + +
+Classes  +
RenderingGrailsPluginSpec
RenderingTagLibSpec
GrailsRenderingException
RenderingException
RenderingGrailsPluginSpec
RenderingTagLibSpec
+ + + + + + + + +
+Exceptions  +
GrailsRenderingException
RenderingException
+ + + + + + + + diff --git a/docs/gapi/grails/plugin/rendering/package-summary.html b/docs/gapi/grails/plugin/rendering/package-summary.html new file mode 100644 index 0000000..a7b84ae --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/package-summary.html @@ -0,0 +1,163 @@ + + + + +grails.plugin.rendering (grails-rendering) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package grails.plugin.rendering +

+ + + +

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Class Summary
RenderingGrailsPluginSpec
RenderingTagLibSpec
GrailsRenderingException
RenderingException
RenderingGrailsPluginSpec
RenderingTagLibSpec
+  +

+

+
+
+ + + + + + + + + + + + + + + + + + + +
+ Exception Summary
GrailsRenderingException
RenderingException
+  +

+

+
+
+ + + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/grails/plugin/rendering/pdf/PdfRenderingService.html b/docs/gapi/grails/plugin/rendering/pdf/PdfRenderingService.html new file mode 100644 index 0000000..29e6fe3 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/pdf/PdfRenderingService.html @@ -0,0 +1,218 @@ + + + + + + + + + +PdfRenderingService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class PdfRenderingService

+
java.lang.Object
+  grails.plugin.rendering.pdf.PdfRenderingService
+

+
class PdfRenderingService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ PdfRenderingService() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ PdfRenderingService

+
PdfRenderingService()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/pdf/PdfRenderingServiceSpec.html b/docs/gapi/grails/plugin/rendering/pdf/PdfRenderingServiceSpec.html new file mode 100644 index 0000000..f448427 --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/pdf/PdfRenderingServiceSpec.html @@ -0,0 +1,218 @@ + + + + + + + + + +PdfRenderingServiceSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class PdfRenderingServiceSpec

+
java.lang.Object
+  grails.plugin.rendering.pdf.PdfRenderingServiceSpec
+

+
class PdfRenderingServiceSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ PdfRenderingServiceSpec() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ PdfRenderingServiceSpec

+
PdfRenderingServiceSpec()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/grails/plugin/rendering/test/BackgroundRenderingService.html b/docs/gapi/grails/plugin/rendering/test/BackgroundRenderingService.html new file mode 100644 index 0000000..cd0090c --- /dev/null +++ b/docs/gapi/grails/plugin/rendering/test/BackgroundRenderingService.html @@ -0,0 +1,218 @@ + + + + + + + + + +BackgroundRenderingService (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +[Groovy] Class BackgroundRenderingService

+
java.lang.Object
+  grails.plugin.rendering.test.BackgroundRenderingService
+

+
class BackgroundRenderingService
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ BackgroundRenderingService() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ BackgroundRenderingService

+
BackgroundRenderingService()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/groovy.ico b/docs/gapi/groovy.ico new file mode 100644 index 0000000..9e9b8d8 Binary files /dev/null and b/docs/gapi/groovy.ico differ diff --git a/docs/gapi/help-doc.html b/docs/gapi/help-doc.html new file mode 100644 index 0000000..d9c87fb --- /dev/null +++ b/docs/gapi/help-doc.html @@ -0,0 +1,188 @@ + + + + + + +API Help (grails-rendering) + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + +
+
+

+How This API Document Is Organized

+
+This API (Application Programming Interface) document has pages +corresponding to the items in the navigation bar, described as follows.

+Overview

+
+ +

+The Overview +page is the front page of this API document and provides a list of all +packages with a summary for each. This page can also contain an overall +description of the set of packages.

+

+Package

+
+ +

+Each package has a page that contains a list of its classes and +interfaces, with a summary for each. This page can contain four +categories:

+
+

+Class/Interface

+
+ +

+Each class, interface, nested class and nested interface has its own +separate page. Each of these pages has three sections consisting of a +class/interface description, summary tables, and detailed member +descriptions:

+Each summary entry contains the first sentence from the detailed +description for that item. The summary entries are alphabetical, while +the detailed descriptions are in the order they appear in the source +code. This preserves the logical groupings established by the +programmer.
+ +

Annotation Type

+
+ +

+Each annotation type has its own separate page with the following sections:

+
+ +

Enum

+
+ +

+Each enum has its own separate page with the following sections:

+
+

Tree (Class Hierarchy)

+
+There is a Class Hierarchy +page for all packages, plus a hierarchy for each package. Each +hierarchy page contains a list of classes and a list of interfaces. The +classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object. +
+

Deprecated API

+
+The Deprecated API +page lists all of the parts of the API that have been deprecated. A deprecated API +is not recommended for use, generally due to improvements, and a +replacement API is usually given. Deprecated APIs may be removed in +future implementations.
+

+Index

+
+The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.
+

+Prev/Next

+These links take you to the next or previous class, interface, package, or related page.

+Frames/No Frames

+These links show and hide the HTML frames. All pages are available with or without frames. +

+

+ +

Constant Field Values

+The Constant Field Values page lists the static final fields and their values. +

+ + +This help file applies to API documentation generated using the standard doclet. + +
+


+ +

Groovy Documentation

+
+ + \ No newline at end of file diff --git a/docs/gapi/index-all.html b/docs/gapi/index-all.html new file mode 100644 index 0000000..7c1e055 --- /dev/null +++ b/docs/gapi/index-all.html @@ -0,0 +1,882 @@ + + + + + +Index (grails-rendering) + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +A + +B + +C + +D + +E + +F + +G + +H + +I + +J + +K + +L + +M + +N + +O + +P + +Q + +R + +S + +T + +U + +V + +W + +X + +Y + +Z + +_ + + + + +
+

+A

+ +
+ +
accessingControllerRelativeTemplateWorks() - Method in ControllerRelativeTemplateSpec +
+
addRenderMethods(def, def) - Method in RenderingGrailsPlugin +
+
applicationContext - Property in RenderEnvironment +
+
author - Property in PdfPluginTestGrailsPlugin +
+
author - Property in RenderingGrailsPlugin +
+
authorEmail - Property in PdfPluginTestGrailsPlugin +
+
authorEmail - Property in RenderingGrailsPlugin +
+
+ + + +
+

+B

+ +
+ +
background render() - Method in BackgroundRenderingSpec +
+
BackgroundRenderingService - Class in BackgroundRenderingService +
+
BackgroundRenderingService() - Constructor in BackgroundRenderingService +
+
backgroundRenderingService - Property in BackgroundRenderingSpec +
+
BackgroundRenderingSpec - Class in grails.plugin.rendering +
+
BackgroundRenderingSpec() - Constructor in BackgroundRenderingSpec +
+
badXmlThrowsXmlParseException() - Method in RenderingServiceSpec +
+
base64 - Field in DataUri +
+
bytes - Property in RenderingTagLibSpec +
+
+ + + +
+

+C

+ +
+ +
can handle data uris() - Method in RenderingServiceSpec +
+
charset - Field in DataUri +
+
close() - Method in RenderEnvironment +
+
configureRenderer(null) - Method in ImageRenderingService +
+
configureRenderer(null) - Method in PdfRenderingService +
+
configureResponse(null, null) - Method in RenderingService +
+
ControllerRelativeTemplateSpec - Class in grails.plugin.rendering +
+
ControllerRelativeTemplateSpec() - Constructor in ControllerRelativeTemplateSpec +
+
convert(null, null, null) - Method in ImageRenderingService +
+
createBufferedImage(null, null) - Method in ImageRenderingService +
+
createController() - Method in RenderingGrailsPluginSpec +
+
createController() - Method in RenderingServiceSpec +
+
createDocument(null) - Method in XhtmlDocumentService +
+
createMockResponse() - Method in RenderingServiceSpec +
+
createPdf(null) - Method in PdfRenderingServiceSpec +
+
createTemplate(null) - Method in XhtmlDocumentService +
+
+ + + +
+

+D

+ +
+ +
data - Field in DataUri +
+
DataUri - Class in DataUri +
+
DataUri(null) - Constructor in DataUri +
+
DataUriAwareITextUserAgent - Class in DataUriAwareITextUserAgent +
+
DataUriAwareITextUserAgent(null) - Constructor in DataUriAwareITextUserAgent +
+
DataUriAwareNaiveUserAgent - Class in grails.plugin.rendering.datauri +
+
DataUriAwareNaiveUserAgent() - Constructor in DataUriAwareNaiveUserAgent +
+
dataUriImg - Property in RenderingController +
+
dataUriPdf - Property in RenderingController +
+
DataUriSpec - Class in grails.plugin.rendering.datauri +
+
DataUriSpec() - Constructor in DataUriSpec +
+
DEFAULT_BUFFERED_IMAGE_TYPE - Property in ImageRenderingService +
+
dependsOn - Property in PdfPluginTestGrailsPlugin +
+
dependsOn - Property in RenderingGrailsPlugin +
+
description - Property in PdfPluginTestGrailsPlugin +
+
description - Property in RenderingGrailsPlugin +
+
determineParts(null) - Method in DataUri +
+
documentation - Property in PdfPluginTestGrailsPlugin +
+
documentation - Property in RenderingGrailsPlugin +
+
doRender(null, null, null) - Method in ImageRenderingService +
+
doRender(null, null, null) - Method in PdfRenderingService +
+
doRender(null, null, null) - Method in RenderingService +
+
doScaleTransform(def, def, def, def, def, def) - Method in ImageRenderingService +
+
doWithApplicationContext - Property in PdfPluginTestGrailsPlugin +
+
doWithDynamicMethods - Property in PdfPluginTestGrailsPlugin +
+
doWithDynamicMethods - Property in RenderingGrailsPlugin +
+
doWithSpring - Property in PdfPluginTestGrailsPlugin +
+
doWithWebDescriptor - Property in PdfPluginTestGrailsPlugin +
+
+ + + +
+

+E

+ +
+ +
emptyScenario() - Method in XhtmlDocumentServiceSpec +
+
encoded - Property in RenderingTagLibSpec +
+
encoding ascii octets round trip() - Method in DataUriSpec +
+
encoding base64 round trip() - Method in DataUriSpec +
+
encodingTest - Property in RenderingController +
+
extractTextLines(null) - Method in PdfRenderingServiceSpec +
+
+ + + +
+

+F

+ +
+ +
fireEvent(def) - Method in BackgroundRenderingService +
+
+ + + +
+

+G

+ +
+ +
generateXhtml(null) - Method in XhtmlDocumentService +
+
getBytes() - Method in DataUri +
+
getContextPath(def) - Method in XhtmlDocumentService +
+
getControllerName() - Method in RenderEnvironment +
+
getDataUri() - Method in RenderingTagLibSpec +
+
getDataUriTemplate() - Method in RenderingServiceSpec +
+
getDefaultBufferedImageType() - Method in ImageRenderingService +
+
getDefaultBufferedImageType() - Method in JpegRenderingService +
+
getDefaultContentType() - Method in GifRenderingService +
+
getDefaultContentType() - Method in JpegRenderingService +
+
getDefaultContentType() - Method in PdfRenderingService +
+
getDefaultContentType() - Method in PngRenderingService +
+
getDefaultContentType() - Method in RenderingService +
+
getImageResource(null) - Method in DataUriAwareITextUserAgent +
+
getImageType() - Method in GifRenderingService +
+
getImageType() - Method in ImageRenderingService +
+
getImageType() - Method in JpegRenderingService +
+
getImageType() - Method in PngRenderingService +
+
getInputStream() - Method in DataUri +
+
getOutputBytes() - Method in RenderingTagLibSpec +
+
getOutputMimeType() - Method in RenderingTagLibSpec +
+
getPluginTemplate(null) - Method in RenderingServiceSpec +
+
getRedDotBytes() - Method in DataUriSpec +
+
getRenderer() - Method in GifRenderingServiceSpec +
+
getRenderer() - Method in JpegRenderingServiceSpec +
+
getRenderer() - Method in PdfRenderingServiceSpec +
+
getRenderer() - Method in PngRenderingServiceSpec +
+
getRenderer() - Method in RenderingServiceSpec +
+
getSimpleTemplate(null) - Method in RenderingServiceSpec +
+
getSrcAttribute() - Method in RenderingTagLibSpec +
+
getTemplate() - Method in RenderingController +
+
gif tag() - Method in RenderingTagLibSpec +
+
gif - Property in RenderingController +
+
GifRenderingService - Class in GifRenderingService +
+
GifRenderingService() - Constructor in GifRenderingService +
+
gifRenderingService - Property in GifRenderingServiceSpec +
+
GifRenderingServiceSpec - Class in grails.plugin.rendering.image +
+
GifRenderingServiceSpec() - Constructor in GifRenderingServiceSpec +
+
grailsApplication - Property in RenderingGrailsPluginSpec +
+
grailsApplication - Property in RenderingService +
+
grailsApplication - Property in RenderingServiceSpec +
+
grailsApplication - Property in XhtmlDocumentService +
+
GrailsRenderingException - Class in grails.plugin.rendering +
+
GrailsRenderingException() - Constructor in GrailsRenderingException +
+
grailsVersion - Property in PdfPluginTestGrailsPlugin +
+
grailsVersion - Property in RenderingGrailsPlugin +
+
groovyPagesTemplateEngine - Property in XhtmlDocumentService +
+
groovyPagesUriService - Property in XhtmlDocumentService +
+
+ + + +
+

+H

+ +
+ +
+ + + +
+

+I

+ +
+ +
image(null) - Method in ImageRenderingServiceSpec +
+
ImageRenderingService - Class in ImageRenderingService +
+
ImageRenderingService() - Constructor in ImageRenderingService +
+
ImageRenderingServiceSpec - Class in ImageRenderingServiceSpec +
+
ImageRenderingServiceSpec() - Constructor in ImageRenderingServiceSpec +
+
imageResize() - Method in ImageRenderingServiceSpec +
+
imageScale() - Method in ImageRenderingServiceSpec +
+
init() - Method in RenderEnvironment +
+
inline image tag() - Method in RenderingTagLibSpec +
+
inlineGif - Property in RenderingTagLib +
+
inlineImage - Property in RenderingTagLib +
+
inlineJpeg - Property in RenderingTagLib +
+
inlinePng - Property in RenderingTagLib +
+
isDataUri(null) - Method in DataUri +
+
+ + + +
+

+J

+ +
+ +
jpeg tag() - Method in RenderingTagLibSpec +
+
jpeg - Property in RenderingController +
+
JpegRenderingService - Class in grails.plugin.rendering.image +
+
JpegRenderingService() - Constructor in JpegRenderingService +
+
jpegRenderingService - Property in JpegRenderingServiceSpec +
+
JpegRenderingServiceSpec - Class in JpegRenderingServiceSpec +
+
JpegRenderingServiceSpec() - Constructor in JpegRenderingServiceSpec +
+
+ + + +
+

+K

+ +
+ +
+ + + +
+

+L

+ +
+ +
loadAfter - Property in RenderingGrailsPlugin +
+
locale - Property in RenderEnvironment +
+
log - Field in DataUriAwareITextUserAgent +
+
log - Field in DataUriAwareNaiveUserAgent +
+
+ + + +
+

+M

+ +
+ +
mappings - Property in UrlMappings +
+
mimeType - Field in DataUri +
+
+ + + +
+

+N

+ +
+ +
namespace - Property in RenderingTagLib +
+
+ + + +
+

+O

+ +
+ +
observe - Property in RenderingGrailsPlugin +
/*", + "grails-app/controllers/*
+
onApplicationEvent(RenderEvent) - Method in BackgroundRenderingService +
+
onChange - Property in PdfPluginTestGrailsPlugin +
+
onChange - Property in RenderingGrailsPlugin +
+
onConfigChange - Property in PdfPluginTestGrailsPlugin +
+
originalOut - Field in RenderEnvironment +
+
originalRequestAttributes - Field in RenderEnvironment +
+
out - Property in RenderEnvironment +
+
+ + + +
+

+P

+ +
+ +
pdf - Property in RenderingController +
+
PdfPluginTestGrailsPlugin - Class in PdfPluginTestGrailsPlugin +
+
PdfPluginTestGrailsPlugin() - Constructor in PdfPluginTestGrailsPlugin +
+
PdfRenderingService - Class in PdfRenderingService +
+
pdfRenderingService - Property in BackgroundRenderingService +
+
PdfRenderingService() - Constructor in PdfRenderingService +
+
pdfRenderingService - Property in PdfRenderingServiceSpec +
+
PdfRenderingServiceSpec - Class in grails.plugin.rendering.pdf +
+
PdfRenderingServiceSpec() - Constructor in PdfRenderingServiceSpec +
+
pluginExcludes - Property in PdfPluginTestGrailsPlugin +
+
pluginExcludes - Property in RenderingGrailsPlugin +
+
pluginManager - Property in RenderingServiceSpec +
+
png tag() - Method in RenderingTagLibSpec +
+
png - Property in RenderingController +
+
PngRenderingService - Class in grails.plugin.rendering.image +
+
PngRenderingService() - Constructor in PngRenderingService +
+
pngRenderingService - Property in PngRenderingServiceSpec +
+
PngRenderingServiceSpec - Class in grails.plugin.rendering.image +
+
PngRenderingServiceSpec() - Constructor in PngRenderingServiceSpec +
+
processArgs(null) - Method in RenderingService +
+
processMetadata(String[]) - Method in DataUri +
+
+ + + +
+

+Q

+ +
+ +
+ + + +
+

+R

+ +
+ +
relative - Property in RenderingController +
+
reloadControllerClass() - Method in RenderingGrailsPluginSpec +
+
render(null, null) - Method in RenderingService +
+
RenderEnvironment - Class in RenderEnvironment +
+
RenderEnvironment(null, null, null) - Constructor in RenderEnvironment +
+
RenderEvent - Class in RenderEvent +
+
RenderEvent(def) - Constructor in RenderEvent +
+
renderImageWithAutoHeight() - Method in ImageRenderingServiceSpec +
+
renderImageWithHeight() - Method in ImageRenderingServiceSpec +
+
RenderingController - Class in RenderingController +
+
RenderingController() - Constructor in RenderingController +
+
RenderingException - Class in grails.plugin.rendering +
+
RenderingException() - Constructor in RenderingException +
+
RenderingGrailsPlugin - Class in RenderingGrailsPlugin +
+
RenderingGrailsPlugin() - Constructor in RenderingGrailsPlugin +
+
RenderingGrailsPluginSpec - Class in grails.plugin.rendering +
+
RenderingGrailsPluginSpec() - Constructor in RenderingGrailsPluginSpec +
+
RenderingService - Class in RenderingService +
+
RenderingService() - Constructor in RenderingService +
+
RenderingServiceSpec - Class in RenderingServiceSpec +
+
RenderingServiceSpec() - Constructor in RenderingServiceSpec +
+
RenderingTagLib - Class in RenderingTagLib +
@todo need tests for this.
+
RenderingTagLib() - Constructor in RenderingTagLib +
+
RenderingTagLibSpec - Class in RenderingTagLibSpec +
+
RenderingTagLibSpec() - Constructor in RenderingTagLibSpec +
+
renderMethodTemplate - Property in RenderingGrailsPlugin +
+
renderRequestAttributes - Field in RenderEnvironment +
+
renderTemplateInPlugin() - Method in RenderingServiceSpec +
+
renderToResponse() - Method in RenderingServiceSpec +
+
renderToResponseViaBytes() - Method in RenderingServiceSpec +
+
renderWithNoTemplateThrowsException() - Method in RenderingServiceSpec +
+
renderWithUnknownTemplateThrowsException() - Method in RenderingServiceSpec +
+
resize(def, def, def, def) - Method in ImageRenderingService +
+
resolveAndOpenStream(null) - Method in DataUriAwareNaiveUserAgent +
+
resolveURI(null) - Method in DataUriAwareNaiveUserAgent +
+
+ + + +
+

+S

+ +
+ +
scale(def, def, def, def) - Method in ImageRenderingService +
+
setContentDisposition(null, null) - Method in RenderingService +
+
setContentType(null, null) - Method in RenderingService +
+
setResponseHeaders(null, null) - Method in RenderingService +
+
setup() - Method in RenderingTagLibSpec +
+
simpleRender() - Method in RenderingServiceSpec +
+
supportReloadingControllerClasses() - Method in RenderingGrailsPluginSpec +
+
+ + + +
+

+T

+ +
+ +
title - Property in PdfPluginTestGrailsPlugin +
+
title - Property in RenderingGrailsPlugin +
+
toBufferedImage(def) - Method in ImageRenderingServiceSpec +
+
transactional - Property in ImageRenderingService +
+
transactional - Property in PdfRenderingService +
+
transactional - Property in RenderingService +
+
transactional - Property in XhtmlDocumentService +
+
+ + + +
+

+U

+ +
+ +
UnknownTemplateException - Class in UnknownTemplateException +
+
UnknownTemplateException(null, null) - Constructor in UnknownTemplateException +
+
UrlMappings - Class in UrlMappings +
+
UrlMappings() - Constructor in UrlMappings +
+
+ + + +
+

+V

+ +
+ +
version - Property in PdfPluginTestGrailsPlugin +
+
version - Property in RenderingGrailsPlugin +
+
+ + + +
+

+W

+ +
+ +
with(null, null, null, null) - Method in RenderEnvironment +
Establish an environment with a specific locale
+
writeToResponse(null, null, byte[]) - Method in RenderingService +
+
+ + + +
+

+X

+ +
+ +
XhtmlDocumentService - Class in grails.plugin.rendering.document +
+
xhtmlDocumentService - Property in RenderingService +
+
XhtmlDocumentService() - Constructor in XhtmlDocumentService +
+
xhtmlDocumentService - Property in XhtmlDocumentServiceSpec +
+
XhtmlDocumentServiceSpec - Class in XhtmlDocumentServiceSpec +
The xhtmlDocumentService is exercised in the rendering + service tests.
+
XhtmlDocumentServiceSpec() - Constructor in XhtmlDocumentServiceSpec +
+
XmlParseException - Class in grails.plugin.rendering.document +
+
XmlParseException() - Constructor in XmlParseException +
+
+ + + +
+

+Y

+ +
+ +
+ + + +
+

+Z

+ +
+ +
+ + + +
+

+_

+ +
+ +
+ + + +
+

Groovy Documentation

+
+ + diff --git a/docs/gapi/index.html b/docs/gapi/index.html new file mode 100644 index 0000000..cbe6628 --- /dev/null +++ b/docs/gapi/index.html @@ -0,0 +1,37 @@ + + + + +{todo.title} + + + + + + + + + + + + + +<H2> +Frame Alert</H2> + +<P> +This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. +<BR> +Link to<A HREF="overview-summary.html">Non-frame version.</A> + + + diff --git a/docs/gapi/inherit.gif b/docs/gapi/inherit.gif new file mode 100644 index 0000000..c814867 Binary files /dev/null and b/docs/gapi/inherit.gif differ diff --git a/docs/gapi/overview-frame.html b/docs/gapi/overview-frame.html new file mode 100644 index 0000000..e9ddade --- /dev/null +++ b/docs/gapi/overview-frame.html @@ -0,0 +1,53 @@ + + + + +Overview (Groovy Documentation) + + + + + + + + + + + + + + +
+Groovy Documentation
+ + + + + +
All Classes +

+ +Packages +
+ +DefaultPackage +
+ +grails.plugin.rendering +
+ +grails.plugin.rendering.datauri +
+ +grails.plugin.rendering.document +
+ +grails.plugin.rendering.image +
+ +

+ +

+  + + diff --git a/docs/gapi/overview-summary.html b/docs/gapi/overview-summary.html new file mode 100644 index 0000000..478fa36 --- /dev/null +++ b/docs/gapi/overview-summary.html @@ -0,0 +1,118 @@ + + + + +Overview (grails-rendering) + + + + + + + + +


+ + + + + + + + + + + + + +
+Groovy Documentation + +
+ + +
+
+

+Groovy Documentation

+
+

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Packages
DefaultPackage
grails.plugin.rendering
grails.plugin.rendering.datauri
grails.plugin.rendering.document
grails.plugin.rendering.image
+ +

+ +

Groovy Documentation

+
+ + diff --git a/docs/gapi/package-list b/docs/gapi/package-list new file mode 100644 index 0000000..1f6c95f --- /dev/null +++ b/docs/gapi/package-list @@ -0,0 +1,5 @@ +DefaultPackage +grails.plugin.rendering +grails.plugin.rendering.datauri +grails.plugin.rendering.document +grails.plugin.rendering.image diff --git a/docs/gapi/plugins/pdf-plugin-test/PdfPluginTestGrailsPlugin.html b/docs/gapi/plugins/pdf-plugin-test/PdfPluginTestGrailsPlugin.html new file mode 100644 index 0000000..5f6e138 --- /dev/null +++ b/docs/gapi/plugins/pdf-plugin-test/PdfPluginTestGrailsPlugin.html @@ -0,0 +1,523 @@ + + + + + + + + + +PdfPluginTestGrailsPlugin (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +plugins.pdf-plugin-test +
+Class PdfPluginTestGrailsPlugin

+
java.lang.Object
+  plugins.pdf-plugin-test.PdfPluginTestGrailsPlugin
+

+
class PdfPluginTestGrailsPlugin
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ def + author +
+

+
+ def + authorEmail +
+

+
+ def + dependsOn +
+

+
+ def + description +
+

+
+ def + doWithApplicationContext +
+

+
+ def + doWithDynamicMethods +
+

+
+ def + doWithSpring +
+

+
+ def + doWithWebDescriptor +
+

+
+ def + documentation +
+

+
+ def + grailsVersion +
+

+
+ def + onChange +
+

+
+ def + onConfigChange +
+

+
+ def + pluginExcludes +
+

+
+ def + title +
+

+
+ def + version +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ PdfPluginTestGrailsPlugin() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

author

+
def author
+
+
+
+

+

+
+ +

authorEmail

+
def authorEmail
+
+
+
+

+

+
+ +

dependsOn

+
def dependsOn
+
+
+
+

+

+
+ +

description

+
def description
+
+
+
+

+

+
+ +

doWithApplicationContext

+
def doWithApplicationContext
+
+
+
+

+

+
+ +

doWithDynamicMethods

+
def doWithDynamicMethods
+
+
+
+

+

+
+ +

doWithSpring

+
def doWithSpring
+
+
+
+

+

+
+ +

doWithWebDescriptor

+
def doWithWebDescriptor
+
+
+
+

+

+
+ +

documentation

+
def documentation
+
+
+
+

+

+
+ +

grailsVersion

+
def grailsVersion
+
+
+
+

+

+
+ +

onChange

+
def onChange
+
+
+
+

+

+
+ +

onConfigChange

+
def onConfigChange
+
+
+
+

+

+
+ +

pluginExcludes

+
def pluginExcludes
+
+
+
+

+

+
+ +

title

+
def title
+
+
+
+

+

+
+ +

version

+
def version
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ PdfPluginTestGrailsPlugin

+
PdfPluginTestGrailsPlugin()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/plugins/pdf-plugin-test/grails-app/conf/BuildConfig.html b/docs/gapi/plugins/pdf-plugin-test/grails-app/conf/BuildConfig.html new file mode 100644 index 0000000..f3971b1 --- /dev/null +++ b/docs/gapi/plugins/pdf-plugin-test/grails-app/conf/BuildConfig.html @@ -0,0 +1,220 @@ + + + + + + + + + +BuildConfig (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +plugins.pdf-plugin-test.grails-app.conf +
+Class BuildConfig

+
java.lang.Object
+  plugins.pdf-plugin-test.grails-app.conf.BuildConfig
+

+
class BuildConfig
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ BuildConfig() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ BuildConfig

+
BuildConfig()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/plugins/pdf-plugin-test/grails-app/conf/DataSource.html b/docs/gapi/plugins/pdf-plugin-test/grails-app/conf/DataSource.html new file mode 100644 index 0000000..647f168 --- /dev/null +++ b/docs/gapi/plugins/pdf-plugin-test/grails-app/conf/DataSource.html @@ -0,0 +1,220 @@ + + + + + + + + + +DataSource (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +plugins.pdf-plugin-test.grails-app.conf +
+Class DataSource

+
java.lang.Object
+  plugins.pdf-plugin-test.grails-app.conf.DataSource
+

+
class DataSource
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ DataSource() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ DataSource

+
DataSource()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/plugins/pdf-plugin-test/grails-app/conf/UrlMappings.html b/docs/gapi/plugins/pdf-plugin-test/grails-app/conf/UrlMappings.html new file mode 100644 index 0000000..e6c3e1a --- /dev/null +++ b/docs/gapi/plugins/pdf-plugin-test/grails-app/conf/UrlMappings.html @@ -0,0 +1,257 @@ + + + + + + + + + +UrlMappings (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +plugins.pdf-plugin-test.grails-app.conf +
+Class UrlMappings

+
java.lang.Object
+  plugins.pdf-plugin-test.grails-app.conf.UrlMappings
+

+
class UrlMappings
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ static def + mappings +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ UrlMappings() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

mappings

+
static def mappings
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ UrlMappings

+
UrlMappings()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/plugins/pdf-plugin-test/grails-app/conf/package-frame.html b/docs/gapi/plugins/pdf-plugin-test/grails-app/conf/package-frame.html new file mode 100644 index 0000000..139f86f --- /dev/null +++ b/docs/gapi/plugins/pdf-plugin-test/grails-app/conf/package-frame.html @@ -0,0 +1,37 @@ + + + + +plugins.pdf-plugin-test.grails-app.conf + + + + + + + + + + + +plugins.pdf-plugin-test.grails-app.conf + + + + + + + + +
+Classes  +
BuildConfig
DataSource
UrlMappings
+ + + + + + + + + diff --git a/docs/gapi/plugins/pdf-plugin-test/grails-app/conf/package-summary.html b/docs/gapi/plugins/pdf-plugin-test/grails-app/conf/package-summary.html new file mode 100644 index 0000000..ce90609 --- /dev/null +++ b/docs/gapi/plugins/pdf-plugin-test/grails-app/conf/package-summary.html @@ -0,0 +1,126 @@ + + + + +plugins.pdf-plugin-test.grails-app.conf (grails-rendering) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package plugins.pdf-plugin-test.grails-app.conf +

+ + + +

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Class Summary
BuildConfig
DataSource
UrlMappings
+  +

+

+
+
+ + + + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/plugins/pdf-plugin-test/package-frame.html b/docs/gapi/plugins/pdf-plugin-test/package-frame.html new file mode 100644 index 0000000..af32f47 --- /dev/null +++ b/docs/gapi/plugins/pdf-plugin-test/package-frame.html @@ -0,0 +1,37 @@ + + + + +plugins.pdf-plugin-test + + + + + + + + + + + +plugins.pdf-plugin-test + + + + + + + + +
+Classes  +
PdfPluginTestGrailsPlugin
+ + + + + + + + + diff --git a/docs/gapi/plugins/pdf-plugin-test/package-summary.html b/docs/gapi/plugins/pdf-plugin-test/package-summary.html new file mode 100644 index 0000000..3b53dc3 --- /dev/null +++ b/docs/gapi/plugins/pdf-plugin-test/package-summary.html @@ -0,0 +1,114 @@ + + + + +plugins.pdf-plugin-test (grails-rendering) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package plugins.pdf-plugin-test +

+ + + +

 

+ + + + + + + + + + + + + + + +
+ Class Summary
PdfPluginTestGrailsPlugin
+  +

+

+
+
+ + + + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/plugins/pdf-plugin-test/scripts/_Install.html b/docs/gapi/plugins/pdf-plugin-test/scripts/_Install.html new file mode 100644 index 0000000..d645c0d --- /dev/null +++ b/docs/gapi/plugins/pdf-plugin-test/scripts/_Install.html @@ -0,0 +1,220 @@ + + + + + + + + + +_Install (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +plugins.pdf-plugin-test.scripts +
+Class _Install

+
java.lang.Object
+  plugins.pdf-plugin-test.scripts._Install
+

+
class _Install
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ _Install() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
wait, wait, wait, hashCode, getClass, equals, toString, notify, notifyAll
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ _Install

+
_Install()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/plugins/pdf-plugin-test/scripts/_Uninstall.html b/docs/gapi/plugins/pdf-plugin-test/scripts/_Uninstall.html new file mode 100644 index 0000000..adb38d5 --- /dev/null +++ b/docs/gapi/plugins/pdf-plugin-test/scripts/_Uninstall.html @@ -0,0 +1,220 @@ + + + + + + + + + +_Uninstall (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +plugins.pdf-plugin-test.scripts +
+Class _Uninstall

+
java.lang.Object
+  plugins.pdf-plugin-test.scripts._Uninstall
+

+
class _Uninstall
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ _Uninstall() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
wait, wait, wait, hashCode, getClass, equals, toString, notify, notifyAll
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ _Uninstall

+
_Uninstall()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/plugins/pdf-plugin-test/scripts/_Upgrade.html b/docs/gapi/plugins/pdf-plugin-test/scripts/_Upgrade.html new file mode 100644 index 0000000..8210d92 --- /dev/null +++ b/docs/gapi/plugins/pdf-plugin-test/scripts/_Upgrade.html @@ -0,0 +1,220 @@ + + + + + + + + + +_Upgrade (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +plugins.pdf-plugin-test.scripts +
+Class _Upgrade

+
java.lang.Object
+  plugins.pdf-plugin-test.scripts._Upgrade
+

+
class _Upgrade
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ _Upgrade() +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Object +
wait, wait, wait, hashCode, getClass, equals, toString, notify, notifyAll
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ _Upgrade

+
_Upgrade()
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/plugins/pdf-plugin-test/scripts/package-frame.html b/docs/gapi/plugins/pdf-plugin-test/scripts/package-frame.html new file mode 100644 index 0000000..40c5456 --- /dev/null +++ b/docs/gapi/plugins/pdf-plugin-test/scripts/package-frame.html @@ -0,0 +1,37 @@ + + + + +plugins.pdf-plugin-test.scripts + + + + + + + + + + + +plugins.pdf-plugin-test.scripts + + + + + + + + +
+Classes  +
_Install
_Uninstall
_Upgrade
+ + + + + + + + + diff --git a/docs/gapi/plugins/pdf-plugin-test/scripts/package-summary.html b/docs/gapi/plugins/pdf-plugin-test/scripts/package-summary.html new file mode 100644 index 0000000..90f02dd --- /dev/null +++ b/docs/gapi/plugins/pdf-plugin-test/scripts/package-summary.html @@ -0,0 +1,126 @@ + + + + +plugins.pdf-plugin-test.scripts (pdf) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package plugins.pdf-plugin-test.scripts +

+ + + +

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Class Summary
_Install
_Uninstall
_Upgrade
+  +

+

+
+
+ + + + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/src/groovy/grails/plugin/pdf/GrailsPdfException.html b/docs/gapi/src/groovy/grails/plugin/pdf/GrailsPdfException.html new file mode 100644 index 0000000..50e20e4 --- /dev/null +++ b/docs/gapi/src/groovy/grails/plugin/pdf/GrailsPdfException.html @@ -0,0 +1,235 @@ + + + + + + + + + +GrailsPdfException (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +src.groovy.grails.plugin.pdf +
+Class GrailsPdfException

+
java.lang.Object
+  java.lang.Throwable
+      java.lang.Exception
+          src.groovy.grails.plugin.pdf.GrailsPdfException
+

+
class GrailsPdfException
+extends java.lang.Exception
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ GrailsPdfException(java.lang.CharSequence message, java.lang.Throwable cause = null) +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Exception +
printStackTrace, printStackTrace, printStackTrace, fillInStackTrace, getCause, initCause, toString, getMessage, getLocalizedMessage, getStackTrace, setStackTrace, wait, wait, wait, hashCode, getClass, equals, notify, notifyAll
+   + + +
+ Methods inherited from class java.lang.Throwable +
printStackTrace, printStackTrace, printStackTrace, fillInStackTrace, getCause, initCause, toString, getMessage, getLocalizedMessage, getStackTrace, setStackTrace, wait, wait, wait, hashCode, getClass, equals, notify, notifyAll
+   + + +
+ Methods inherited from class java.lang.Object +
wait, wait, wait, hashCode, getClass, equals, toString, notify, notifyAll
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ GrailsPdfException

+
public GrailsPdfException(java.lang.CharSequence message, java.lang.Throwable cause = null)
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/src/groovy/grails/plugin/pdf/RenderingException.html b/docs/gapi/src/groovy/grails/plugin/pdf/RenderingException.html new file mode 100644 index 0000000..5503295 --- /dev/null +++ b/docs/gapi/src/groovy/grails/plugin/pdf/RenderingException.html @@ -0,0 +1,236 @@ + + + + + + + + + +RenderingException (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +src.groovy.grails.plugin.pdf +
+Class RenderingException

+
java.lang.Object
+  java.lang.Throwable
+      java.lang.Exception
+          src.groovy.grails.plugin.pdf.GrailsPdfException
+              src.groovy.grails.plugin.pdf.RenderingException
+

+
class RenderingException
+extends GrailsPdfException
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderingException(def xml, def cause) +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Exception +
printStackTrace, printStackTrace, printStackTrace, fillInStackTrace, getCause, initCause, toString, getMessage, getLocalizedMessage, getStackTrace, setStackTrace, wait, wait, wait, hashCode, getClass, equals, notify, notifyAll
+   + + +
+ Methods inherited from class java.lang.Throwable +
printStackTrace, printStackTrace, printStackTrace, fillInStackTrace, getCause, initCause, toString, getMessage, getLocalizedMessage, getStackTrace, setStackTrace, wait, wait, wait, hashCode, getClass, equals, notify, notifyAll
+   + + +
+ Methods inherited from class java.lang.Object +
wait, wait, wait, hashCode, getClass, equals, toString, notify, notifyAll
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderingException

+
public RenderingException(def xml, def cause)
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/src/groovy/grails/plugin/pdf/UnknownTemplateException.html b/docs/gapi/src/groovy/grails/plugin/pdf/UnknownTemplateException.html new file mode 100644 index 0000000..3d5356b --- /dev/null +++ b/docs/gapi/src/groovy/grails/plugin/pdf/UnknownTemplateException.html @@ -0,0 +1,236 @@ + + + + + + + + + +UnknownTemplateException (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +src.groovy.grails.plugin.pdf +
+Class UnknownTemplateException

+
java.lang.Object
+  java.lang.Throwable
+      java.lang.Exception
+          src.groovy.grails.plugin.pdf.GrailsPdfException
+              src.groovy.grails.plugin.pdf.UnknownTemplateException
+

+
class UnknownTemplateException
+extends GrailsPdfException
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ UnknownTemplateException(java.lang.String template, java.lang.String plugin = null) +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Exception +
printStackTrace, printStackTrace, printStackTrace, fillInStackTrace, getCause, initCause, toString, getMessage, getLocalizedMessage, getStackTrace, setStackTrace, wait, wait, wait, hashCode, getClass, equals, notify, notifyAll
+   + + +
+ Methods inherited from class java.lang.Throwable +
printStackTrace, printStackTrace, printStackTrace, fillInStackTrace, getCause, initCause, toString, getMessage, getLocalizedMessage, getStackTrace, setStackTrace, wait, wait, wait, hashCode, getClass, equals, notify, notifyAll
+   + + +
+ Methods inherited from class java.lang.Object +
wait, wait, wait, hashCode, getClass, equals, toString, notify, notifyAll
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ UnknownTemplateException

+
public UnknownTemplateException(java.lang.String template, java.lang.String plugin = null)
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/src/groovy/grails/plugin/pdf/XmlParseException.html b/docs/gapi/src/groovy/grails/plugin/pdf/XmlParseException.html new file mode 100644 index 0000000..6e6f1db --- /dev/null +++ b/docs/gapi/src/groovy/grails/plugin/pdf/XmlParseException.html @@ -0,0 +1,236 @@ + + + + + + + + + +XmlParseException (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +src.groovy.grails.plugin.pdf +
+Class XmlParseException

+
java.lang.Object
+  java.lang.Throwable
+      java.lang.Exception
+          src.groovy.grails.plugin.pdf.GrailsPdfException
+              src.groovy.grails.plugin.pdf.XmlParseException
+

+
class XmlParseException
+extends GrailsPdfException
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ XmlParseException(def xml, def cause) +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.Exception +
printStackTrace, printStackTrace, printStackTrace, fillInStackTrace, getCause, initCause, toString, getMessage, getLocalizedMessage, getStackTrace, setStackTrace, wait, wait, wait, hashCode, getClass, equals, notify, notifyAll
+   + + +
+ Methods inherited from class java.lang.Throwable +
printStackTrace, printStackTrace, printStackTrace, fillInStackTrace, getCause, initCause, toString, getMessage, getLocalizedMessage, getStackTrace, setStackTrace, wait, wait, wait, hashCode, getClass, equals, notify, notifyAll
+   + + +
+ Methods inherited from class java.lang.Object +
wait, wait, wait, hashCode, getClass, equals, toString, notify, notifyAll
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ XmlParseException

+
public XmlParseException(def xml, def cause)
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/src/groovy/grails/plugin/pdf/package-frame.html b/docs/gapi/src/groovy/grails/plugin/pdf/package-frame.html new file mode 100644 index 0000000..955f5fd --- /dev/null +++ b/docs/gapi/src/groovy/grails/plugin/pdf/package-frame.html @@ -0,0 +1,37 @@ + + + + +src.groovy.grails.plugin.pdf + + + + + + + + + + + +src.groovy.grails.plugin.pdf + + + + + + + + + + +
+Exceptions  +
GrailsPdfException
RenderingException
UnknownTemplateException
XmlParseException
+ + + + + + + diff --git a/docs/gapi/src/groovy/grails/plugin/pdf/package-summary.html b/docs/gapi/src/groovy/grails/plugin/pdf/package-summary.html new file mode 100644 index 0000000..6849126 --- /dev/null +++ b/docs/gapi/src/groovy/grails/plugin/pdf/package-summary.html @@ -0,0 +1,132 @@ + + + + +src.groovy.grails.plugin.pdf (pdf) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package src.groovy.grails.plugin.pdf +

+ + + +

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Exception Summary
GrailsPdfException
RenderingException
UnknownTemplateException
XmlParseException
+  +

+

+
+
+ + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/src/groovy/grails/plugin/rendering/GrailsRenderingException.html b/docs/gapi/src/groovy/grails/plugin/rendering/GrailsRenderingException.html new file mode 100644 index 0000000..8e53af8 --- /dev/null +++ b/docs/gapi/src/groovy/grails/plugin/rendering/GrailsRenderingException.html @@ -0,0 +1,242 @@ + + + + + + + + + +GrailsRenderingException (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +src.groovy.grails.plugin.rendering +
+Class GrailsRenderingException

+
java.lang.Object
+  java.lang.Throwable
+      java.lang.Exception
+          java.lang.RuntimeException
+              src.groovy.grails.plugin.rendering.GrailsRenderingException
+

+
class GrailsRenderingException
+extends java.lang.RuntimeException
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ GrailsRenderingException(java.lang.CharSequence message, java.lang.Throwable cause = null) +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.RuntimeException +
java.lang.RuntimeException#printStackTrace(java.io.PrintStream), java.lang.RuntimeException#printStackTrace(), java.lang.RuntimeException#printStackTrace(java.io.PrintWriter), java.lang.RuntimeException#fillInStackTrace(), java.lang.RuntimeException#getCause(), java.lang.RuntimeException#initCause(java.lang.Throwable), java.lang.RuntimeException#toString(), java.lang.RuntimeException#getMessage(), java.lang.RuntimeException#getLocalizedMessage(), java.lang.RuntimeException#getStackTrace(), java.lang.RuntimeException#setStackTrace([Ljava.lang.StackTraceElement;), java.lang.RuntimeException#wait(), java.lang.RuntimeException#wait(long), java.lang.RuntimeException#wait(long, int), java.lang.RuntimeException#equals(java.lang.Object), java.lang.RuntimeException#hashCode(), java.lang.RuntimeException#getClass(), java.lang.RuntimeException#notify(), java.lang.RuntimeException#notifyAll()
+   + + +
+ Methods inherited from class java.lang.Exception +
java.lang.Exception#printStackTrace(java.io.PrintStream), java.lang.Exception#printStackTrace(), java.lang.Exception#printStackTrace(java.io.PrintWriter), java.lang.Exception#fillInStackTrace(), java.lang.Exception#getCause(), java.lang.Exception#initCause(java.lang.Throwable), java.lang.Exception#toString(), java.lang.Exception#getMessage(), java.lang.Exception#getLocalizedMessage(), java.lang.Exception#getStackTrace(), java.lang.Exception#setStackTrace([Ljava.lang.StackTraceElement;), java.lang.Exception#wait(), java.lang.Exception#wait(long), java.lang.Exception#wait(long, int), java.lang.Exception#equals(java.lang.Object), java.lang.Exception#hashCode(), java.lang.Exception#getClass(), java.lang.Exception#notify(), java.lang.Exception#notifyAll()
+   + + +
+ Methods inherited from class java.lang.Throwable +
java.lang.Throwable#printStackTrace(java.io.PrintStream), java.lang.Throwable#printStackTrace(), java.lang.Throwable#printStackTrace(java.io.PrintWriter), java.lang.Throwable#fillInStackTrace(), java.lang.Throwable#getCause(), java.lang.Throwable#initCause(java.lang.Throwable), java.lang.Throwable#toString(), java.lang.Throwable#getMessage(), java.lang.Throwable#getLocalizedMessage(), java.lang.Throwable#getStackTrace(), java.lang.Throwable#setStackTrace([Ljava.lang.StackTraceElement;), java.lang.Throwable#wait(), java.lang.Throwable#wait(long), java.lang.Throwable#wait(long, int), java.lang.Throwable#equals(java.lang.Object), java.lang.Throwable#hashCode(), java.lang.Throwable#getClass(), java.lang.Throwable#notify(), java.lang.Throwable#notifyAll()
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ GrailsRenderingException

+
public GrailsRenderingException(java.lang.CharSequence message, java.lang.Throwable cause = null)
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/src/groovy/grails/plugin/rendering/RenderingException.html b/docs/gapi/src/groovy/grails/plugin/rendering/RenderingException.html new file mode 100644 index 0000000..0ddbeba --- /dev/null +++ b/docs/gapi/src/groovy/grails/plugin/rendering/RenderingException.html @@ -0,0 +1,243 @@ + + + + + + + + + +RenderingException (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +src.groovy.grails.plugin.rendering +
+Class RenderingException

+
java.lang.Object
+  java.lang.Throwable
+      java.lang.Exception
+          java.lang.RuntimeException
+              src.groovy.grails.plugin.rendering.GrailsRenderingException
+                  src.groovy.grails.plugin.rendering.RenderingException
+

+
class RenderingException
+extends GrailsRenderingException
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderingException(def cause) +
+

+
+   + + + + + + + + + +
+ Method Summary
+   + + +
+ Methods inherited from class java.lang.RuntimeException +
java.lang.RuntimeException#printStackTrace(java.io.PrintStream), java.lang.RuntimeException#printStackTrace(), java.lang.RuntimeException#printStackTrace(java.io.PrintWriter), java.lang.RuntimeException#fillInStackTrace(), java.lang.RuntimeException#getCause(), java.lang.RuntimeException#initCause(java.lang.Throwable), java.lang.RuntimeException#toString(), java.lang.RuntimeException#getMessage(), java.lang.RuntimeException#getLocalizedMessage(), java.lang.RuntimeException#getStackTrace(), java.lang.RuntimeException#setStackTrace([Ljava.lang.StackTraceElement;), java.lang.RuntimeException#wait(), java.lang.RuntimeException#wait(long), java.lang.RuntimeException#wait(long, int), java.lang.RuntimeException#equals(java.lang.Object), java.lang.RuntimeException#hashCode(), java.lang.RuntimeException#getClass(), java.lang.RuntimeException#notify(), java.lang.RuntimeException#notifyAll()
+   + + +
+ Methods inherited from class java.lang.Exception +
java.lang.Exception#printStackTrace(java.io.PrintStream), java.lang.Exception#printStackTrace(), java.lang.Exception#printStackTrace(java.io.PrintWriter), java.lang.Exception#fillInStackTrace(), java.lang.Exception#getCause(), java.lang.Exception#initCause(java.lang.Throwable), java.lang.Exception#toString(), java.lang.Exception#getMessage(), java.lang.Exception#getLocalizedMessage(), java.lang.Exception#getStackTrace(), java.lang.Exception#setStackTrace([Ljava.lang.StackTraceElement;), java.lang.Exception#wait(), java.lang.Exception#wait(long), java.lang.Exception#wait(long, int), java.lang.Exception#equals(java.lang.Object), java.lang.Exception#hashCode(), java.lang.Exception#getClass(), java.lang.Exception#notify(), java.lang.Exception#notifyAll()
+   + + +
+ Methods inherited from class java.lang.Throwable +
java.lang.Throwable#printStackTrace(java.io.PrintStream), java.lang.Throwable#printStackTrace(), java.lang.Throwable#printStackTrace(java.io.PrintWriter), java.lang.Throwable#fillInStackTrace(), java.lang.Throwable#getCause(), java.lang.Throwable#initCause(java.lang.Throwable), java.lang.Throwable#toString(), java.lang.Throwable#getMessage(), java.lang.Throwable#getLocalizedMessage(), java.lang.Throwable#getStackTrace(), java.lang.Throwable#setStackTrace([Ljava.lang.StackTraceElement;), java.lang.Throwable#wait(), java.lang.Throwable#wait(long), java.lang.Throwable#wait(long, int), java.lang.Throwable#equals(java.lang.Object), java.lang.Throwable#hashCode(), java.lang.Throwable#getClass(), java.lang.Throwable#notify(), java.lang.Throwable#notifyAll()
+   + + +
+ Methods inherited from class java.lang.Object +
java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()
+   + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderingException

+
public RenderingException(def cause)
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/src/groovy/grails/plugin/rendering/document/UnknownTemplateException.html b/docs/gapi/src/groovy/grails/plugin/rendering/document/UnknownTemplateException.html new file mode 100644 index 0000000..9cec97e --- /dev/null +++ b/docs/gapi/src/groovy/grails/plugin/rendering/document/UnknownTemplateException.html @@ -0,0 +1,210 @@ + + + + + + + + + +UnknownTemplateException (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +src.groovy.grails.plugin.rendering.document +
+Class UnknownTemplateException

+
java.lang.Object
+  grails.plugin.rendering.GrailsRenderingException
+      src.groovy.grails.plugin.rendering.document.UnknownTemplateException
+

+
class UnknownTemplateException
+extends GrailsRenderingException
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ UnknownTemplateException(java.lang.String template, java.lang.String plugin = null) +
+

+
+   + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ UnknownTemplateException

+
public UnknownTemplateException(java.lang.String template, java.lang.String plugin = null)
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/src/groovy/grails/plugin/rendering/document/XmlParseException.html b/docs/gapi/src/groovy/grails/plugin/rendering/document/XmlParseException.html new file mode 100644 index 0000000..09665f2 --- /dev/null +++ b/docs/gapi/src/groovy/grails/plugin/rendering/document/XmlParseException.html @@ -0,0 +1,210 @@ + + + + + + + + + +XmlParseException (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +src.groovy.grails.plugin.rendering.document +
+Class XmlParseException

+
java.lang.Object
+  grails.plugin.rendering.GrailsRenderingException
+      src.groovy.grails.plugin.rendering.document.XmlParseException
+

+
class XmlParseException
+extends GrailsRenderingException
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ XmlParseException(def xml, def cause) +
+

+
+   + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ XmlParseException

+
public XmlParseException(def xml, def cause)
+
+
+
+

+

+
+ +   + + + + + + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/src/groovy/grails/plugin/rendering/document/package-frame.html b/docs/gapi/src/groovy/grails/plugin/rendering/document/package-frame.html new file mode 100644 index 0000000..82f632e --- /dev/null +++ b/docs/gapi/src/groovy/grails/plugin/rendering/document/package-frame.html @@ -0,0 +1,37 @@ + + + + +src.groovy.grails.plugin.rendering.document + + + + + + + + + + + +src.groovy.grails.plugin.rendering.document + + + + + + + + +
+Classes  +
UnknownTemplateException
XmlParseException
+ + + + + + + + + diff --git a/docs/gapi/src/groovy/grails/plugin/rendering/document/package-summary.html b/docs/gapi/src/groovy/grails/plugin/rendering/document/package-summary.html new file mode 100644 index 0000000..14921d8 --- /dev/null +++ b/docs/gapi/src/groovy/grails/plugin/rendering/document/package-summary.html @@ -0,0 +1,120 @@ + + + + +src.groovy.grails.plugin.rendering.document (grails-rendering) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package src.groovy.grails.plugin.rendering.document +

+ + + +

 

+ + + + + + + + + + + + + + + + + + + + + +
+ Class Summary
UnknownTemplateException
XmlParseException
+  +

+

+
+
+ + + + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/src/groovy/grails/plugin/rendering/package-frame.html b/docs/gapi/src/groovy/grails/plugin/rendering/package-frame.html new file mode 100644 index 0000000..d28c3b3 --- /dev/null +++ b/docs/gapi/src/groovy/grails/plugin/rendering/package-frame.html @@ -0,0 +1,37 @@ + + + + +src.groovy.grails.plugin.rendering + + + + + + + + + + + +src.groovy.grails.plugin.rendering + + + + + + + + + + +
+Exceptions  +
GrailsRenderingException
RenderingException
+ + + + + + + diff --git a/docs/gapi/src/groovy/grails/plugin/rendering/package-summary.html b/docs/gapi/src/groovy/grails/plugin/rendering/package-summary.html new file mode 100644 index 0000000..65fd56f --- /dev/null +++ b/docs/gapi/src/groovy/grails/plugin/rendering/package-summary.html @@ -0,0 +1,120 @@ + + + + +src.groovy.grails.plugin.rendering (grails-rendering) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package src.groovy.grails.plugin.rendering +

+ + + +

 

+ + + + + + + + + + + + + + + + + + + + + + + +
+ Exception Summary
GrailsRenderingException
RenderingException
+  +

+

+
+
+ + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/stylesheet.css b/docs/gapi/stylesheet.css new file mode 100644 index 0000000..8f77530 --- /dev/null +++ b/docs/gapi/stylesheet.css @@ -0,0 +1,28 @@ +/* Groovydoc style sheet */ + +/* Define colors, fonts and other style attributes here to override the defaults */ + +/* Page background color */ +body { background-color: #FFFFFF } + +/* Headings */ +h1 { font-size: 145% } + +/* Table colors */ +.TableHeadingColor { background: #97D0E8 } /* Dark cyan */ +.TableSubHeadingColor { background: #E0F0FF } /* Light cyan */ +.TableRowColor { background: #FFFFFF } /* White */ + +/* Font used in left-hand frame lists */ +.FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif } +.FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif } +.FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif } + +/* Navigation bar fonts and colors */ +.NavBarCell1 { background-color:#EEEEFF;} /* Light mauve */ +.NavBarCell1Rev { background-color:#00008B;} /* Dark Blue */ +.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;} +.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;} + +.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;} +.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;} \ No newline at end of file diff --git a/docs/gapi/test/functional/grails/plugin/rendering/ControllerRelativeTemplateSpec.html b/docs/gapi/test/functional/grails/plugin/rendering/ControllerRelativeTemplateSpec.html new file mode 100644 index 0000000..cf5cd2d --- /dev/null +++ b/docs/gapi/test/functional/grails/plugin/rendering/ControllerRelativeTemplateSpec.html @@ -0,0 +1,249 @@ + + + + + + + + + +ControllerRelativeTemplateSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +test.functional.grails.plugin.rendering +
+Class ControllerRelativeTemplateSpec

+
java.lang.Object
+  FunctionalSpec
+      test.functional.grails.plugin.rendering.ControllerRelativeTemplateSpec
+

+
class ControllerRelativeTemplateSpec
+extends FunctionalSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ ControllerRelativeTemplateSpec() +
+

+
+   + + + + + + + + + + + + + + + + +
+ Method Summary
+ def + + accessingControllerRelativeTemplateWorks() +
+

+
+   + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ ControllerRelativeTemplateSpec

+
ControllerRelativeTemplateSpec()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ accessingControllerRelativeTemplateWorks

+
public def accessingControllerRelativeTemplateWorks()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/test/functional/grails/plugin/rendering/package-frame.html b/docs/gapi/test/functional/grails/plugin/rendering/package-frame.html new file mode 100644 index 0000000..e480b6e --- /dev/null +++ b/docs/gapi/test/functional/grails/plugin/rendering/package-frame.html @@ -0,0 +1,37 @@ + + + + +test.functional.grails.plugin.rendering + + + + + + + + + + + +test.functional.grails.plugin.rendering + + + + + + + + +
+Classes  +
ControllerRelativeTemplateSpec
+ + + + + + + + + diff --git a/docs/gapi/test/functional/grails/plugin/rendering/package-summary.html b/docs/gapi/test/functional/grails/plugin/rendering/package-summary.html new file mode 100644 index 0000000..173c3aa --- /dev/null +++ b/docs/gapi/test/functional/grails/plugin/rendering/package-summary.html @@ -0,0 +1,114 @@ + + + + +test.functional.grails.plugin.rendering (grails-rendering) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package test.functional.grails.plugin.rendering +

+ + + +

 

+ + + + + + + + + + + + + + + +
+ Class Summary
ControllerRelativeTemplateSpec
+  +

+

+
+
+ + + + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/test/integration/grails/plugin/pdf/GrailsPdfSpec.html b/docs/gapi/test/integration/grails/plugin/pdf/GrailsPdfSpec.html new file mode 100644 index 0000000..22a77e8 --- /dev/null +++ b/docs/gapi/test/integration/grails/plugin/pdf/GrailsPdfSpec.html @@ -0,0 +1,597 @@ + + + + + + + + + +GrailsPdfSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +test.integration.grails.plugin.pdf +
+Class GrailsPdfSpec

+
java.lang.Object
+  IntegrationSpec
+      test.integration.grails.plugin.pdf.GrailsPdfSpec
+

+
class GrailsPdfSpec
+extends IntegrationSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ def + grailsApplication +
+

+
+ def + pdfRenderingService +
+

+
+ def + pluginManager +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ GrailsPdfSpec() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ def + + badXmlThrowsXmlParseException() +
+

+
+ def + + createController() +
+

+
+ def + + createPdf(java.util.Map renderArgs) +
+

+
+ def + + createPdf(java.io.InputStream inputStream) +
+

+
+ def + + extractTextLines(java.util.Map renderArgs) +
+

+
+ def + + extractTextLines(byte[] bytes) +
+

+
+ def + + extractTextLines(PDDocument pdf) +
+

+
+ def + + getControllerClass() +
+

+
+ def + + renderTemplateInPlugin() +
+

+
+ def + + renderViaController() +
+

+
+ def + + renderWithNoTemplateThrowsException() +
+

+
+ def + + renderWithUnknownTemplateThrowsException() +
+

+
+ def + + simpleRender() +
+

+
+ def + + supportReloadingControllerClasses() +
+

+
+   + + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

grailsApplication

+
def grailsApplication
+
+
+
+

+

+
+ +

pdfRenderingService

+
def pdfRenderingService
+
+
+
+

+

+
+ +

pluginManager

+
def pluginManager
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ GrailsPdfSpec

+
GrailsPdfSpec()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ badXmlThrowsXmlParseException

+
public def badXmlThrowsXmlParseException()
+
+
+
+

+

+
+ +

+ createController

+
public def createController()
+
+
+
+

+

+
+ +

+ createPdf

+
public def createPdf(java.util.Map renderArgs)
+
+
+
+

+

+
+ +

+ createPdf

+
public def createPdf(java.io.InputStream inputStream)
+
+
+
+

+

+
+ +

+ extractTextLines

+
public def extractTextLines(java.util.Map renderArgs)
+
+
+
+

+

+
+ +

+ extractTextLines

+
public def extractTextLines(byte[] bytes)
+
+
+
+

+

+
+ +

+ extractTextLines

+
public def extractTextLines(PDDocument pdf)
+
+
+
+

+

+
+ +

+ getControllerClass

+
public def getControllerClass()
+
+
+
+

+

+
+ +

+ renderTemplateInPlugin

+
public def renderTemplateInPlugin()
+
+
+
+

+

+
+ +

+ renderViaController

+
public def renderViaController()
+
+
+
+

+

+
+ +

+ renderWithNoTemplateThrowsException

+
public def renderWithNoTemplateThrowsException()
+
+
+
+

+

+
+ +

+ renderWithUnknownTemplateThrowsException

+
public def renderWithUnknownTemplateThrowsException()
+
+
+
+

+

+
+ +

+ simpleRender

+
public def simpleRender()
+
+
+
+

+

+
+ +

+ supportReloadingControllerClasses

+
public def supportReloadingControllerClasses()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/test/integration/grails/plugin/pdf/package-frame.html b/docs/gapi/test/integration/grails/plugin/pdf/package-frame.html new file mode 100644 index 0000000..19bc97a --- /dev/null +++ b/docs/gapi/test/integration/grails/plugin/pdf/package-frame.html @@ -0,0 +1,37 @@ + + + + +test.integration.grails.plugin.pdf + + + + + + + + + + + +test.integration.grails.plugin.pdf + + + + + + + + +
+Classes  +
GrailsPdfSpec
+ + + + + + + + + diff --git a/docs/gapi/test/integration/grails/plugin/pdf/package-summary.html b/docs/gapi/test/integration/grails/plugin/pdf/package-summary.html new file mode 100644 index 0000000..7b4d0ed --- /dev/null +++ b/docs/gapi/test/integration/grails/plugin/pdf/package-summary.html @@ -0,0 +1,114 @@ + + + + +test.integration.grails.plugin.pdf (pdf) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package test.integration.grails.plugin.pdf +

+ + + +

 

+ + + + + + + + + + + + + + + +
+ Class Summary
GrailsPdfSpec
+  +

+

+
+
+ + + + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/test/integration/grails/plugin/rendering/BackgroundRenderingSpec.html b/docs/gapi/test/integration/grails/plugin/rendering/BackgroundRenderingSpec.html new file mode 100644 index 0000000..e682df0 --- /dev/null +++ b/docs/gapi/test/integration/grails/plugin/rendering/BackgroundRenderingSpec.html @@ -0,0 +1,286 @@ + + + + + + + + + +BackgroundRenderingSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +test.integration.grails.plugin.rendering +
+Class BackgroundRenderingSpec

+
java.lang.Object
+  IntegrationSpec
+      test.integration.grails.plugin.rendering.BackgroundRenderingSpec
+

+
class BackgroundRenderingSpec
+extends IntegrationSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ def + backgroundRenderingService +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ BackgroundRenderingSpec() +
+

+
+   + + + + + + + + + + + + + + + + +
+ Method Summary
+ def + + background render() +
+

+
+   + + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

backgroundRenderingService

+
def backgroundRenderingService
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ BackgroundRenderingSpec

+
BackgroundRenderingSpec()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ background render

+
public def background render()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/test/integration/grails/plugin/rendering/RenderingGrailsPluginSpec.html b/docs/gapi/test/integration/grails/plugin/rendering/RenderingGrailsPluginSpec.html new file mode 100644 index 0000000..714f94f --- /dev/null +++ b/docs/gapi/test/integration/grails/plugin/rendering/RenderingGrailsPluginSpec.html @@ -0,0 +1,329 @@ + + + + + + + + + +RenderingGrailsPluginSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +test.integration.grails.plugin.rendering +
+Class RenderingGrailsPluginSpec

+
java.lang.Object
+  IntegrationSpec
+      test.integration.grails.plugin.rendering.RenderingGrailsPluginSpec
+

+
class RenderingGrailsPluginSpec
+extends IntegrationSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ def + grailsApplication +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderingGrailsPluginSpec() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected def + + createController() +
+

+
+ protected def + + reloadControllerClass() +
+

+
+ def + + supportReloadingControllerClasses() +
+

+
+   + + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

grailsApplication

+
def grailsApplication
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderingGrailsPluginSpec

+
RenderingGrailsPluginSpec()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ createController

+
protected def createController()
+
+
+
+

+

+
+ +

+ reloadControllerClass

+
protected def reloadControllerClass()
+
+
+
+

+

+
+ +

+ supportReloadingControllerClasses

+
@Unroll("rendering #action works from controllers and survives a reload")
+public def supportReloadingControllerClasses()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/test/integration/grails/plugin/rendering/RenderingServiceSpec.html b/docs/gapi/test/integration/grails/plugin/rendering/RenderingServiceSpec.html new file mode 100644 index 0000000..d421afd --- /dev/null +++ b/docs/gapi/test/integration/grails/plugin/rendering/RenderingServiceSpec.html @@ -0,0 +1,536 @@ + + + + + + + + + +RenderingServiceSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +test.integration.grails.plugin.rendering +
+Class RenderingServiceSpec

+
java.lang.Object
+  IntegrationSpec
+      test.integration.grails.plugin.rendering.RenderingServiceSpec
+

+
class RenderingServiceSpec
+extends IntegrationSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ def + grailsApplication +
+

+
+ def + pluginManager +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ RenderingServiceSpec() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ def + + badXmlThrowsXmlParseException() +
+

+
+ protected def + + createController() +
+

+
+ protected def + + createMockResponse() +
+

+
+ protected def + + getPluginTemplate(java.util.Map args = [:]) +
+

+
+ def + + getRenderer() +
+

+
+ protected def + + getSimpleTemplate(java.util.Map args = [:]) +
+

+
+ def + + renderTemplateInPlugin() +
+

+
+ def + + renderToResponse() +
+

+
+ def + + renderToResponseViaBytes() +
+

+
+ def + + renderWithNoTemplateThrowsException() +
+

+
+ def + + renderWithUnknownTemplateThrowsException() +
+

+
+ def + + simpleRender() +
+

+
+   + + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

grailsApplication

+
def grailsApplication
+
+
+
+

+

+
+ +

pluginManager

+
def pluginManager
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ RenderingServiceSpec

+
RenderingServiceSpec()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ badXmlThrowsXmlParseException

+
public def badXmlThrowsXmlParseException()
+
+
+
+

+

+
+ +

+ createController

+
protected def createController()
+
+
+
+

+

+
+ +

+ createMockResponse

+
protected def createMockResponse()
+
+
+
+

+

+
+ +

+ getPluginTemplate

+
protected def getPluginTemplate(java.util.Map args = [:])
+
+
+
+

+

+
+ +

+ getRenderer

+
public def getRenderer()
+
+
+
+

+

+
+ +

+ getSimpleTemplate

+
protected def getSimpleTemplate(java.util.Map args = [:])
+
+
+
+

+

+
+ +

+ renderTemplateInPlugin

+
public def renderTemplateInPlugin()
+
+
+
+

+

+
+ +

+ renderToResponse

+
public def renderToResponse()
+
+
+
+

+

+
+ +

+ renderToResponseViaBytes

+
public def renderToResponseViaBytes()
+
+
+
+

+

+
+ +

+ renderWithNoTemplateThrowsException

+
public def renderWithNoTemplateThrowsException()
+
+
+
+

+

+
+ +

+ renderWithUnknownTemplateThrowsException

+
public def renderWithUnknownTemplateThrowsException()
+
+
+
+

+

+
+ +

+ simpleRender

+
public def simpleRender()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/test/integration/grails/plugin/rendering/document/XhtmlDocumentServiceSpec.html b/docs/gapi/test/integration/grails/plugin/rendering/document/XhtmlDocumentServiceSpec.html new file mode 100644 index 0000000..1f7bd36 --- /dev/null +++ b/docs/gapi/test/integration/grails/plugin/rendering/document/XhtmlDocumentServiceSpec.html @@ -0,0 +1,293 @@ + + + + + + + + + +XhtmlDocumentServiceSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +test.integration.grails.plugin.rendering.document +
+Class XhtmlDocumentServiceSpec

+
java.lang.Object
+  IntegrationSpec
+      test.integration.grails.plugin.rendering.document.XhtmlDocumentServiceSpec
+

+
class XhtmlDocumentServiceSpec
+extends IntegrationSpec
+
+
+ +

+ The xhtmlDocumentService is exercised in the rendering + service tests. This is here for testing future functionality. + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ def + xhtmlDocumentService +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ XhtmlDocumentServiceSpec() +
+

+
+   + + + + + + + + + + + + + + + + +
+ Method Summary
+ def + + emptyScenario() +
+

+
+   + + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

xhtmlDocumentService

+
def xhtmlDocumentService
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ XhtmlDocumentServiceSpec

+
XhtmlDocumentServiceSpec()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ emptyScenario

+
public def emptyScenario()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/test/integration/grails/plugin/rendering/document/package-frame.html b/docs/gapi/test/integration/grails/plugin/rendering/document/package-frame.html new file mode 100644 index 0000000..8f3b237 --- /dev/null +++ b/docs/gapi/test/integration/grails/plugin/rendering/document/package-frame.html @@ -0,0 +1,37 @@ + + + + +test.integration.grails.plugin.rendering.document + + + + + + + + + + + +test.integration.grails.plugin.rendering.document + + + + + + + + +
+Classes  +
XhtmlDocumentServiceSpec
+ + + + + + + + + diff --git a/docs/gapi/test/integration/grails/plugin/rendering/document/package-summary.html b/docs/gapi/test/integration/grails/plugin/rendering/document/package-summary.html new file mode 100644 index 0000000..2c5ca5c --- /dev/null +++ b/docs/gapi/test/integration/grails/plugin/rendering/document/package-summary.html @@ -0,0 +1,115 @@ + + + + +test.integration.grails.plugin.rendering.document (grails-rendering) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package test.integration.grails.plugin.rendering.document +

+ + + +

 

+ + + + + + + + + + + + + + + +
+ Class Summary
XhtmlDocumentServiceSpecThe xhtmlDocumentService is exercised in the rendering + service tests.
+  +

+

+
+
+ + + + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/test/integration/grails/plugin/rendering/image/GifRenderingServiceSpec.html b/docs/gapi/test/integration/grails/plugin/rendering/image/GifRenderingServiceSpec.html new file mode 100644 index 0000000..aec4538 --- /dev/null +++ b/docs/gapi/test/integration/grails/plugin/rendering/image/GifRenderingServiceSpec.html @@ -0,0 +1,293 @@ + + + + + + + + + +GifRenderingServiceSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +test.integration.grails.plugin.rendering.image +
+Class GifRenderingServiceSpec

+
java.lang.Object
+  grails.plugin.rendering.RenderingServiceSpec
+      test.integration.grails.plugin.rendering.image.ImageRenderingServiceSpec
+          test.integration.grails.plugin.rendering.image.GifRenderingServiceSpec
+

+
class GifRenderingServiceSpec
+extends ImageRenderingServiceSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ def + gifRenderingService +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ GifRenderingServiceSpec() +
+

+
+   + + + + + + + + + + + + + + + + +
+ Method Summary
+ def + + getRenderer() +
+

+
+   + + + +
+ Methods inherited from class ImageRenderingServiceSpec +
image, imageResize, imageScale, renderImageWithAutoHeight, renderImageWithHeight, toBufferedImage
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

gifRenderingService

+
def gifRenderingService
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ GifRenderingServiceSpec

+
GifRenderingServiceSpec()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ getRenderer

+
public def getRenderer()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/test/integration/grails/plugin/rendering/image/ImageRenderingServiceSpec.html b/docs/gapi/test/integration/grails/plugin/rendering/image/ImageRenderingServiceSpec.html new file mode 100644 index 0000000..4a81c64 --- /dev/null +++ b/docs/gapi/test/integration/grails/plugin/rendering/image/ImageRenderingServiceSpec.html @@ -0,0 +1,354 @@ + + + + + + + + + +ImageRenderingServiceSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +test.integration.grails.plugin.rendering.image +
+Class ImageRenderingServiceSpec

+
java.lang.Object
+  grails.plugin.rendering.RenderingServiceSpec
+      test.integration.grails.plugin.rendering.image.ImageRenderingServiceSpec
+

+
class ImageRenderingServiceSpec
+extends RenderingServiceSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ ImageRenderingServiceSpec() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected def + + image(java.util.Map args) +
+

+
+ def + + imageResize() +
+

+
+ def + + imageScale() +
+

+
+ def + + renderImageWithAutoHeight() +
+

+
+ def + + renderImageWithHeight() +
+

+
+ protected def + + toBufferedImage(def baos) +
+

+
+   + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ ImageRenderingServiceSpec

+
ImageRenderingServiceSpec()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ image

+
protected def image(java.util.Map args)
+
+
+
+

+

+
+ +

+ imageResize

+
public def imageResize()
+
+
+
+

+

+
+ +

+ imageScale

+
public def imageScale()
+
+
+
+

+

+
+ +

+ renderImageWithAutoHeight

+
public def renderImageWithAutoHeight()
+
+
+
+

+

+
+ +

+ renderImageWithHeight

+
public def renderImageWithHeight()
+
+
+
+

+

+
+ +

+ toBufferedImage

+
protected def toBufferedImage(def baos)
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/test/integration/grails/plugin/rendering/image/JpegRenderingServiceSpec.html b/docs/gapi/test/integration/grails/plugin/rendering/image/JpegRenderingServiceSpec.html new file mode 100644 index 0000000..7c6d6a5 --- /dev/null +++ b/docs/gapi/test/integration/grails/plugin/rendering/image/JpegRenderingServiceSpec.html @@ -0,0 +1,293 @@ + + + + + + + + + +JpegRenderingServiceSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +test.integration.grails.plugin.rendering.image +
+Class JpegRenderingServiceSpec

+
java.lang.Object
+  grails.plugin.rendering.RenderingServiceSpec
+      test.integration.grails.plugin.rendering.image.ImageRenderingServiceSpec
+          test.integration.grails.plugin.rendering.image.JpegRenderingServiceSpec
+

+
class JpegRenderingServiceSpec
+extends ImageRenderingServiceSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ def + jpegRenderingService +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ JpegRenderingServiceSpec() +
+

+
+   + + + + + + + + + + + + + + + + +
+ Method Summary
+ def + + getRenderer() +
+

+
+   + + + +
+ Methods inherited from class ImageRenderingServiceSpec +
image, imageResize, imageScale, renderImageWithAutoHeight, renderImageWithHeight, toBufferedImage
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

jpegRenderingService

+
def jpegRenderingService
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ JpegRenderingServiceSpec

+
JpegRenderingServiceSpec()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ getRenderer

+
public def getRenderer()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/test/integration/grails/plugin/rendering/image/PngRenderingServiceSpec.html b/docs/gapi/test/integration/grails/plugin/rendering/image/PngRenderingServiceSpec.html new file mode 100644 index 0000000..ee17252 --- /dev/null +++ b/docs/gapi/test/integration/grails/plugin/rendering/image/PngRenderingServiceSpec.html @@ -0,0 +1,293 @@ + + + + + + + + + +PngRenderingServiceSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +test.integration.grails.plugin.rendering.image +
+Class PngRenderingServiceSpec

+
java.lang.Object
+  grails.plugin.rendering.RenderingServiceSpec
+      test.integration.grails.plugin.rendering.image.ImageRenderingServiceSpec
+          test.integration.grails.plugin.rendering.image.PngRenderingServiceSpec
+

+
class PngRenderingServiceSpec
+extends ImageRenderingServiceSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ def + pngRenderingService +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ PngRenderingServiceSpec() +
+

+
+   + + + + + + + + + + + + + + + + +
+ Method Summary
+ def + + getRenderer() +
+

+
+   + + + +
+ Methods inherited from class ImageRenderingServiceSpec +
image, imageResize, imageScale, renderImageWithAutoHeight, renderImageWithHeight, toBufferedImage
+   + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

pngRenderingService

+
def pngRenderingService
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ PngRenderingServiceSpec

+
PngRenderingServiceSpec()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ getRenderer

+
public def getRenderer()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/test/integration/grails/plugin/rendering/image/package-frame.html b/docs/gapi/test/integration/grails/plugin/rendering/image/package-frame.html new file mode 100644 index 0000000..335b87d --- /dev/null +++ b/docs/gapi/test/integration/grails/plugin/rendering/image/package-frame.html @@ -0,0 +1,37 @@ + + + + +test.integration.grails.plugin.rendering.image + + + + + + + + + + + +test.integration.grails.plugin.rendering.image + + + + + + + + +
+Classes  +
GifRenderingServiceSpec
ImageRenderingServiceSpec
JpegRenderingServiceSpec
PngRenderingServiceSpec
+ + + + + + + + + diff --git a/docs/gapi/test/integration/grails/plugin/rendering/image/package-summary.html b/docs/gapi/test/integration/grails/plugin/rendering/image/package-summary.html new file mode 100644 index 0000000..269e55e --- /dev/null +++ b/docs/gapi/test/integration/grails/plugin/rendering/image/package-summary.html @@ -0,0 +1,132 @@ + + + + +test.integration.grails.plugin.rendering.image (grails-rendering) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package test.integration.grails.plugin.rendering.image +

+ + + +

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Class Summary
GifRenderingServiceSpec
ImageRenderingServiceSpec
JpegRenderingServiceSpec
PngRenderingServiceSpec
+  +

+

+
+
+ + + + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/test/integration/grails/plugin/rendering/package-frame.html b/docs/gapi/test/integration/grails/plugin/rendering/package-frame.html new file mode 100644 index 0000000..5875a9b --- /dev/null +++ b/docs/gapi/test/integration/grails/plugin/rendering/package-frame.html @@ -0,0 +1,37 @@ + + + + +test.integration.grails.plugin.rendering + + + + + + + + + + + +test.integration.grails.plugin.rendering + + + + + + + + +
+Classes  +
BackgroundRenderingSpec
RenderingGrailsPluginSpec
RenderingServiceSpec
+ + + + + + + + + diff --git a/docs/gapi/test/integration/grails/plugin/rendering/package-summary.html b/docs/gapi/test/integration/grails/plugin/rendering/package-summary.html new file mode 100644 index 0000000..0ae2e2b --- /dev/null +++ b/docs/gapi/test/integration/grails/plugin/rendering/package-summary.html @@ -0,0 +1,126 @@ + + + + +test.integration.grails.plugin.rendering (grails-rendering) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package test.integration.grails.plugin.rendering +

+ + + +

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Class Summary
BackgroundRenderingSpec
RenderingGrailsPluginSpec
RenderingServiceSpec
+  +

+

+
+
+ + + + + + +

Groovy Documentation

+
+ + diff --git a/docs/gapi/test/integration/grails/plugin/rendering/pdf/PdfRenderingServiceSpec.html b/docs/gapi/test/integration/grails/plugin/rendering/pdf/PdfRenderingServiceSpec.html new file mode 100644 index 0000000..b90f61b --- /dev/null +++ b/docs/gapi/test/integration/grails/plugin/rendering/pdf/PdfRenderingServiceSpec.html @@ -0,0 +1,391 @@ + + + + + + + + + +PdfRenderingServiceSpec (Groovy Documentation) + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+Groovy Documentation +
+ + + +
+ +

+ +test.integration.grails.plugin.rendering.pdf +
+Class PdfRenderingServiceSpec

+
java.lang.Object
+  grails.plugin.rendering.RenderingServiceSpec
+      test.integration.grails.plugin.rendering.pdf.PdfRenderingServiceSpec
+

+
class PdfRenderingServiceSpec
+extends RenderingServiceSpec
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Property Summary
+ def + pdfRenderingService +
+

+
+   + + + + + + + + + + + + + + + + + + + +
+ Constructor Summary
+ PdfRenderingServiceSpec() +
+

+
+   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Summary
+ protected def + + createPdf(java.util.Map renderArgs) +
+

+
+ protected def + + createPdf(java.io.InputStream inputStream) +
+

+
+ protected def + + extractTextLines(java.util.Map renderArgs) +
+

+
+ protected def + + extractTextLines(byte[] bytes) +
+

+
+ protected def + + extractTextLines(org.apache.pdfbox.pdmodel.PDDocument pdf) +
+

+
+ def + + getRenderer() +
+

+
+   + + +

+ + + + + + + + + + + + + + + + + + + +
+ Property Detail
+ +

pdfRenderingService

+
def pdfRenderingService
+
+
+
+

+

+
+ +   + + + + + + + + + + + + + + + +
+ Constructor Detail
+ +

+ PdfRenderingServiceSpec

+
PdfRenderingServiceSpec()
+
+
+
+

+

+
+ +   + + + + + + + + + + +
+ Method Detail
+ +

+ createPdf

+
protected def createPdf(java.util.Map renderArgs)
+
+
+
+

+

+
+ +

+ createPdf

+
protected def createPdf(java.io.InputStream inputStream)
+
+
+
+

+

+
+ +

+ extractTextLines

+
protected def extractTextLines(java.util.Map renderArgs)
+
+
+
+

+

+
+ +

+ extractTextLines

+
protected def extractTextLines(byte[] bytes)
+
+
+
+

+

+
+ +

+ extractTextLines

+
protected def extractTextLines(org.apache.pdfbox.pdmodel.PDDocument pdf)
+
+
+
+

+

+
+ +

+ getRenderer

+
public def getRenderer()
+
+
+
+

+

+
+ +   + + + +

Groovy Documentation

+
+ + + diff --git a/docs/gapi/test/integration/grails/plugin/rendering/pdf/package-frame.html b/docs/gapi/test/integration/grails/plugin/rendering/pdf/package-frame.html new file mode 100644 index 0000000..07d4fea --- /dev/null +++ b/docs/gapi/test/integration/grails/plugin/rendering/pdf/package-frame.html @@ -0,0 +1,37 @@ + + + + +test.integration.grails.plugin.rendering.pdf + + + + + + + + + + + +test.integration.grails.plugin.rendering.pdf + + + + + + + + +
+Classes  +
PdfRenderingServiceSpec
+ + + + + + + + + diff --git a/docs/gapi/test/integration/grails/plugin/rendering/pdf/package-summary.html b/docs/gapi/test/integration/grails/plugin/rendering/pdf/package-summary.html new file mode 100644 index 0000000..a88f0a7 --- /dev/null +++ b/docs/gapi/test/integration/grails/plugin/rendering/pdf/package-summary.html @@ -0,0 +1,114 @@ + + + + +test.integration.grails.plugin.rendering.pdf (grails-rendering) + + + + + + + + + + +
+ + + + + + + + + + + + + +
+ Groovy Documentation + +
+ + + +
+

+Package test.integration.grails.plugin.rendering.pdf +

+ + + +

 

+ + + + + + + + + + + + + + + +
+ Class Summary
PdfRenderingServiceSpec
+  +

+

+
+
+ + + + + + +

Groovy Documentation

+
+ + diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..bd5b27c --- /dev/null +++ b/docs/index.html @@ -0,0 +1,13 @@ + + + + grails-rendering Documentation + + + + Java API docs
+ Groovy API docs
+ Manual (Frames)
+ Manual (Single)
+ + diff --git a/docs/manual/css/main.css b/docs/manual/css/main.css new file mode 100644 index 0000000..300467c --- /dev/null +++ b/docs/manual/css/main.css @@ -0,0 +1,325 @@ +.body { + margin-left: 30px; + font-family: Tahoma, Verdana, Arial; + font-size:95%; +} +#header .images { + padding-bottom:40px; +} +#header .message { + font-family:"Century Gothic", "Trebuchet MS", "Arial Narrow", Arial, sans-serif; + font-size:15px; + text-transform:uppercase; + text-align:right; + font-weight:normal; + margin:0; + padding:0; + margin-right:40px; + color:#000000; + border-bottom:1px solid #eeeeee; +} + +.warning { + background-image: url(../img/warning.gif); + background-repeat: no-repeat; + background-position: 7 7; + border: 1px solid #CC0000; + margin-top: 4px; + margin-bottom: 4px; + padding: 10px; + padding-left: 40px; + line-height: 100%; + width: 80%; + background-color: #FFCCCC; +} + +.note { + background-image: url(../img/note.gif); + background-repeat: no-repeat; + background-position: 7 7; + border: 1px solid #F0C000; + margin-top: 4px; + margin-bottom: 4px; + padding: 10px; + padding-left: 40px; + line-height: 100%; + width: 80%; + background-color: #FFFFCE; +} + +pre .code { + border: 1px solid black; + padding-bottom:10px; + background-color: lightgrey; + padding-left:20px; +} +.bq { + margin-top: 4px; + margin-bottom: 4px; + padding: 5px 5px 5px 5px; + padding-bottom: 15px; + color: inherit; + background-color: #F0F0F0; + border: 1px dashed black; + font-family: courier, courier new, monospace; + font-size: 12px; + line-height: 100%; + white-space: pre; + width: 90%; + overflow: auto; + overflow: scroll -moz-scrollbars-horizontal; + overflow-x: auto; +} +#footer { + border-top:1px solid #eeeeee; + text-align:center; +} +.tocItem { + padding-bottom: 4px; +} +/** + * Wiki text stylesheet definitions. + * @author Matthias L. Jugel + * @version $Id: SnipSnap-Theme.snip,v 1.1.2.1 2004/01/26 14:07:31 leo Exp $ + */ + +.bold { font-weight: bold; } +.italic { font-style: italic; } + +/************************************************/ +/* image positioning */ +img { + margin-top: 1px; + margin-bottom: 1px; + vertical-align: middle; +} + +img.left { + display: block; + left: 0px; +} + +img.right { + display: block; + right: 0px; +} + +img.center { + text-align: center; +} + +img.float-left { + float: left; + margin-top: 3px; + margin-right: 3px; + margin-bottom: 3px; +} + +img.float-right { + float: right; + margin-top: 3px; + margin-left: 3px; + margin-bottom: 3px; +} + +/* +.graph-image { + position: relative; + width: 100%; +} +*/ + +.heading-1 { + font-weight: bold; + font-size: 14px; + font-variant: small-caps; +} + +.heading-1-1 { + font-size: 12px; + font-variant: small-caps; +} + +.heading-1-1-1 { + font-size: 12px; +} + +.quote { + font-style: italic; + color: inherit; + background-color: inherit; + font-family: inherit; + font-size: inherit; +} + +/************************************************/ +/* code formatting */ +.code { + margin-top: 4px; + margin-bottom: 4px; + padding: 5px 5px 5px 5px; + color: inherit; + background-color: #F0F0F0; + border: 1px dashed black; + font-family: courier, courier new, monospace; + font-size: 12px; + line-height: 100%; + white-space: pre; + width: 98%; + overflow: auto; + overflow: scroll -moz-scrollbars-horizontal; + overflow-x: auto; +} + + +.java-keyword { + font-weight: bold; + color: #0000aa; + background-color: inherit; +} + +.java-object { + color: #000088; + background-color: inherit; +} + +.java-quote { + color: #00aa00; + background-color: inherit; +} + +.xml-keyword { + font-weight: bold; +} + +.xml-tag { + color: #0000aa; + background-color: inherit; +} + +/* weblog formatting */ +.blog-date { + display: block; + background-color: #f8f8f8; + color: black; + font-family: verdana, sans-serif; + font-size: 16px; + font-weight: bold; + margin-bottom: 10px; + width: 100%; +} + +/* special formatting of a wiki table */ +.wiki-table { + border-style: solid; + border-color: black; + border-width: 0px 1px 1px 1px; + empty-cells: show; +} + +.wiki-table td { + border-top: 1px solid black; + padding: 4px 4px 4px 4px; +} + +.wiki-table th { + border-top: 1px solid black; + text-align: left; + color: inherit; + font-weight: bold; + /* background-color: #DDEEFF; */ + background-color: #d9e4f9; +} + +.wiki-table .table-odd { + color: inherit; + background-color: #F8F8F8; +} + +.wiki-table .table-even { +} + +/************************************************/ +/* list formatting */ + +.list { +} + +.list-title { + font-weight: bold; +} + +.list ul { + margin-top: 0px; + margin-bottom: 0px; + margin-left: 0px; + padding-left: 0px; + list-style-type: none; +} + +/* wiki lists */ + +ul.minus { list-style-type: square; } +ul.star { list-style-type: circle; } +ol.roman { list-style-type: lower-roman; } +ol.ROMAN { list-style-type: upper-roman; } +ol.alpha { list-style-type: lower-alpha; } +ol.ALPHA { list-style-type: upper-alpha; } +ol.greek { list-style-type: lower-greek; } +ol.GREEK { list-style-type: upper-greek; } +ol.hiragana { list-style-type: hiragana; } +ol.HIRAGANA { list-style-type: hiragana-iroha; } +ol.katakana { list-style-type: katakana; } +ol.KATAKANA { list-style-type: katakana-iroha; } +ol.HEBREW { list-style-type: hebrew; } + + +/************************************************/ +/* index formatting */ +.index-top { +} + +.index-top th { + padding: 1px 1px 1px 1px; + text-align: left; + color: inherit; + font-weight: bold; + background-color: #d9e4f9; +} + +.index { +} + +.index td { + padding: 1px 1px 1px 1px; +} + +.index th { + padding: 1px 1px 1px 1px; + text-align: left; + color: inherit; + font-weight: bold; + background-color: #d9e4f9; +} + +/************************************************/ +/* calendar display */ +.calendar { + border-spacing: 0px; + font-size: 0.7em; +} + +.calendar td { + text-align: right; + padding: 0px; +} + +.calendar caption { + font-size: 1em; + text-align: left; + font-weight: bold; +} + +.calendar .today { + border: 3px solid #cccccc; +} \ No newline at end of file diff --git a/docs/manual/css/menu.css b/docs/manual/css/menu.css new file mode 100644 index 0000000..35c80eb --- /dev/null +++ b/docs/manual/css/menu.css @@ -0,0 +1,17 @@ +.menuItem { + font-family:Tahoma, Verdana, Arial; + font-weight: normal; + font-size:95%; +} +.menuTitle { + font-size:85%; + font-family:Tahoma, Verdana, Arial; +} +.menuUsageItem { + font-size:95%; + font-family:Tahoma, Verdana, Arial; + margin-bottom:10px; +} +.menuUsageItem a { + text-decoration: none; +} \ No newline at end of file diff --git a/docs/manual/css/pdf.css b/docs/manual/css/pdf.css new file mode 100644 index 0000000..e788e00 --- /dev/null +++ b/docs/manual/css/pdf.css @@ -0,0 +1,87 @@ +/* page layout and page numbering */ +@page { + size: a4; +} + +@page :left { + @bottom-left { + content: counter(page); + vertical-align: middle; + margin: 0.8em 0; + font-size: 12pt; + } +} + +@page :right { + @bottom-right { + content: counter(page); + vertical-align: middle; + margin: 0.8em 0; + font-size: 12pt; + } +} + +/* style overrides */ + +h1 { + font-size: 20px; + string-set: header content(); + page-break-before: always +} + +h1>a { + font-size: 20px; + string-set: header content(); + page-break-before: always +} + +h2 { + font-size: 16px; +} + +h3 { + font-size: 14px; +} + +h1, h2, h3, h1>a, h2>a, h3>a { + color:#000000; +} + +#toc div.tocItem { + list-style: none; + margin: 0; + padding: 0; +} + +#toc div.tocItem a::after { + content: leader('.') target-counter(attr(href), page); + font-style: normal; +} + +div.title { + font-size: 20px; +} + +.body { + font-size: 14px; +} + +pre .code { + padding-left:5px; + font-size: 12px; + line-height: 100%; + white-space: normal; + page-break-inside: avoid; +} + +.code, .bq { + border: 1px solid black; + margin-bottom: 2em; + page-break-inside: avoid; +} + +.warning, .note, table { + margin-top: 2em; + margin-bottom: 2em; + page-break-inside: avoid; +} diff --git a/docs/manual/css/ref.css b/docs/manual/css/ref.css new file mode 100644 index 0000000..c80c380 --- /dev/null +++ b/docs/manual/css/ref.css @@ -0,0 +1,341 @@ +.body { + margin-left: 30px; + font-family: Tahoma, Verdana, Arial; + font-size:95%; +} + +h1 { + font-family: Arial, Verdana, Tahoma; + border-bottom:1px solid #eeeeee; + font-size:1.2em; + margin-left:30px; + margin-top:50px; +} + +h2 { + font-family: Arial, Verdana, Tahoma; + font-weight:normal; + font-style: italic; + font-size:1.0em; + margin-left:30px; +} + +p { + margin-left:50px; +} + +ul { + + margin-left:50px; +} + +ol { + + margin-left:50px; +} + + +blockquote { + margin-left:50px; +} + +/** + * Wiki text stylesheet definitions. + * @author Matthias L. Jugel + * @version $Id: SnipSnap-Theme.snip,v 1.1.2.1 2004/01/26 14:07:31 leo Exp $ + */ + +.bold { font-weight: bold; } +.italic { font-style: italic; } + +/************************************************/ +/* image positioning */ +img { + margin-top: 1px; + margin-bottom: 1px; + vertical-align: middle; +} + +img.left { + display: block; + left: 0px; +} + +img.right { + display: block; + right: 0px; +} + +img.center { + text-align: center; +} + +img.float-left { + float: left; + margin-top: 3px; + margin-right: 3px; + margin-bottom: 3px; +} + +img.float-right { + float: right; + margin-top: 3px; + margin-left: 3px; + margin-bottom: 3px; +} + +/* +.graph-image { + position: relative; + width: 100%; +} +*/ + +.heading-1 { + font-weight: bold; + font-size: 14px; + font-variant: small-caps; +} + +.heading-1-1 { + font-size: 12px; + font-variant: small-caps; +} + +.heading-1-1-1 { + font-size: 12px; +} + +.quote { + font-style: italic; + color: inherit; + background-color: inherit; + font-family: inherit; + font-size: inherit; +} + +.warning { + background-image: url(../img/warning.gif); + background-repeat: no-repeat; + background-position: 7 7; + border: 1px solid #CC0000; + margin-top: 4px; + margin-bottom: 4px; + margin-left:50px; + padding: 10px; + padding-left: 40px; + line-height: 100%; + width: 85%; + background-color: #FFCCCC; +} + +.note { + background-image: url(../img/note.gif); + background-repeat: no-repeat; + background-position: 7 7; + border: 1px solid #F0C000; + margin-top: 4px; + margin-bottom: 4px; + margin-left:50px; + padding: 10px; + padding-left: 40px; + line-height: 100%; + width: 85%; + background-color: #FFFFCE; +} +/************************************************/ +/* code formatting */ +.bq { + margin-top: 4px; + margin-bottom: 4px; + margin-left:40px; + padding: 5px 5px 5px 5px; + padding-bottom: 15px; + color: inherit; + background-color: #F0F0F0; + border: 1px dashed black; + font-family: courier, courier new, monospace; + font-size: 12px; + line-height: 100%; + white-space: pre; + width: 90%; + overflow: auto; + overflow: scroll -moz-scrollbars-horizontal; + overflow-x: auto; +} +.code { + margin-top: 4px; + margin-bottom: 4px; + margin-left:40px; + padding: 5px 5px 5px 5px; + color: inherit; + background-color: #F0F0F0; + border: 1px dashed black; + font-family: courier, courier new, monospace; + font-size: 12px; + line-height: 100%; + white-space: pre; + width: 90%; + overflow: auto; + overflow: scroll -moz-scrollbars-horizontal; + overflow-x: auto; +} +/* Paragraphs are created inside code blocks after blank lines */ +.code p { + margin-left: 0px; +} +table .code { + margin-left:0px; +} + +.java-keyword { + font-weight: bold; + color: #0000aa; + background-color: inherit; +} + +.java-object { + color: #000088; + background-color: inherit; +} + +.java-quote { + color: #00aa00; + background-color: inherit; +} + +.xml-keyword { + font-weight: bold; +} + +.xml-tag { + color: #0000aa; + background-color: inherit; +} + +/* weblog formatting */ +.blog-date { + display: block; + background-color: #f8f8f8; + color: black; + font-family: verdana, sans-serif; + font-size: 16px; + font-weight: bold; + margin-bottom: 10px; + width: 100%; +} + +/* special formatting of a wiki table */ +.wiki-table { + border-style: solid; + border-color: black; + border-width: 0px 1px 1px 1px; + empty-cells: show; +} + +.wiki-table td { + border-top: 1px solid black; + padding: 4px 4px 4px 4px; +} + +.wiki-table th { + border-top: 1px solid black; + text-align: left; + color: inherit; + font-weight: bold; + /* background-color: #DDEEFF; */ + background-color: #d9e4f9; +} + +.wiki-table .table-odd { + color: inherit; + background-color: #F8F8F8; +} + +.wiki-table .table-even { +} + +/************************************************/ +/* list formatting */ + +.list { +} + +.list-title { + font-weight: bold; +} + +.list ul { + margin-top: 0px; + margin-bottom: 0px; + margin-left: 0px; + padding-left: 0px; + list-style-type: none; +} + +/* wiki lists */ + +ul.minus { list-style-type: square; } +ul.star { list-style-type: circle; } +ol.roman { list-style-type: lower-roman; } +ol.ROMAN { list-style-type: upper-roman; } +ol.alpha { list-style-type: lower-alpha; } +ol.ALPHA { list-style-type: upper-alpha; } +ol.greek { list-style-type: lower-greek; } +ol.GREEK { list-style-type: upper-greek; } +ol.hiragana { list-style-type: hiragana; } +ol.HIRAGANA { list-style-type: hiragana-iroha; } +ol.katakana { list-style-type: katakana; } +ol.KATAKANA { list-style-type: katakana-iroha; } +ol.HEBREW { list-style-type: hebrew; } + + +/************************************************/ +/* index formatting */ +.index-top { +} + +.index-top th { + padding: 1px 1px 1px 1px; + text-align: left; + color: inherit; + font-weight: bold; + background-color: #d9e4f9; +} + +.index { +} + +.index td { + padding: 1px 1px 1px 1px; +} + +.index th { + padding: 1px 1px 1px 1px; + text-align: left; + color: inherit; + font-weight: bold; + background-color: #d9e4f9; +} + +/************************************************/ +/* calendar display */ +.calendar { + border-spacing: 0px; + font-size: 0.7em; +} + +.calendar td { + text-align: right; + padding: 0px; +} + +.calendar caption { + font-size: 1em; + text-align: left; + font-weight: bold; +} + +.calendar .today { + border: 3px solid #cccccc; +} \ No newline at end of file diff --git a/docs/manual/guide/1. Introduction.html b/docs/manual/guide/1. Introduction.html new file mode 100644 index 0000000..f056f64 --- /dev/null +++ b/docs/manual/guide/1. Introduction.html @@ -0,0 +1,10 @@ + + + + 1. Introduction + + + +

1. Introduction

This plugin adds additional rendering capabilities to Grails applications via the XHTML Renderer library.

Rendering is either done directly via «format»RenderingService services ...

ByteArrayOutputStream bytes = pdfRenderingService.render(template: "/pdfs/report", model: [data: data])

Or via the render«format»() methods added to controllers ...

renderPdf(template: "/pdfs/report", model: [report: reportObject], filename: reportObject.name)

The plugin is released under the Apache License 2.0 license and is produced under the Grails Plugin Collective . + + diff --git a/docs/manual/guide/2. GSP Considerations.html b/docs/manual/guide/2. GSP Considerations.html new file mode 100644 index 0000000..4f0b2ca --- /dev/null +++ b/docs/manual/guide/2. GSP Considerations.html @@ -0,0 +1,11 @@ + + + + 2. GSP Considerations + + + +

2. GSP Considerations

There are a few things that you do need to be aware of when writing GSPs to be rendered via this plugin.

Link resources must be resolvable

All links to resources (e.g. images, css) must be accessible by the application . This is due to the linked resources being accessed by application and not a browser. Depending on your network config in production, this may require some special consideration.

The rendering engine resolves all relative links relative to the grails.serverURL config property.

Must be well formed

The GSP must render to well formed, valid, XHTML. If it does not, a grails.plugin.rendering.document.XmlParseException will be thrown.

Must declare DOCTYPE

Without a doctype, you are likely to get parse failures due to unresolvable entity references (e.g. &nbsp;). Be sure to declare the XHTML doctype at the start of your GSP like so ...

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+ + diff --git a/docs/manual/guide/2. Writing PDF GSPs.html b/docs/manual/guide/2. Writing PDF GSPs.html new file mode 100644 index 0000000..39b3bf5 --- /dev/null +++ b/docs/manual/guide/2. Writing PDF GSPs.html @@ -0,0 +1,11 @@ + + + + 2. Writing PDF GSPs + + + +

2. Writing PDF GSPs

There are a few things that you do need to be aware of when writing GSPs to be rendered as PDF.

Links must be absolute

All links to resources (e.g. images, css) must be absolute and accessible by the application. This is due to the XHTML being parsed by the Flying Saucer library and not a browser, therefore relative links cannot be resolved.

The standard Grails resource and createLink tags support creating absolute links by specifying absolute: true .

Must be well formed

The GSP must render to well formed, valid, XHTML. If it does not, a grails.plugin.pdf.XmlParseException will be thrown.

Must declare DOCTYPE

Without a doctype, you are likely to get parse failures due to unresolvable entity references. Be sure to declare the XHTML doctype at the start of your GSP like so ...

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+ + \ No newline at end of file diff --git a/docs/manual/guide/3. Rendering PDFs.html b/docs/manual/guide/3. Rendering PDFs.html new file mode 100644 index 0000000..7f3c35c --- /dev/null +++ b/docs/manual/guide/3. Rendering PDFs.html @@ -0,0 +1,21 @@ + + + + 3. Rendering PDFs + + + +

3. Rendering PDFs

All PDF rendering methods on the pdfRenderingService take a Map argument that specifies which template to render and the model to use.

The following map arguments are common to all pdf rendering methods: +

Template Resolution

The pdf plugin uses the same resolution strategy as the render() method in Grails controllers and taglibs.

That is, +

If the template argument does not start with a "/", the controller argument must be provided. The methods added to controllers (e.g. renderPdf()) automatically pass the controller param for you. See + + \ No newline at end of file diff --git a/docs/manual/guide/3. Rendering.html b/docs/manual/guide/3. Rendering.html new file mode 100644 index 0000000..1cba3b9 --- /dev/null +++ b/docs/manual/guide/3. Rendering.html @@ -0,0 +1,31 @@ + + + + 3. Rendering + + + +

3. Rendering

There are four services available for rendering: +

All services have the same method…

OutputStream render(Map args, OutputStream destination = new ByteArrayOutputStream())

The args define the render operation, with the bytes written to the given output stream. The given output stream is returned from the method. If no destination is provided, the render will write to a ByteArrayOutputStream that is returned.

Here are some examples:

// Get the bytes
+def bytes = gifRenderingService.render(template: '/images/coupon', model: [serial: 12345])

// Render to a file +new File("coupon.jpg").withOutputStream { outputStream -> + jpegRenderingService.render(template: '/images/coupon', model: [serial: 12345]) +}

For information on rendering to the HTTP response, see Rendering To The Response.

Basic Render Arguments

All rendering methods take a Map argument that specifies which template to render and the model to use (in most cases).

The following map arguments are common to all rendering methods: +

Template Resolution

The plugin uses the same resolution strategy as the render() method in Grails controllers and taglibs.

That is, +

If the template argument does not start with a "/", the controller argument must be provided. The methods added to controllers (e.g. renderPdf()) automatically pass the controller param for you. + + diff --git a/docs/manual/guide/4. Rendering Images.html b/docs/manual/guide/4. Rendering Images.html new file mode 100644 index 0000000..1f4bb5c --- /dev/null +++ b/docs/manual/guide/4. Rendering Images.html @@ -0,0 +1,17 @@ + + + + 4. Rendering Images + + + +

4. Rendering Images

When rendering images, the at least one dimension of the image have to be supplied. These are specified as part of the argument map. If both are provided, the image will scale accordingly. If either is not provided, it will be calculated based on the provided dimension.

The following map arguments are common to all image rendering methods: +

+ + \ No newline at end of file diff --git a/docs/manual/guide/4. Sizing.html b/docs/manual/guide/4. Sizing.html new file mode 100644 index 0000000..7693ae1 --- /dev/null +++ b/docs/manual/guide/4. Sizing.html @@ -0,0 +1,15 @@ + + + + 4. Sizing + + + +

4. Sizing

Documents

When rendering PDF documents, you can specify the page size via CSS…

<style  type="text/css">
+  @page {
+    size: 210mm 297mm;
+  }
+</style>

Images

The image rendering methods take extra arguments to control the size of the rendered image. The extra arguments are maps containing width or height keys, or both.

render

The render argument is the size of the view port that the document is rendered into. This is equivalent to the dimensions of the browser window for html rendering.

The default value for render is width: 10, height: 10000 (i.e. 10 pixels wide by 10000 pixels high).

autosize

The autosize argument specifies whether to adjust the size of the image to exactly be the rendered content.

The default value for autosize is width: true, height: true.

scale

The scale argument specifies the factor to scale the image by after initial rendering. For example, the value width: 0.5, height: 0.5 produces an image half the size of the original render.

The default value for autosize is null.

resize

The resize argument specifies the adjusted mage after initial rendering. For example, the value width: 200, height: 400 will resize the image to 200 pixels X 400 pixels regardless of the original render size.

(note that resize & scale are mutually exclusive with scale taking precedence).

The default value for resize is null. + + + diff --git a/docs/manual/guide/5. Rendering From Controllers.html b/docs/manual/guide/5. Rendering From Controllers.html new file mode 100644 index 0000000..f1a635a --- /dev/null +++ b/docs/manual/guide/5. Rendering From Controllers.html @@ -0,0 +1,20 @@ + + + + 5. Rendering From Controllers + + + +

5. Rendering From Controllers

This plugin adds the following methods to controllers: +

These methods have obvious counterparts on the pdfRenderingService. The renderArgs map takes the same parameters as it's counter part in addition to the following: +

+ + \ No newline at end of file diff --git a/docs/manual/guide/5. Rendering To The Response.html b/docs/manual/guide/5. Rendering To The Response.html new file mode 100644 index 0000000..77facf0 --- /dev/null +++ b/docs/manual/guide/5. Rendering To The Response.html @@ -0,0 +1,26 @@ + + + + 5. Rendering To The Response + + + +

5. Rendering To The Response

There are four methods added to all controllers for rendering: +

Each of the methods is equivalent to…

«format»RenderingService.render(args + [controller: this], response)

All methods take all of the arguments that their respective service's render() method take, plus some extras.

Extra Render Arguments

All rendering methods take a Map argument that specifies which template to render and the model to use (in most cases).

The following map arguments are common to all rendering methods: +

Default Content Types

The default content types are… +

Large Files/Renders

See the section on caching and performance for some other arguments that can help with large renders. + + diff --git a/docs/manual/guide/6. Caching And Performance.html b/docs/manual/guide/6. Caching And Performance.html new file mode 100644 index 0000000..5434c61 --- /dev/null +++ b/docs/manual/guide/6. Caching And Performance.html @@ -0,0 +1,29 @@ + + + + 6. Caching And Performance + + + +

6. Caching And Performance

Caching

Rendering can be an expensive operation so you may need to implement caching (using the excellent plugin)

Document Caching

Rendering works internally by creating a org.w3c.dom.Document instance from the GSP page via the xhtmlDocumentService. If you plan to render the same GSP as different output formats, you may want to cache the document.

import grails.plugin.springcache.annotations.Cacheable

class CouponDocumentService { + def xhmlDocumentService

Cacheable('couponDocumentCache') + class getDocument(serial) { + xhmlDocumentService.createDocument(template: '/coupon', model: [serial: serial]) + } +}

All of the render methods can take a document parameter instead of the usual template/model properties.

class CouponController {

def couponDocumentService

def gif = { + def serial = params.id + def document = couponDocumentService.getDocument(serial)

renderGif(filename: "${serial}.gif", document) + } +}

Byte Caching

You can take things further and actually cache the rendered bytes.

import grails.plugin.springcache.annotations.Cacheable

class CouponGifService {

def couponDocumentService + def gifRenderingService

def getGif(serial) { + def document = couponDocumentService.getDocument(serial) + def byteArrayOutputStream = gifRenderingService.gif([:], document) + byteArrayOutputStream.toByteArray() + } +}

class CouponController {

def couponGifService

def gif = { + def serial = params.id + def bytes = couponGifService.getGif(serial)

renderGif(bytes: bytes, filename: "${serial}.gif") + } +}

Avoiding Byte Copying

When rendering to the response, the content is first written to a temp buffer before being written to the response. This is so the number of bytes can be determined and the Content-Length header set (this also applies when passing the bytes directly).

This copy can be avoided and the render (or bytes) can be written directly to the response output stream. This means that the Content-Length header will not be set unless you manually specify the length via the contentLength property to the render method. + + diff --git a/docs/manual/guide/7. Inline Images.html b/docs/manual/guide/7. Inline Images.html new file mode 100644 index 0000000..2c6f599 --- /dev/null +++ b/docs/manual/guide/7. Inline Images.html @@ -0,0 +1,20 @@ + + + + 7. Inline Images + + + +

7. Inline Images

This plugin adds support for inline images via data uris This is useful for situations where the images you need to imbed in a rendered PDF or image are generated by the application itself.

For example, your application may generate barcodes that you don't necessarily want to expose but want to include in your generated PDFs or images. Using inline images, you can include the image bytes in the document to be rendered.

To make this easier, the plugin provides tags to render byte arrays as common image formats (i.e. gif, png and jpeg).

The tags are under the namespace rendering and are called inlinePng, inlineGif and inlineJpeg. They all take a single argument, bytes, which is a byte containing the raw bytes of the images. This will result in an img tag with a src attribute of a suitable data uri. Any other parameters passed to the tag will be expressed as attributes of the resultant img tag.

Here is an example of how this could be used to include a local (i.e. from the filesystem) image in a generated pdf/image.

class SomeController {

def generate = { + def file = new File("path/to/image.png") + renderPng(template: "thing", model: [imageBytes: file.bytes]) + }

}

In the view…

<html>
+    <head></head>
+    <body>
+        <p>Below is an inline image</p>
+        <rendering:inlinePng bytes="${imageBytes}" class="some-class" />
+    </body>
+</html>
+ + + diff --git a/docs/manual/guide/8. Exotic Characters.html b/docs/manual/guide/8. Exotic Characters.html new file mode 100644 index 0000000..0d00811 --- /dev/null +++ b/docs/manual/guide/8. Exotic Characters.html @@ -0,0 +1,17 @@ + + + + 8. Exotic Characters + + + +

8. Exotic Characters

In most cases, there are no issues with dealing with exotic Unicode characters. However, certain characters will not render in PDF documents without some extra work (the same problem does not exist when rendering images). This is a quirk with the way iText works, which is the library underpinning the PDF generation.

This thread explains the issue.

The solution is to register the font to use with a particular encoding. Because we are using XHTMLRenderer we can specify this in CSS as opposed to programatically registering.

@font-face {
+      src: url(path/to/arial.ttf);
+      -fs-pdf-font-embed: embed;
+      -fs-pdf-font-encoding: cp1250;
+    }
+    body {
+      font-family: "Arial Unicode MS", Arial, sans-serif;
+    }

See this page for details on these CSS directives. + + diff --git a/docs/manual/guide/index.html b/docs/manual/guide/index.html new file mode 100644 index 0000000..cda81fe --- /dev/null +++ b/docs/manual/guide/index.html @@ -0,0 +1,34 @@ + + + Grails Rendering Plugin 0.4.3 - Reference Documentation + + + + +

+ +
+

Table of Contents

+ +
+
+ +
+ + + diff --git a/docs/manual/guide/pages/1. Introduction.html b/docs/manual/guide/pages/1. Introduction.html new file mode 100644 index 0000000..6020735 --- /dev/null +++ b/docs/manual/guide/pages/1. Introduction.html @@ -0,0 +1,10 @@ + + + + 1. Introduction + + + + This plugin adds additional rendering capabilities to Grails applications via the XHTML Renderer library.

Rendering is either done directly via «format»RenderingService services ...

ByteArrayOutputStream bytes = pdfRenderingService.render(template: "/pdfs/report", model: [data: data])

Or via the render«format»() methods added to controllers ...

renderPdf(template: "/pdfs/report", model: [report: reportObject], filename: reportObject.name)

The plugin is released under the Apache License 2.0 license and is produced under the Grails Plugin Collective . + + diff --git a/docs/manual/guide/pages/2. GSP Considerations.html b/docs/manual/guide/pages/2. GSP Considerations.html new file mode 100644 index 0000000..e1a6b1b --- /dev/null +++ b/docs/manual/guide/pages/2. GSP Considerations.html @@ -0,0 +1,11 @@ + + + + 2. GSP Considerations + + + + There are a few things that you do need to be aware of when writing GSPs to be rendered via this plugin.

Link resources must be resolvable

All links to resources (e.g. images, css) must be accessible by the application . This is due to the linked resources being accessed by application and not a browser. Depending on your network config in production, this may require some special consideration.

The rendering engine resolves all relative links relative to the grails.serverURL config property.

Must be well formed

The GSP must render to well formed, valid, XHTML. If it does not, a grails.plugin.rendering.document.XmlParseException will be thrown.

Must declare DOCTYPE

Without a doctype, you are likely to get parse failures due to unresolvable entity references (e.g. &nbsp;). Be sure to declare the XHTML doctype at the start of your GSP like so ...

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+ + diff --git a/docs/manual/guide/pages/2. Writing PDF GSPs.html b/docs/manual/guide/pages/2. Writing PDF GSPs.html new file mode 100644 index 0000000..8a0765e --- /dev/null +++ b/docs/manual/guide/pages/2. Writing PDF GSPs.html @@ -0,0 +1,11 @@ + + + + 2. Writing PDF GSPs + + + + There are a few things that you do need to be aware of when writing GSPs to be rendered as PDF.

Links must be absolute

All links to resources (e.g. images, css) must be absolute and accessible by the application. This is due to the XHTML being parsed by the Flying Saucer library and not a browser, therefore relative links cannot be resolved.

The standard Grails resource and createLink tags support creating absolute links by specifying absolute: true .

Must be well formed

The GSP must render to well formed, valid, XHTML. If it does not, a grails.plugin.pdf.XmlParseException will be thrown.

Must declare DOCTYPE

Without a doctype, you are likely to get parse failures due to unresolvable entity references. Be sure to declare the XHTML doctype at the start of your GSP like so ...

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+ + \ No newline at end of file diff --git a/docs/manual/guide/pages/3. Rendering PDFs.html b/docs/manual/guide/pages/3. Rendering PDFs.html new file mode 100644 index 0000000..030488c --- /dev/null +++ b/docs/manual/guide/pages/3. Rendering PDFs.html @@ -0,0 +1,21 @@ + + + + 3. Rendering PDFs + + + + All PDF rendering methods on the pdfRenderingService take a Map argument that specifies which template to render and the model to use.

The following map arguments are common to all pdf rendering methods: +

Template Resolution

The pdf plugin uses the same resolution strategy as the render() method in Grails controllers and taglibs.

That is, +

If the template argument does not start with a "/", the controller argument must be provided. The methods added to controllers (e.g. renderPdf()) automatically pass the controller param for you. See + + \ No newline at end of file diff --git a/docs/manual/guide/pages/3. Rendering.html b/docs/manual/guide/pages/3. Rendering.html new file mode 100644 index 0000000..a31f938 --- /dev/null +++ b/docs/manual/guide/pages/3. Rendering.html @@ -0,0 +1,31 @@ + + + + 3. Rendering + + + + There are four services available for rendering: +

All services have the same method…

OutputStream render(Map args, OutputStream destination = new ByteArrayOutputStream())

The args define the render operation, with the bytes written to the given output stream. The given output stream is returned from the method. If no destination is provided, the render will write to a ByteArrayOutputStream that is returned.

Here are some examples:

// Get the bytes
+def bytes = gifRenderingService.render(template: '/images/coupon', model: [serial: 12345])

// Render to a file +new File("coupon.jpg").withOutputStream { outputStream -> + jpegRenderingService.render(template: '/images/coupon', model: [serial: 12345]) +}

For information on rendering to the HTTP response, see Rendering To The Response.

Basic Render Arguments

All rendering methods take a Map argument that specifies which template to render and the model to use (in most cases).

The following map arguments are common to all rendering methods: +

Template Resolution

The plugin uses the same resolution strategy as the render() method in Grails controllers and taglibs.

That is, +

If the template argument does not start with a "/", the controller argument must be provided. The methods added to controllers (e.g. renderPdf()) automatically pass the controller param for you. + + diff --git a/docs/manual/guide/pages/4. Rendering Images.html b/docs/manual/guide/pages/4. Rendering Images.html new file mode 100644 index 0000000..2f6b7a3 --- /dev/null +++ b/docs/manual/guide/pages/4. Rendering Images.html @@ -0,0 +1,17 @@ + + + + 4. Rendering Images + + + + When rendering images, the at least one dimension of the image have to be supplied. These are specified as part of the argument map. If both are provided, the image will scale accordingly. If either is not provided, it will be calculated based on the provided dimension.

The following map arguments are common to all image rendering methods: +

+ + \ No newline at end of file diff --git a/docs/manual/guide/pages/4. Sizing.html b/docs/manual/guide/pages/4. Sizing.html new file mode 100644 index 0000000..6c190f7 --- /dev/null +++ b/docs/manual/guide/pages/4. Sizing.html @@ -0,0 +1,15 @@ + + + + 4. Sizing + + + +

Documents

When rendering PDF documents, you can specify the page size via CSS…

<style  type="text/css">
+  @page {
+    size: 210mm 297mm;
+  }
+</style>

Images

The image rendering methods take extra arguments to control the size of the rendered image. The extra arguments are maps containing width or height keys, or both.

render

The render argument is the size of the view port that the document is rendered into. This is equivalent to the dimensions of the browser window for html rendering.

The default value for render is width: 10, height: 10000 (i.e. 10 pixels wide by 10000 pixels high).

autosize

The autosize argument specifies whether to adjust the size of the image to exactly be the rendered content.

The default value for autosize is width: true, height: true.

scale

The scale argument specifies the factor to scale the image by after initial rendering. For example, the value width: 0.5, height: 0.5 produces an image half the size of the original render.

The default value for autosize is null.

resize

The resize argument specifies the adjusted mage after initial rendering. For example, the value width: 200, height: 400 will resize the image to 200 pixels X 400 pixels regardless of the original render size.

(note that resize & scale are mutually exclusive with scale taking precedence).

The default value for resize is null. + + + diff --git a/docs/manual/guide/pages/5. Rendering From Controllers.html b/docs/manual/guide/pages/5. Rendering From Controllers.html new file mode 100644 index 0000000..d59935d --- /dev/null +++ b/docs/manual/guide/pages/5. Rendering From Controllers.html @@ -0,0 +1,20 @@ + + + + 5. Rendering From Controllers + + + + This plugin adds the following methods to controllers: +

These methods have obvious counterparts on the pdfRenderingService. The renderArgs map takes the same parameters as it's counter part in addition to the following: +

+ + \ No newline at end of file diff --git a/docs/manual/guide/pages/5. Rendering To The Response.html b/docs/manual/guide/pages/5. Rendering To The Response.html new file mode 100644 index 0000000..1a88529 --- /dev/null +++ b/docs/manual/guide/pages/5. Rendering To The Response.html @@ -0,0 +1,26 @@ + + + + 5. Rendering To The Response + + + + There are four methods added to all controllers for rendering: +

Each of the methods is equivalent to…

«format»RenderingService.render(args + [controller: this], response)

All methods take all of the arguments that their respective service's render() method take, plus some extras.

Extra Render Arguments

All rendering methods take a Map argument that specifies which template to render and the model to use (in most cases).

The following map arguments are common to all rendering methods: +

Default Content Types

The default content types are… +

Large Files/Renders

See the section on caching and performance for some other arguments that can help with large renders. + + diff --git a/docs/manual/guide/pages/6. Caching And Performance.html b/docs/manual/guide/pages/6. Caching And Performance.html new file mode 100644 index 0000000..4e90f5a --- /dev/null +++ b/docs/manual/guide/pages/6. Caching And Performance.html @@ -0,0 +1,29 @@ + + + + 6. Caching And Performance + + + +

Caching

Rendering can be an expensive operation so you may need to implement caching (using the excellent plugin)

Document Caching

Rendering works internally by creating a org.w3c.dom.Document instance from the GSP page via the xhtmlDocumentService. If you plan to render the same GSP as different output formats, you may want to cache the document.

import grails.plugin.springcache.annotations.Cacheable

class CouponDocumentService { + def xhmlDocumentService

Cacheable('couponDocumentCache') + class getDocument(serial) { + xhmlDocumentService.createDocument(template: '/coupon', model: [serial: serial]) + } +}

All of the render methods can take a document parameter instead of the usual template/model properties.

class CouponController {

def couponDocumentService

def gif = { + def serial = params.id + def document = couponDocumentService.getDocument(serial)

renderGif(filename: "${serial}.gif", document) + } +}

Byte Caching

You can take things further and actually cache the rendered bytes.

import grails.plugin.springcache.annotations.Cacheable

class CouponGifService {

def couponDocumentService + def gifRenderingService

def getGif(serial) { + def document = couponDocumentService.getDocument(serial) + def byteArrayOutputStream = gifRenderingService.gif([:], document) + byteArrayOutputStream.toByteArray() + } +}

class CouponController {

def couponGifService

def gif = { + def serial = params.id + def bytes = couponGifService.getGif(serial)

renderGif(bytes: bytes, filename: "${serial}.gif") + } +}

Avoiding Byte Copying

When rendering to the response, the content is first written to a temp buffer before being written to the response. This is so the number of bytes can be determined and the Content-Length header set (this also applies when passing the bytes directly).

This copy can be avoided and the render (or bytes) can be written directly to the response output stream. This means that the Content-Length header will not be set unless you manually specify the length via the contentLength property to the render method. + + diff --git a/docs/manual/guide/pages/7. Inline Images.html b/docs/manual/guide/pages/7. Inline Images.html new file mode 100644 index 0000000..3026720 --- /dev/null +++ b/docs/manual/guide/pages/7. Inline Images.html @@ -0,0 +1,20 @@ + + + + 7. Inline Images + + + + This plugin adds support for inline images via data uris This is useful for situations where the images you need to imbed in a rendered PDF or image are generated by the application itself.

For example, your application may generate barcodes that you don't necessarily want to expose but want to include in your generated PDFs or images. Using inline images, you can include the image bytes in the document to be rendered.

To make this easier, the plugin provides tags to render byte arrays as common image formats (i.e. gif, png and jpeg).

The tags are under the namespace rendering and are called inlinePng, inlineGif and inlineJpeg. They all take a single argument, bytes, which is a byte containing the raw bytes of the images. This will result in an img tag with a src attribute of a suitable data uri. Any other parameters passed to the tag will be expressed as attributes of the resultant img tag.

Here is an example of how this could be used to include a local (i.e. from the filesystem) image in a generated pdf/image.

class SomeController {

def generate = { + def file = new File("path/to/image.png") + renderPng(template: "thing", model: [imageBytes: file.bytes]) + }

}

In the view…

<html>
+    <head></head>
+    <body>
+        <p>Below is an inline image</p>
+        <rendering:inlinePng bytes="${imageBytes}" class="some-class" />
+    </body>
+</html>
+ + + diff --git a/docs/manual/guide/pages/8. Exotic Characters.html b/docs/manual/guide/pages/8. Exotic Characters.html new file mode 100644 index 0000000..d10c4ef --- /dev/null +++ b/docs/manual/guide/pages/8. Exotic Characters.html @@ -0,0 +1,17 @@ + + + + 8. Exotic Characters + + + + In most cases, there are no issues with dealing with exotic Unicode characters. However, certain characters will not render in PDF documents without some extra work (the same problem does not exist when rendering images). This is a quirk with the way iText works, which is the library underpinning the PDF generation.

This thread explains the issue.

The solution is to register the font to use with a particular encoding. Because we are using XHTMLRenderer we can specify this in CSS as opposed to programatically registering.

@font-face {
+      src: url(path/to/arial.ttf);
+      -fs-pdf-font-embed: embed;
+      -fs-pdf-font-encoding: cp1250;
+    }
+    body {
+      font-family: "Arial Unicode MS", Arial, sans-serif;
+    }

See this page for details on these CSS directives. + + diff --git a/docs/manual/guide/single.html b/docs/manual/guide/single.html new file mode 100644 index 0000000..6052f28 --- /dev/null +++ b/docs/manual/guide/single.html @@ -0,0 +1,113 @@ + + + Grails Rendering Plugin 0.4.3 - Reference Documentation + + + + +

+ +
+

Table of Contents

+ +
+
+

1. Introduction

This plugin adds additional rendering capabilities to Grails applications via the XHTML Renderer library.

Rendering is either done directly via «format»RenderingService services ...

ByteArrayOutputStream bytes = pdfRenderingService.render(template: "/pdfs/report", model: [data: data])

Or via the render«format»() methods added to controllers ...

renderPdf(template: "/pdfs/report", model: [report: reportObject], filename: reportObject.name)

The plugin is released under the Apache License 2.0 license and is produced under the Grails Plugin Collective .

2. GSP Considerations

There are a few things that you do need to be aware of when writing GSPs to be rendered via this plugin.

Link resources must be resolvable

All links to resources (e.g. images, css) must be accessible by the application . This is due to the linked resources being accessed by application and not a browser. Depending on your network config in production, this may require some special consideration.

The rendering engine resolves all relative links relative to the grails.serverURL config property.

Must be well formed

The GSP must render to well formed, valid, XHTML. If it does not, a grails.plugin.rendering.document.XmlParseException will be thrown.

Must declare DOCTYPE

Without a doctype, you are likely to get parse failures due to unresolvable entity references (e.g. &nbsp;). Be sure to declare the XHTML doctype at the start of your GSP like so ...

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

3. Rendering

There are four services available for rendering: +

All services have the same method…

OutputStream render(Map args, OutputStream destination = new ByteArrayOutputStream())

The args define the render operation, with the bytes written to the given output stream. The given output stream is returned from the method. If no destination is provided, the render will write to a ByteArrayOutputStream that is returned.

Here are some examples:

// Get the bytes
+def bytes = gifRenderingService.render(template: '/images/coupon', model: [serial: 12345])

// Render to a file +new File("coupon.jpg").withOutputStream { outputStream -> + jpegRenderingService.render(template: '/images/coupon', model: [serial: 12345]) +}

For information on rendering to the HTTP response, see Rendering To The Response.

Basic Render Arguments

All rendering methods take a Map argument that specifies which template to render and the model to use (in most cases).

The following map arguments are common to all rendering methods: +

Template Resolution

The plugin uses the same resolution strategy as the render() method in Grails controllers and taglibs.

That is, +

If the template argument does not start with a "/", the controller argument must be provided. The methods added to controllers (e.g. renderPdf()) automatically pass the controller param for you.

4. Sizing

Documents

When rendering PDF documents, you can specify the page size via CSS…

<style  type="text/css">
+  @page {
+    size: 210mm 297mm;
+  }
+</style>

Images

The image rendering methods take extra arguments to control the size of the rendered image. The extra arguments are maps containing width or height keys, or both.

render

The render argument is the size of the view port that the document is rendered into. This is equivalent to the dimensions of the browser window for html rendering.

The default value for render is width: 10, height: 10000 (i.e. 10 pixels wide by 10000 pixels high).

autosize

The autosize argument specifies whether to adjust the size of the image to exactly be the rendered content.

The default value for autosize is width: true, height: true.

scale

The scale argument specifies the factor to scale the image by after initial rendering. For example, the value width: 0.5, height: 0.5 produces an image half the size of the original render.

The default value for autosize is null.

resize

The resize argument specifies the adjusted mage after initial rendering. For example, the value width: 200, height: 400 will resize the image to 200 pixels X 400 pixels regardless of the original render size.

(note that resize & scale are mutually exclusive with scale taking precedence).

The default value for resize is null. +

5. Rendering To The Response

There are four methods added to all controllers for rendering: +

Each of the methods is equivalent to…

«format»RenderingService.render(args + [controller: this], response)

All methods take all of the arguments that their respective service's render() method take, plus some extras.

Extra Render Arguments

All rendering methods take a Map argument that specifies which template to render and the model to use (in most cases).

The following map arguments are common to all rendering methods: +

Default Content Types

The default content types are… +

Large Files/Renders

See the section on caching and performance for some other arguments that can help with large renders.

6. Caching And Performance

Caching

Rendering can be an expensive operation so you may need to implement caching (using the excellent plugin)

Document Caching

Rendering works internally by creating a org.w3c.dom.Document instance from the GSP page via the xhtmlDocumentService. If you plan to render the same GSP as different output formats, you may want to cache the document.

import grails.plugin.springcache.annotations.Cacheable

class CouponDocumentService { + def xhmlDocumentService

Cacheable('couponDocumentCache') + class getDocument(serial) { + xhmlDocumentService.createDocument(template: '/coupon', model: [serial: serial]) + } +}

All of the render methods can take a document parameter instead of the usual template/model properties.

class CouponController {

def couponDocumentService

def gif = { + def serial = params.id + def document = couponDocumentService.getDocument(serial)

renderGif(filename: "${serial}.gif", document) + } +}

Byte Caching

You can take things further and actually cache the rendered bytes.

import grails.plugin.springcache.annotations.Cacheable

class CouponGifService {

def couponDocumentService + def gifRenderingService

def getGif(serial) { + def document = couponDocumentService.getDocument(serial) + def byteArrayOutputStream = gifRenderingService.gif([:], document) + byteArrayOutputStream.toByteArray() + } +}

class CouponController {

def couponGifService

def gif = { + def serial = params.id + def bytes = couponGifService.getGif(serial)

renderGif(bytes: bytes, filename: "${serial}.gif") + } +}

Avoiding Byte Copying

When rendering to the response, the content is first written to a temp buffer before being written to the response. This is so the number of bytes can be determined and the Content-Length header set (this also applies when passing the bytes directly).

This copy can be avoided and the render (or bytes) can be written directly to the response output stream. This means that the Content-Length header will not be set unless you manually specify the length via the contentLength property to the render method.

7. Inline Images

This plugin adds support for inline images via data uris This is useful for situations where the images you need to imbed in a rendered PDF or image are generated by the application itself.

For example, your application may generate barcodes that you don't necessarily want to expose but want to include in your generated PDFs or images. Using inline images, you can include the image bytes in the document to be rendered.

To make this easier, the plugin provides tags to render byte arrays as common image formats (i.e. gif, png and jpeg).

The tags are under the namespace rendering and are called inlinePng, inlineGif and inlineJpeg. They all take a single argument, bytes, which is a byte containing the raw bytes of the images. This will result in an img tag with a src attribute of a suitable data uri. Any other parameters passed to the tag will be expressed as attributes of the resultant img tag.

Here is an example of how this could be used to include a local (i.e. from the filesystem) image in a generated pdf/image.

class SomeController {

def generate = { + def file = new File("path/to/image.png") + renderPng(template: "thing", model: [imageBytes: file.bytes]) + }

}

In the view…

<html>
+    <head></head>
+    <body>
+        <p>Below is an inline image</p>
+        <rendering:inlinePng bytes="${imageBytes}" class="some-class" />
+    </body>
+</html>
+

8. Exotic Characters

In most cases, there are no issues with dealing with exotic Unicode characters. However, certain characters will not render in PDF documents without some extra work (the same problem does not exist when rendering images). This is a quirk with the way iText works, which is the library underpinning the PDF generation.

This thread explains the issue.

The solution is to register the font to use with a particular encoding. Because we are using XHTMLRenderer we can specify this in CSS as opposed to programatically registering.

@font-face {
+      src: url(path/to/arial.ttf);
+      -fs-pdf-font-embed: embed;
+      -fs-pdf-font-encoding: cp1250;
+    }
+    body {
+      font-family: "Arial Unicode MS", Arial, sans-serif;
+    }

See this page for details on these CSS directives. +

+ + + diff --git a/docs/manual/img/grails-icon.png b/docs/manual/img/grails-icon.png new file mode 100644 index 0000000..68e3678 Binary files /dev/null and b/docs/manual/img/grails-icon.png differ diff --git a/docs/manual/img/grails.png b/docs/manual/img/grails.png new file mode 100644 index 0000000..9cb734d Binary files /dev/null and b/docs/manual/img/grails.png differ diff --git a/docs/manual/img/groovy.png b/docs/manual/img/groovy.png new file mode 100644 index 0000000..2b81b49 Binary files /dev/null and b/docs/manual/img/groovy.png differ diff --git a/docs/manual/img/note.gif b/docs/manual/img/note.gif new file mode 100644 index 0000000..1c9883b Binary files /dev/null and b/docs/manual/img/note.gif differ diff --git a/docs/manual/img/springsource-logo.png b/docs/manual/img/springsource-logo.png new file mode 100644 index 0000000..ea7d8f6 Binary files /dev/null and b/docs/manual/img/springsource-logo.png differ diff --git a/docs/manual/img/warning.gif b/docs/manual/img/warning.gif new file mode 100644 index 0000000..c6acdec Binary files /dev/null and b/docs/manual/img/warning.gif differ diff --git a/docs/manual/index.html b/docs/manual/index.html new file mode 100644 index 0000000..cad56e7 --- /dev/null +++ b/docs/manual/index.html @@ -0,0 +1,15 @@ + + + Grails Rendering Plugin 0.4.3 Reference Documentation + + + + + + + <h2>Frame Alert</h2> + <p/> + This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. + + + diff --git a/docs/manual/ref/Controller/renderGif.html b/docs/manual/ref/Controller/renderGif.html new file mode 100644 index 0000000..2958a89 --- /dev/null +++ b/docs/manual/ref/Controller/renderGif.html @@ -0,0 +1,12 @@ + + + + Grails Rendering Plugin 0.4.3 - Reference Documentation + + + + +

renderGif

Purpose

Examples

foo.renderGif(map)

Description

Arguments:

* map + + + diff --git a/docs/manual/ref/Controller/renderJpeg.html b/docs/manual/ref/Controller/renderJpeg.html new file mode 100644 index 0000000..62732bf --- /dev/null +++ b/docs/manual/ref/Controller/renderJpeg.html @@ -0,0 +1,12 @@ + + + + Grails Rendering Plugin 0.4.3 - Reference Documentation + + + + +

renderJpeg

Purpose

Examples

foo.renderJpeg(map)

Description

Arguments:

* map + + + diff --git a/docs/manual/ref/Controller/renderPdf.html b/docs/manual/ref/Controller/renderPdf.html new file mode 100644 index 0000000..4a5d0f6 --- /dev/null +++ b/docs/manual/ref/Controller/renderPdf.html @@ -0,0 +1,12 @@ + + + + Grails Rendering Plugin 0.4.3 - Reference Documentation + + + + +

renderPdf

Purpose

Examples

foo.renderPdf(map)

Description

Arguments:

* map + + + diff --git a/docs/manual/ref/Controller/renderPdfGif.html b/docs/manual/ref/Controller/renderPdfGif.html new file mode 100644 index 0000000..07bfad9 --- /dev/null +++ b/docs/manual/ref/Controller/renderPdfGif.html @@ -0,0 +1,18 @@ + + + + Grails Rendering Plugin 0.1-SNAPSHOT - Reference Documentation + + + +

renderPdfGif

Purpose

Renders a GSP template as a PDF, then renders it as a GIF image to the http response, setting the content-type to image/gif

Examples

class MyController {
+    def report = {
+        def reportObject = reportService.getReport(params)
+        renderPdfGif(template: "/pdfs/report", model: [report: reportObject], filename: reportObject.name, width: 200)
+    }
+}

Description

OutputStream renderPdfGif(Map renderArgs)

Parameters: +

+ + \ No newline at end of file diff --git a/docs/manual/ref/Controller/renderPdfImage.html b/docs/manual/ref/Controller/renderPdfImage.html new file mode 100644 index 0000000..9d50ca9 --- /dev/null +++ b/docs/manual/ref/Controller/renderPdfImage.html @@ -0,0 +1,20 @@ + + + + Grails Rendering Plugin 0.1-SNAPSHOT - Reference Documentation + + + +

renderPdfImage

Purpose

Renders a GSP template as a PDF, then renders it as an image in particular format to the http response.

Examples

class MyController {
+    def report = {
+        def reportObject = reportService.getReport(params)
+        renderPdfImage("jpeg", "image/jpeg", template: "/pdfs/report", model: [report: reportObject], filename: reportObject.name)
+    }
+}

Description

OutputStream renderPdfImage(Map renderArgs, String imageType, String contentType)

Parameters: +

+ + \ No newline at end of file diff --git a/docs/manual/ref/Controller/renderPdfJpeg.html b/docs/manual/ref/Controller/renderPdfJpeg.html new file mode 100644 index 0000000..c583560 --- /dev/null +++ b/docs/manual/ref/Controller/renderPdfJpeg.html @@ -0,0 +1,18 @@ + + + + Grails Rendering Plugin 0.1-SNAPSHOT - Reference Documentation + + + +

renderPdfJpeg

Purpose

Renders a GSP template as a PDF, then renders it as a JPEG image to the http response, setting the content-type to image/jpeg

Examples

class MyController {
+    def report = {
+        def reportObject = reportService.getReport(params)
+        renderPdfJpeg(template: "/pdfs/report", model: [report: reportObject], filename: reportObject.name, width: 200)
+    }
+}

Description

OutputStream renderPdfJpeg(Map renderArgs)

Parameters: +

+ + \ No newline at end of file diff --git a/docs/manual/ref/Controller/renderPdfPng.html b/docs/manual/ref/Controller/renderPdfPng.html new file mode 100644 index 0000000..31cdacb --- /dev/null +++ b/docs/manual/ref/Controller/renderPdfPng.html @@ -0,0 +1,18 @@ + + + + Grails Rendering Plugin 0.1-SNAPSHOT - Reference Documentation + + + +

renderPdfPng

Purpose

Renders a GSP template as a PDF, then renders it as a PNG image to the http response, setting the content-type to image/png

Examples

class MyController {
+    def report = {
+        def reportObject = reportService.getReport(params)
+        renderPdfPng(template: "/pdfs/report", model: [report: reportObject], filename: reportObject.name, width: 200)
+    }
+}

Description

OutputStream renderPdfPng(Map renderArgs)

Parameters: +

+ + \ No newline at end of file diff --git a/docs/manual/ref/Controller/renderPng.html b/docs/manual/ref/Controller/renderPng.html new file mode 100644 index 0000000..9f35686 --- /dev/null +++ b/docs/manual/ref/Controller/renderPng.html @@ -0,0 +1,12 @@ + + + + Grails Rendering Plugin 0.4.3 - Reference Documentation + + + + +

renderPng

Purpose

Examples

foo.renderPng(map)

Description

Arguments:

* map + + + diff --git a/docs/manual/ref/PdfRenderService/gif.html b/docs/manual/ref/PdfRenderService/gif.html new file mode 100644 index 0000000..a6e6828 --- /dev/null +++ b/docs/manual/ref/PdfRenderService/gif.html @@ -0,0 +1,17 @@ + + + + Grails Rendering Plugin 0.1-SNAPSHOT - Reference Documentation + + + +

gif

Purpose

Renders a GSP template as a PDF, then renders it as a GIF image to an OutputStream.

Examples

def gifBytes = pdfRenderingService.jpeg(template: "/pdfs/report", model: [report: report])

Description

OutputStream gif(Map renderArgs, OutputStream destination = new ByteArrayOutputStream())

Parameters: +

Return Value: +

+ + \ No newline at end of file diff --git a/docs/manual/ref/PdfRenderService/image.html b/docs/manual/ref/PdfRenderService/image.html new file mode 100644 index 0000000..f06e609 --- /dev/null +++ b/docs/manual/ref/PdfRenderService/image.html @@ -0,0 +1,24 @@ + + + + Grails Rendering Plugin 0.1-SNAPSHOT - Reference Documentation + + + +

image

Purpose

Renders a GSP template as a PDF, then renders it to a BufferedImage or as particular format into an output stream.

Examples

def bufferedImage = pdfRenderingService.image(template: "/pdfs/report", model: [report: report])

def jpegBytes = pdfRenderingService.image("jpeg", template: "/pdfs/report", model: [report: report])

Description

BufferedImage render(Map renderArgs)

Parameters: +

Return Value: +

OutputStream image(Map renderArgs, String imageType, OutputStream destination = new ByteArrayOutputStream())

Parameters: +

Return Value: +

+ + \ No newline at end of file diff --git a/docs/manual/ref/PdfRenderService/jpeg.html b/docs/manual/ref/PdfRenderService/jpeg.html new file mode 100644 index 0000000..0ec3184 --- /dev/null +++ b/docs/manual/ref/PdfRenderService/jpeg.html @@ -0,0 +1,17 @@ + + + + Grails Rendering Plugin 0.1-SNAPSHOT - Reference Documentation + + + +

jpeg

Purpose

Renders a GSP template as a PDF, then renders it as a JPEG image to an OutputStream.

Examples

def jpegBytes = pdfRenderingService.jpeg(template: "/pdfs/report", model: [report: report])

Description

OutputStream jpeg(Map renderArgs, OutputStream destination = new ByteArrayOutputStream())

Parameters: +

Return Value: +

+ + \ No newline at end of file diff --git a/docs/manual/ref/PdfRenderService/png.html b/docs/manual/ref/PdfRenderService/png.html new file mode 100644 index 0000000..59b619b --- /dev/null +++ b/docs/manual/ref/PdfRenderService/png.html @@ -0,0 +1,17 @@ + + + + Grails Rendering Plugin 0.1-SNAPSHOT - Reference Documentation + + + +

png

Purpose

Renders a GSP template as a PDF, then renders it as a PNG image to an OutputStream.

Examples

def pngBytes = pdfRenderingService.png(template: "/pdfs/report", model: [report: report])

Description

OutputStream png(Map renderArgs, OutputStream destination = new ByteArrayOutputStream())

Parameters: +

Return Value: +

+ + \ No newline at end of file diff --git a/docs/manual/ref/PdfRenderService/render.html b/docs/manual/ref/PdfRenderService/render.html new file mode 100644 index 0000000..0dcc6c3 --- /dev/null +++ b/docs/manual/ref/PdfRenderService/render.html @@ -0,0 +1,22 @@ + + + + Grails Rendering Plugin 0.1-SNAPSHOT - Reference Documentation + + + +

render

Purpose

Renders a GSP template as a PDF to an OutputStream .

Examples

class ReportService {

def pdfRenderingService

def writeReportToFile(Report report, File file) { + def outputStream = new FileOutputStream(file) + pdfRenderingService.render(template: "/pdfs/report", model: [report: report], outputStream) + }

}

If no output stream is provided, the PDF will be written to a ByteArrayOutputStream that will be returned.

class ReportService {

def pdfRenderingService

def renderReport(Report report) { + ByteArrayOutputStream bytes = pdfRenderingService.render(template: "/pdfs/report", model: [report: report]) + }

}

Description

OutputStream render(Map renderArgs, OutputStream destination = new ByteArrayOutputStream())

Parameters: +

Return Value: +

+ + \ No newline at end of file diff --git a/docs/manual/ref/menu.html b/docs/manual/ref/menu.html new file mode 100644 index 0000000..223fee5 --- /dev/null +++ b/docs/manual/ref/menu.html @@ -0,0 +1,13 @@ + + + + menu + + + +

+

Controller

+ + diff --git a/docs/manual/ref/topleft.html b/docs/manual/ref/topleft.html new file mode 100644 index 0000000..0822478 --- /dev/null +++ b/docs/manual/ref/topleft.html @@ -0,0 +1,8 @@ + + +
+ +

Reference Guide

+
+ + diff --git a/grails-app/conf/BuildConfig.groovy b/grails-app/conf/BuildConfig.groovy index b6cf689..9309f64 100644 --- a/grails-app/conf/BuildConfig.groovy +++ b/grails-app/conf/BuildConfig.groovy @@ -17,32 +17,33 @@ grails.project.class.dir = "target/classes" grails.project.test.class.dir = "target/test-classes" grails.project.test.reports.dir = "target/test-reports" grails.project.dependency.resolution = { - inherits( "global" ) - log "warn" - repositories { - grailsPlugins() - grailsHome() - mavenCentral() - mavenRepo "http://download.java.net/maven/2/" - } - dependencies { - compile("org.xhtmlrenderer:core-renderer:R8") - compile("com.lowagie:itext:2.1.0") - test("org.apache.pdfbox:pdfbox:1.0.0") { - exclude 'jempbox' - exported = false - } - } - plugins { - compile(":spring-events:1.0", ":tomcat:$grailsVersion", ":hibernate:$grailsVersion") { - exported = false - } - test(":spock:0.5-groovy-1.7") { - exported = false - } - } + inherits("global") + log "warn" + repositories { + grailsPlugins() + grailsHome() + grailsCentral() + mavenCentral() + mavenRepo "http://download.java.net/maven/2/" + } + dependencies { + compile("org.xhtmlrenderer:core-renderer:R8") + compile("com.lowagie:itext:2.1.7") + test("org.apache.pdfbox:pdfbox:1.0.0") { + exclude 'jempbox' + exported = false + } + } + plugins { + compile(":spring-events:1.1", ":tomcat:$grailsVersion", ":hibernate:$grailsVersion") { + exported = false + } + test(":spock:0.5-groovy-1.7") { + exported = false + } + } } if (appName == "grails-rendering") { - grails.plugin.location.'pdf-plugin-test' = "plugins/pdf-plugin-test" + grails.plugin.location.'pdf-plugin-test' = "plugins/pdf-plugin-test" } diff --git a/grails-app/conf/Config.groovy b/grails-app/conf/Config.groovy index bb85403..d5d2187 100644 --- a/grails-app/conf/Config.groovy +++ b/grails-app/conf/Config.groovy @@ -28,4 +28,5 @@ grails { } } -grails.views.gsp.encoding = "UTF-8" \ No newline at end of file +grails.views.gsp.encoding = "UTF-8" +grails.views.default.codec="none" // none, html, base64 diff --git a/grails-app/i18n/messages.properties b/grails-app/i18n/messages.properties new file mode 100644 index 0000000..e69de29 diff --git a/grails-app/services/grails/plugin/rendering/RenderingService.groovy b/grails-app/services/grails/plugin/rendering/RenderingService.groovy index 4c178e3..4495c12 100644 --- a/grails-app/services/grails/plugin/rendering/RenderingService.groovy +++ b/grails-app/services/grails/plugin/rendering/RenderingService.groovy @@ -31,7 +31,7 @@ abstract class RenderingService { abstract protected getDefaultContentType() OutputStream render(Map args, OutputStream outputStream = new ByteArrayOutputStream()) { - def document = args.document ?: xhtmlDocumentService.createDocument(args) + Document document = args.document ?: xhtmlDocumentService.createDocument(args) render(args, document, outputStream) } diff --git a/grails-app/services/grails/plugin/rendering/document/XhtmlDocumentService.groovy b/grails-app/services/grails/plugin/rendering/document/XhtmlDocumentService.groovy index 5bdaf92..acbbbf9 100644 --- a/grails-app/services/grails/plugin/rendering/document/XhtmlDocumentService.groovy +++ b/grails-app/services/grails/plugin/rendering/document/XhtmlDocumentService.groovy @@ -17,109 +17,139 @@ package grails.plugin.rendering.document import org.w3c.dom.Document import org.xml.sax.InputSource -import org.xhtmlrenderer.resource.XMLResource -import groovy.text.Template -import org.springframework.web.context.request.RequestContextHolder -import org.codehaus.groovy.grails.web.context.ServletContextHolder -import org.springframework.web.context.support.WebApplicationContextUtils import org.codehaus.groovy.grails.plugins.PluginManagerHolder -import grails.util.GrailsWebUtil import grails.util.GrailsUtil +import javax.xml.parsers.DocumentBuilderFactory + +import org.xml.sax.EntityResolver +import org.xml.sax.SAXException + class XhtmlDocumentService { - static transactional = false - - def groovyPagesTemplateEngine - def groovyPagesUriService - def grailsApplication - - Document createDocument(Map args) { - createDocument(generateXhtml(args)) - } - - protected createDocument(String xhtml) { - try { - createDocument(new InputSource(new StringReader(xhtml))) - } catch (XmlParseException e) { - if (log.errorEnabled) { - GrailsUtil.deepSanitize(e) - log.error("caught xml parse exception for xhtml: $xhtml", e) - } - throw new XmlParseException(xhtml, e) - } - } - - protected createDocument(InputSource xhtml) { - try { - XMLResource.load(xhtml).document - } catch (Exception e) { - if (log.errorEnabled) { - GrailsUtil.deepSanitize(e) - log.error("xml parse exception for input source: $xhtml", e) - } - throw new XmlParseException(xhtml, e) - } - } - - protected generateXhtml(Map args) { - def xhtmlWriter = new StringWriter() - - RenderEnvironment.with(grailsApplication.mainContext, xhtmlWriter) { - createTemplate(args).make(args.model).writeTo(xhtmlWriter) - } - - def xhtml = xhtmlWriter.toString() - xhtmlWriter.close() - - if (log.debugEnabled) { - log.debug("xhtml for $args -- \n ${xhtml}") - } - - xhtml - } - - protected createTemplate(Map args) { - if (!args.template) { - throw new IllegalArgumentException("The 'template' argument must be specified") - } - def templateName = args.template - - if (templateName.startsWith("/")) { - if (!args.controller) { - args.controller = "" - } - } else { - if (!args.controller) { - throw new IllegalArgumentException("template names must start with '/' if controller is not provided") - } - } - - def contextPath = getContextPath(args) - def controllerName = args.controller instanceof CharSequence ? args.controller : groovyPagesUriService.getLogicalControllerName(args.controller) - def templateUri = groovyPagesUriService.getTemplateURI(controllerName, templateName) - def uris = ["$contextPath/$templateUri", "$contextPath/grails-app/views/$templateUri"] as String[] - def template = groovyPagesTemplateEngine.createTemplateForUri(uris) - - if (!template) { - throw new UnknownTemplateException(args.template, args.plugin) - } - - template - } - - protected getContextPath(args) { - def contextPath = args.contextPath?.toString() ?: "" - def pluginName = args.plugin - - if (pluginName) { - def plugin = PluginManagerHolder.pluginManager.getGrailsPlugin(pluginName) - if (plugin && !plugin.isBasePlugin()) { - contextPath = plugin.pluginPath - } - } - - contextPath - } + static transactional = false + + def groovyPagesTemplateEngine + def groovyPagesUriService + def grailsApplication + + Document createDocument(Map args) { + createDocument(generateXhtml(args)) + } + + protected Document createDocument(String xhtml) { + try { + createDocument(new InputSource(new StringReader(xhtml))) + } catch (XmlParseException e) { + if (log.errorEnabled) { + GrailsUtil.deepSanitize(e) + log.error("caught xml parse exception for xhtml: $xhtml", e) + } + throw new XmlParseException(xhtml, e) + } + } + + protected Document createDocument(InputSource xhtml) { + try { + // Don't do stupid things like grab DTD from the internet. + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setNamespaceAware(false); + dbf.setValidating(false); + dbf.setFeature("http://xml.org/sax/features/namespaces", false); + dbf.setFeature("http://xml.org/sax/features/validation", false); + dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false); + dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); + return dbf.newDocumentBuilder().parse(xhtml) + + } catch (Exception e) { + if (log.errorEnabled) { + GrailsUtil.deepSanitize(e) + log.error("xml parse exception for input source: $xhtml", e) + } + throw new XmlParseException(xhtml, e) + } + } + + protected String generateXhtml(Map args) { + def xhtmlWriter = new StringWriter() + + RenderEnvironment.with(grailsApplication.mainContext, xhtmlWriter) { + createTemplate(args).make(args.model).writeTo(xhtmlWriter) + } + + String xhtml = xhtmlWriter.toString() + xhtmlWriter.close() + + if (log.debugEnabled) { + log.debug("xhtml for $args -- \n ${xhtml}") + } + + xhtml + } + + protected createTemplate(Map args) { + if (!args.template) { + throw new IllegalArgumentException("The 'template' argument must be specified") + } + def templateName = args.template + + if (templateName.startsWith("/")) { + if (!args.controller) { + args.controller = "" + } + } else { + if (!args.controller) { + throw new IllegalArgumentException("template names must start with '/' if controller is not provided") + } + } + + def contextPath = getContextPath(args) + def controllerName = args.controller instanceof CharSequence ? args.controller : groovyPagesUriService.getLogicalControllerName(args.controller) + def templateUri = groovyPagesUriService.getTemplateURI(controllerName, templateName) + def uris = ["$contextPath/$templateUri", "$contextPath/grails-app/views/$templateUri"] as String[] + def template = groovyPagesTemplateEngine.createTemplateForUri(uris) + + if (!template) { + throw new UnknownTemplateException(args.template, args.plugin) + } + + template + } + + protected getContextPath(args) { + def contextPath = args.contextPath?.toString() ?: "" + def pluginName = args.plugin + + if (pluginName) { + def plugin = PluginManagerHolder.pluginManager.getGrailsPlugin(pluginName) + if (plugin && !plugin.isBasePlugin()) { + contextPath = plugin.pluginPath + } + } + + contextPath + } + + // Does flying saucer have its own version of this? TODO - not used. + public static class MyResolver implements EntityResolver { + public InputSource resolveEntity(String publicId, String systemID) + throws SAXException { + System.out.println("publicID = " + publicId + ", systemID=" + systemID); + try { + if (publicId.equals("-//W3C// DTD XHTML 1.0 Strict//EN")) { + return new InputSource(new FileInputStream("xhtml1-strict.dtd")); + } else if (publicId.equals("-// W3C//ENTITIES Latin 1 for XHTML//EN")) { + return new InputSource(new FileInputStream("xhtml-lat1.ent")); + } else if (publicId.equals("-// W3C//ENTITIES Symbols for XHTML//EN")) { + return new InputSource(new FileInputStream("xhtml-symbol.ent")); + } else if (publicId.equals("-// W3C//ENTITIES Special for XHTML//EN")) { + return new InputSource(new FileInputStream("xhtml-special.ent")); + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + } } \ No newline at end of file diff --git a/index.markdown b/index.markdown new file mode 100644 index 0000000..9f8c643 --- /dev/null +++ b/index.markdown @@ -0,0 +1,4 @@ +--- +layout: main +title: Grails Rendering Plugin +--- diff --git a/main.html.tmpl b/main.html.tmpl new file mode 100644 index 0000000..7e847bf --- /dev/null +++ b/main.html.tmpl @@ -0,0 +1,57 @@ + + + + + + {{ page.title }} @ GitHub + + + + Fork me on GitHub + +
+

{{ page.title }}

+ + + + + + + + + + + + + + +
Version${version} +
Grails Version${grailsVersion}
Author${author}
+
+

Documentation

+ +
+
{{ content }}
+ + diff --git a/src/docs/guide/2. GSP Considerations.gdoc b/src/docs/guide/2. GSP Considerations.gdoc index 349488e..a2c4a39 100644 --- a/src/docs/guide/2. GSP Considerations.gdoc +++ b/src/docs/guide/2. GSP Considerations.gdoc @@ -1,4 +1,4 @@ -There are a few things that you do need to be aware of when writing GSPs to be rendered via this plugin. +The rendering plugin does render images and CSS. The following needs to be considered for resources to be rendered successfully. h3. Link resources must be resolvable @@ -17,4 +17,35 @@ Without a doctype, you are likely to get parse failures due to unresolvable enti {code:lang=xml} -{code} \ No newline at end of file +{code} + +h3. CSS Images + +It is recommended that CSS images be rendered inline. Standard CSS has a feature that allows images that are converted to base64. For example: + +{code} +base64 -w0 image.gif > image.b64 + +{code} + +To be displayed inline: + +{code:css} +body { + background: transparent url(data:image/gif;base64,R0lGODlhJwTPAPcAAP ... Ds=) no-repeat; +} +{code} + + +h3. Grails Config + +The value of app in @Config.groovy@ needs to match the running instance. The serverURL value is passed to the renderer and used to resolve relative paths. The port number must also match. + +{code} +grails.serverURL = "http://localhost:8084/${appName}" +{code} + + +h3. Relative Images + +Seems to be a bug where I have to put @appName@ at the start of each resource. \ No newline at end of file diff --git a/src/java/xhtml-lat1.ent b/src/java/xhtml-lat1.ent new file mode 100644 index 0000000..ffee223 --- /dev/null +++ b/src/java/xhtml-lat1.ent @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/xhtml-special.ent b/src/java/xhtml-special.ent new file mode 100644 index 0000000..ca358b2 --- /dev/null +++ b/src/java/xhtml-special.ent @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/xhtml-symbol.ent b/src/java/xhtml-symbol.ent new file mode 100644 index 0000000..63c2abf --- /dev/null +++ b/src/java/xhtml-symbol.ent @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/xhtml1-frameset.dtd b/src/java/xhtml1-frameset.dtd new file mode 100644 index 0000000..dd115e5 --- /dev/null +++ b/src/java/xhtml1-frameset.dtd @@ -0,0 +1,1236 @@ + + + + + + %HTMLlat1; + + + %HTMLsymbol; + + + + %HTMLspecial; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/xhtml1-strict.dtd b/src/java/xhtml1-strict.dtd new file mode 100644 index 0000000..ad7aaf2 --- /dev/null +++ b/src/java/xhtml1-strict.dtd @@ -0,0 +1,980 @@ + + + + + + %HTMLlat1; + + + %HTMLsymbol; + + + + %HTMLspecial; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/xhtml1-transitional.dtd b/src/java/xhtml1-transitional.dtd new file mode 100644 index 0000000..e46cec4 --- /dev/null +++ b/src/java/xhtml1-transitional.dtd @@ -0,0 +1,1203 @@ + + + + + + %HTMLlat1; + + + %HTMLsymbol; + + + + %HTMLspecial; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web-app/WEB-INF/tld/grails.tld b/web-app/WEB-INF/tld/grails.tld index 868ec1f..9bd036b 100644 --- a/web-app/WEB-INF/tld/grails.tld +++ b/web-app/WEB-INF/tld/grails.tld @@ -4,12 +4,11 @@ xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> - The Grails (Groovy on Rails) custom tag library + The Grails custom tag library 0.2 grails http://grails.codehaus.org/tags - link org.codehaus.groovy.grails.web.taglib.jsp.JspLinkTag diff --git a/web-app/css/main.css b/web-app/css/main.css new file mode 100644 index 0000000..591305a --- /dev/null +++ b/web-app/css/main.css @@ -0,0 +1,273 @@ +html * { + margin: 0; + /*padding: 0; SELECT NOT DISPLAYED CORRECTLY IN FIREFOX */ +} + +/* GENERAL */ + +.spinner { + padding: 5px; + position: absolute; + right: 0; +} + +body { + background: #fff; + color: #333; + font: 11px verdana, arial, helvetica, sans-serif; +} +#grailsLogo { + padding:20px; +} + +a:link, a:visited, a:hover { + color: #666; + font-weight: bold; + text-decoration: none; +} + +h1 { + color: #48802c; + font-weight: normal; + font-size: 16px; + margin: .8em 0 .3em 0; +} + +ul { + padding-left: 15px; +} + +input, select, textarea { + background-color: #fcfcfc; + border: 1px solid #ccc; + font: 11px verdana, arial, helvetica, sans-serif; + margin: 2px 0; + padding: 2px 4px; +} +select { + padding: 2px 2px 2px 0; +} +textarea { + width: 250px; + height: 150px; + vertical-align: top; +} + +input:focus, select:focus, textarea:focus { + border: 1px solid #b2d1ff; +} + +.body { + float: left; + margin: 0 15px 10px 15px; +} + +/* NAVIGATION MENU */ + +.nav { + background: #fff url(../images/skin/shadow.jpg) bottom repeat-x; + border: 1px solid #ccc; + border-style: solid none solid none; + margin-top: 5px; + padding: 7px 12px; +} + +.menuButton { + font-size: 10px; + padding: 0 5px; +} +.menuButton a { + color: #333; + padding: 4px 6px; +} +.menuButton a.home { + background: url(../images/skin/house.png) center left no-repeat; + color: #333; + padding-left: 25px; +} +.menuButton a.list { + background: url(../images/skin/database_table.png) center left no-repeat; + color: #333; + padding-left: 25px; +} +.menuButton a.create { + background: url(../images/skin/database_add.png) center left no-repeat; + color: #333; + padding-left: 25px; +} + +/* MESSAGES AND ERRORS */ + +.message { + background: #f3f8fc url(../images/skin/information.png) 8px 50% no-repeat; + border: 1px solid #b2d1ff; + color: #006dba; + margin: 10px 0 5px 0; + padding: 5px 5px 5px 30px +} + +div.errors { + background: #fff3f3; + border: 1px solid red; + color: #cc0000; + margin: 10px 0 5px 0; + padding: 5px 0 5px 0; +} +div.errors ul { + list-style: none; + padding: 0; +} +div.errors li { + background: url(../images/skin/exclamation.png) 8px 0% no-repeat; + line-height: 16px; + padding-left: 30px; +} + +td.errors select { + border: 1px solid red; +} +td.errors input { + border: 1px solid red; +} +td.errors textarea { + border: 1px solid red; +} + +/* TABLES */ + +table { + border: 1px solid #ccc; + width: 100% +} +tr { + border: 0; +} +td, th { + font: 11px verdana, arial, helvetica, sans-serif; + line-height: 12px; + padding: 5px 6px; + text-align: left; + vertical-align: top; +} +th { + background: #fff url(../images/skin/shadow.jpg); + color: #666; + font-size: 11px; + font-weight: bold; + line-height: 17px; + padding: 2px 6px; +} +th a:link, th a:visited, th a:hover { + color: #333; + display: block; + font-size: 10px; + text-decoration: none; + width: 100%; +} +th.asc a, th.desc a { + background-position: right; + background-repeat: no-repeat; +} +th.asc a { + background-image: url(../images/skin/sorted_asc.gif); +} +th.desc a { + background-image: url(../images/skin/sorted_desc.gif); +} + +.odd { + background: #f7f7f7; +} +.even { + background: #fff; +} + +/* LIST */ + +.list table { + border-collapse: collapse; +} +.list th, .list td { + border-left: 1px solid #ddd; +} +.list th:hover, .list tr:hover { + background: #b2d1ff; +} + +/* PAGINATION */ + +.paginateButtons { + background: #fff url(../images/skin/shadow.jpg) bottom repeat-x; + border: 1px solid #ccc; + border-top: 0; + color: #666; + font-size: 10px; + overflow: hidden; + padding: 10px 3px; +} +.paginateButtons a { + background: #fff; + border: 1px solid #ccc; + border-color: #ccc #aaa #aaa #ccc; + color: #666; + margin: 0 3px; + padding: 2px 6px; +} +.paginateButtons span { + padding: 2px 3px; +} + +/* DIALOG */ + +.dialog table { + padding: 5px 0; +} + +.prop { + padding: 5px; +} +.prop .name { + text-align: left; + width: 15%; + white-space: nowrap; +} +.prop .value { + text-align: left; + width: 85%; +} + +/* ACTION BUTTONS */ + +.buttons { + background: #fff url(../images/skin/shadow.jpg) bottom repeat-x; + border: 1px solid #ccc; + color: #666; + font-size: 10px; + margin-top: 5px; + overflow: hidden; + padding: 0; +} + +.buttons input { + background: #fff; + border: 0; + color: #333; + cursor: pointer; + font-size: 10px; + font-weight: bold; + margin-left: 3px; + overflow: visible; + padding: 2px 6px; +} +.buttons input.delete { + background: transparent url(../images/skin/database_delete.png) 5px 50% no-repeat; + padding-left: 28px; +} +.buttons input.edit { + background: transparent url(../images/skin/database_edit.png) 5px 50% no-repeat; + padding-left: 28px; +} +.buttons input.save { + background: transparent url(../images/skin/database_save.png) 5px 50% no-repeat; + padding-left: 28px; +} diff --git a/web-app/images/favicon.ico b/web-app/images/favicon.ico new file mode 100644 index 0000000..3dfcb92 Binary files /dev/null and b/web-app/images/favicon.ico differ diff --git a/web-app/images/grails_logo.jpg b/web-app/images/grails_logo.jpg new file mode 100644 index 0000000..8be657c Binary files /dev/null and b/web-app/images/grails_logo.jpg differ diff --git a/web-app/images/grails_logo.png b/web-app/images/grails_logo.png new file mode 100644 index 0000000..9836b93 Binary files /dev/null and b/web-app/images/grails_logo.png differ diff --git a/web-app/images/leftnav_btm.png b/web-app/images/leftnav_btm.png new file mode 100644 index 0000000..582e1eb Binary files /dev/null and b/web-app/images/leftnav_btm.png differ diff --git a/web-app/images/leftnav_midstretch.png b/web-app/images/leftnav_midstretch.png new file mode 100644 index 0000000..3cb8a51 Binary files /dev/null and b/web-app/images/leftnav_midstretch.png differ diff --git a/web-app/images/leftnav_top.png b/web-app/images/leftnav_top.png new file mode 100644 index 0000000..6afec7d Binary files /dev/null and b/web-app/images/leftnav_top.png differ diff --git a/web-app/images/skin/database_add.png b/web-app/images/skin/database_add.png new file mode 100644 index 0000000..802bd6c Binary files /dev/null and b/web-app/images/skin/database_add.png differ diff --git a/web-app/images/skin/database_delete.png b/web-app/images/skin/database_delete.png new file mode 100644 index 0000000..cce652e Binary files /dev/null and b/web-app/images/skin/database_delete.png differ diff --git a/web-app/images/skin/database_edit.png b/web-app/images/skin/database_edit.png new file mode 100644 index 0000000..e501b66 Binary files /dev/null and b/web-app/images/skin/database_edit.png differ diff --git a/web-app/images/skin/database_save.png b/web-app/images/skin/database_save.png new file mode 100644 index 0000000..44c06dd Binary files /dev/null and b/web-app/images/skin/database_save.png differ diff --git a/web-app/images/skin/database_table.png b/web-app/images/skin/database_table.png new file mode 100644 index 0000000..693709c Binary files /dev/null and b/web-app/images/skin/database_table.png differ diff --git a/web-app/images/skin/exclamation.png b/web-app/images/skin/exclamation.png new file mode 100644 index 0000000..c37bd06 Binary files /dev/null and b/web-app/images/skin/exclamation.png differ diff --git a/web-app/images/skin/house.png b/web-app/images/skin/house.png new file mode 100644 index 0000000..fed6221 Binary files /dev/null and b/web-app/images/skin/house.png differ diff --git a/web-app/images/skin/information.png b/web-app/images/skin/information.png new file mode 100644 index 0000000..12cd1ae Binary files /dev/null and b/web-app/images/skin/information.png differ diff --git a/web-app/images/skin/shadow.jpg b/web-app/images/skin/shadow.jpg new file mode 100644 index 0000000..b7ed44f Binary files /dev/null and b/web-app/images/skin/shadow.jpg differ diff --git a/web-app/images/skin/sorted_asc.gif b/web-app/images/skin/sorted_asc.gif new file mode 100644 index 0000000..6b179c1 Binary files /dev/null and b/web-app/images/skin/sorted_asc.gif differ diff --git a/web-app/images/skin/sorted_desc.gif b/web-app/images/skin/sorted_desc.gif new file mode 100644 index 0000000..38b3a01 Binary files /dev/null and b/web-app/images/skin/sorted_desc.gif differ diff --git a/web-app/images/spinner.gif b/web-app/images/spinner.gif new file mode 100644 index 0000000..1ed786f Binary files /dev/null and b/web-app/images/spinner.gif differ diff --git a/web-app/images/springsource.png b/web-app/images/springsource.png new file mode 100644 index 0000000..e806d00 Binary files /dev/null and b/web-app/images/springsource.png differ diff --git a/web-app/js/application.js b/web-app/js/application.js new file mode 100644 index 0000000..1bf791a --- /dev/null +++ b/web-app/js/application.js @@ -0,0 +1,13 @@ +var Ajax; +if (Ajax && (Ajax != null)) { + Ajax.Responders.register({ + onCreate: function() { + if($('spinner') && Ajax.activeRequestCount>0) + Effect.Appear('spinner',{duration:0.5,queue:'end'}); + }, + onComplete: function() { + if($('spinner') && Ajax.activeRequestCount==0) + Effect.Fade('spinner',{duration:0.5,queue:'end'}); + } + }); +} diff --git a/web-app/js/prototype/animation.js b/web-app/js/prototype/animation.js new file mode 100644 index 0000000..c35c2a5 --- /dev/null +++ b/web-app/js/prototype/animation.js @@ -0,0 +1,7 @@ +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 0.10.0 +*/ +YAHOO.util.Anim=function(el,attributes,duration,method){if(el){this.init(el,attributes,duration,method);}};YAHOO.util.Anim.prototype={doMethod:function(attribute,start,end){return this.method(this.currentFrame,start,end-start,this.totalFrames);},setAttribute:function(attribute,val,unit){YAHOO.util.Dom.setStyle(this.getEl(),attribute,val+unit);},getAttribute:function(attribute){return parseFloat(YAHOO.util.Dom.getStyle(this.getEl(),attribute));},defaultUnit:'px',defaultUnits:{opacity:' '},init:function(el,attributes,duration,method){var isAnimated=false;var startTime=null;var endTime=null;var actualFrames=0;var defaultValues={};el=YAHOO.util.Dom.get(el);this.attributes=attributes||{};this.duration=duration||1;this.method=method||YAHOO.util.Easing.easeNone;this.useSeconds=true;this.currentFrame=0;this.totalFrames=YAHOO.util.AnimMgr.fps;this.getEl=function(){return el;};this.setDefault=function(attribute,val){if(val.constructor!=Array&&(val=='auto'||isNaN(val))){switch(attribute){case'width':val=el.clientWidth||el.offsetWidth;break;case'height':val=el.clientHeight||el.offsetHeight;break;case'left':if(YAHOO.util.Dom.getStyle(el,'position')=='absolute'){val=el.offsetLeft;}else{val=0;}break;case'top':if(YAHOO.util.Dom.getStyle(el,'position')=='absolute'){val=el.offsetTop;}else{val=0;}break;default:val=0;}}defaultValues[attribute]=val;};this.getDefault=function(attribute){return defaultValues[attribute];};this.isAnimated=function(){return isAnimated;};this.getStartTime=function(){return startTime;};this.animate=function(){if(this.isAnimated()){return false;}this.onStart.fire();this._onStart.fire();this.totalFrames=(this.useSeconds)?Math.ceil(YAHOO.util.AnimMgr.fps*this.duration):this.duration;YAHOO.util.AnimMgr.registerElement(this);var attributes=this.attributes;var el=this.getEl();var val;for(var attribute in attributes){val=this.getAttribute(attribute);this.setDefault(attribute,val);}isAnimated=true;actualFrames=0;startTime=new Date();};this.stop=function(){if(!this.isAnimated()){return false;}this.currentFrame=0;endTime=new Date();var data={time:endTime,duration:endTime-startTime,frames:actualFrames,fps:actualFrames/this.duration};isAnimated=false;actualFrames=0;this.onComplete.fire(data);};var onTween=function(){var start;var end=null;var val;var unit;var attributes=this['attributes'];for(var attribute in attributes){unit=attributes[attribute]['unit']||this.defaultUnits[attribute]||this.defaultUnit;if(typeof attributes[attribute]['from']!='undefined'){start=attributes[attribute]['from'];}else{start=this.getDefault(attribute);}if(typeof attributes[attribute]['to']!='undefined'){end=attributes[attribute]['to'];}else if(typeof attributes[attribute]['by']!='undefined'){if(start.constructor==Array){end=[];for(var i=0,len=start.length;i0&&isFinite(tweak)){if(tween.currentFrame+tweak>=frames){tweak=frames-(frame+1);}tween.currentFrame+=tweak;}};};YAHOO.util.Bezier=new function(){this.getPosition=function(points,t){var n=points.length;var tmp=[];for(var i=0;i0&&control[0].constructor!=Array){control=[control];}if(YAHOO.util.Dom.getStyle(this.getEl(),'position')=='static'){YAHOO.util.Dom.setStyle(this.getEl(),'position','relative');}if(typeof attributes['points']['from']!='undefined'){YAHOO.util.Dom.setXY(this.getEl(),attributes['points']['from']);start=this.getAttribute('points');}else if((start[0]===0||start[1]===0)){YAHOO.util.Dom.setXY(this.getEl(),YAHOO.util.Dom.getXY(this.getEl()));start=this.getAttribute('points');}var i,len;if(typeof attributes['points']['to']!='undefined'){end=translateValues(attributes['points']['to'],this);for(i=0,len=control.length;i0){translatedPoints=translatedPoints.concat(control);}translatedPoints[translatedPoints.length]=end;}};this._onStart.subscribe(onStart);};YAHOO.util.Scroll=function(el,attributes,duration,method){if(el){YAHOO.util.Anim.call(this,el,attributes,duration,method);}};YAHOO.util.Scroll.prototype=new YAHOO.util.Anim();YAHOO.util.Scroll.prototype.defaultUnits.scroll=' ';YAHOO.util.Scroll.prototype.doMethod=function(attribute,start,end){var val=null;if(attribute=='scroll'){val=[this.method(this.currentFrame,start[0],end[0]-start[0],this.totalFrames),this.method(this.currentFrame,start[1],end[1]-start[1],this.totalFrames)];}else{val=this.method(this.currentFrame,start,end-start,this.totalFrames);}return val;};YAHOO.util.Scroll.prototype.getAttribute=function(attribute){var val=null;var el=this.getEl();if(attribute=='scroll'){val=[el.scrollLeft,el.scrollTop];}else{val=parseFloat(YAHOO.util.Dom.getStyle(el,attribute));}return val;};YAHOO.util.Scroll.prototype.setAttribute=function(attribute,val,unit){var el=this.getEl();if(attribute=='scroll'){el.scrollLeft=val[0];el.scrollTop=val[1];}else{YAHOO.util.Dom.setStyle(el,attribute,val+unit);}}; diff --git a/web-app/js/prototype/builder.js b/web-app/js/prototype/builder.js new file mode 100644 index 0000000..f1f42b9 --- /dev/null +++ b/web-app/js/prototype/builder.js @@ -0,0 +1,136 @@ +// script.aculo.us builder.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 + +// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// +// script.aculo.us is freely distributable under the terms of an MIT-style license. +// For details, see the script.aculo.us web site: http://script.aculo.us/ + +var Builder = { + NODEMAP: { + AREA: 'map', + CAPTION: 'table', + COL: 'table', + COLGROUP: 'table', + LEGEND: 'fieldset', + OPTGROUP: 'select', + OPTION: 'select', + PARAM: 'object', + TBODY: 'table', + TD: 'table', + TFOOT: 'table', + TH: 'table', + THEAD: 'table', + TR: 'table' + }, + // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken, + // due to a Firefox bug + node: function(elementName) { + elementName = elementName.toUpperCase(); + + // try innerHTML approach + var parentTag = this.NODEMAP[elementName] || 'div'; + var parentElement = document.createElement(parentTag); + try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707 + parentElement.innerHTML = "<" + elementName + ">"; + } catch(e) {} + var element = parentElement.firstChild || null; + + // see if browser added wrapping tags + if(element && (element.tagName.toUpperCase() != elementName)) + element = element.getElementsByTagName(elementName)[0]; + + // fallback to createElement approach + if(!element) element = document.createElement(elementName); + + // abort if nothing could be created + if(!element) return; + + // attributes (or text) + if(arguments[1]) + if(this._isStringOrNumber(arguments[1]) || + (arguments[1] instanceof Array) || + arguments[1].tagName) { + this._children(element, arguments[1]); + } else { + var attrs = this._attributes(arguments[1]); + if(attrs.length) { + try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707 + parentElement.innerHTML = "<" +elementName + " " + + attrs + ">"; + } catch(e) {} + element = parentElement.firstChild || null; + // workaround firefox 1.0.X bug + if(!element) { + element = document.createElement(elementName); + for(attr in arguments[1]) + element[attr == 'class' ? 'className' : attr] = arguments[1][attr]; + } + if(element.tagName.toUpperCase() != elementName) + element = parentElement.getElementsByTagName(elementName)[0]; + } + } + + // text, or array of children + if(arguments[2]) + this._children(element, arguments[2]); + + return $(element); + }, + _text: function(text) { + return document.createTextNode(text); + }, + + ATTR_MAP: { + 'className': 'class', + 'htmlFor': 'for' + }, + + _attributes: function(attributes) { + var attrs = []; + for(attribute in attributes) + attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) + + '="' + attributes[attribute].toString().escapeHTML().gsub(/"/,'"') + '"'); + return attrs.join(" "); + }, + _children: function(element, children) { + if(children.tagName) { + element.appendChild(children); + return; + } + if(typeof children=='object') { // array can hold nodes and text + children.flatten().each( function(e) { + if(typeof e=='object') + element.appendChild(e); + else + if(Builder._isStringOrNumber(e)) + element.appendChild(Builder._text(e)); + }); + } else + if(Builder._isStringOrNumber(children)) + element.appendChild(Builder._text(children)); + }, + _isStringOrNumber: function(param) { + return(typeof param=='string' || typeof param=='number'); + }, + build: function(html) { + var element = this.node('div'); + $(element).update(html.strip()); + return element.down(); + }, + dump: function(scope) { + if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope + + var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " + + "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " + + "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+ + "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+ + "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+ + "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/); + + tags.each( function(tag){ + scope[tag] = function() { + return Builder.node.apply(Builder, [tag].concat($A(arguments))); + }; + }); + } +}; \ No newline at end of file diff --git a/web-app/js/prototype/controls.js b/web-app/js/prototype/controls.js new file mode 100644 index 0000000..7392fb6 --- /dev/null +++ b/web-app/js/prototype/controls.js @@ -0,0 +1,965 @@ +// script.aculo.us controls.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 + +// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// (c) 2005-2009 Ivan Krstic (http://blogs.law.harvard.edu/ivan) +// (c) 2005-2009 Jon Tirsen (http://www.tirsen.com) +// Contributors: +// Richard Livsey +// Rahul Bhargava +// Rob Wills +// +// script.aculo.us is freely distributable under the terms of an MIT-style license. +// For details, see the script.aculo.us web site: http://script.aculo.us/ + +// Autocompleter.Base handles all the autocompletion functionality +// that's independent of the data source for autocompletion. This +// includes drawing the autocompletion menu, observing keyboard +// and mouse events, and similar. +// +// Specific autocompleters need to provide, at the very least, +// a getUpdatedChoices function that will be invoked every time +// the text inside the monitored textbox changes. This method +// should get the text for which to provide autocompletion by +// invoking this.getToken(), NOT by directly accessing +// this.element.value. This is to allow incremental tokenized +// autocompletion. Specific auto-completion logic (AJAX, etc) +// belongs in getUpdatedChoices. +// +// Tokenized incremental autocompletion is enabled automatically +// when an autocompleter is instantiated with the 'tokens' option +// in the options parameter, e.g.: +// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' }); +// will incrementally autocomplete with a comma as the token. +// Additionally, ',' in the above example can be replaced with +// a token array, e.g. { tokens: [',', '\n'] } which +// enables autocompletion on multiple tokens. This is most +// useful when one of the tokens is \n (a newline), as it +// allows smart autocompletion after linebreaks. + +if(typeof Effect == 'undefined') + throw("controls.js requires including script.aculo.us' effects.js library"); + +var Autocompleter = { }; +Autocompleter.Base = Class.create({ + baseInitialize: function(element, update, options) { + element = $(element); + this.element = element; + this.update = $(update); + this.hasFocus = false; + this.changed = false; + this.active = false; + this.index = 0; + this.entryCount = 0; + this.oldElementValue = this.element.value; + + if(this.setOptions) + this.setOptions(options); + else + this.options = options || { }; + + this.options.paramName = this.options.paramName || this.element.name; + this.options.tokens = this.options.tokens || []; + this.options.frequency = this.options.frequency || 0.4; + this.options.minChars = this.options.minChars || 1; + this.options.onShow = this.options.onShow || + function(element, update){ + if(!update.style.position || update.style.position=='absolute') { + update.style.position = 'absolute'; + Position.clone(element, update, { + setHeight: false, + offsetTop: element.offsetHeight + }); + } + Effect.Appear(update,{duration:0.15}); + }; + this.options.onHide = this.options.onHide || + function(element, update){ new Effect.Fade(update,{duration:0.15}) }; + + if(typeof(this.options.tokens) == 'string') + this.options.tokens = new Array(this.options.tokens); + // Force carriage returns as token delimiters anyway + if (!this.options.tokens.include('\n')) + this.options.tokens.push('\n'); + + this.observer = null; + + this.element.setAttribute('autocomplete','off'); + + Element.hide(this.update); + + Event.observe(this.element, 'blur', this.onBlur.bindAsEventListener(this)); + Event.observe(this.element, 'keydown', this.onKeyPress.bindAsEventListener(this)); + }, + + show: function() { + if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update); + if(!this.iefix && + (Prototype.Browser.IE) && + (Element.getStyle(this.update, 'position')=='absolute')) { + new Insertion.After(this.update, + ''); + this.iefix = $(this.update.id+'_iefix'); + } + if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50); + }, + + fixIEOverlapping: function() { + Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)}); + this.iefix.style.zIndex = 1; + this.update.style.zIndex = 2; + Element.show(this.iefix); + }, + + hide: function() { + this.stopIndicator(); + if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update); + if(this.iefix) Element.hide(this.iefix); + }, + + startIndicator: function() { + if(this.options.indicator) Element.show(this.options.indicator); + }, + + stopIndicator: function() { + if(this.options.indicator) Element.hide(this.options.indicator); + }, + + onKeyPress: function(event) { + if(this.active) + switch(event.keyCode) { + case Event.KEY_TAB: + case Event.KEY_RETURN: + this.selectEntry(); + Event.stop(event); + case Event.KEY_ESC: + this.hide(); + this.active = false; + Event.stop(event); + return; + case Event.KEY_LEFT: + case Event.KEY_RIGHT: + return; + case Event.KEY_UP: + this.markPrevious(); + this.render(); + Event.stop(event); + return; + case Event.KEY_DOWN: + this.markNext(); + this.render(); + Event.stop(event); + return; + } + else + if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN || + (Prototype.Browser.WebKit > 0 && event.keyCode == 0)) return; + + this.changed = true; + this.hasFocus = true; + + if(this.observer) clearTimeout(this.observer); + this.observer = + setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000); + }, + + activate: function() { + this.changed = false; + this.hasFocus = true; + this.getUpdatedChoices(); + }, + + onHover: function(event) { + var element = Event.findElement(event, 'LI'); + if(this.index != element.autocompleteIndex) + { + this.index = element.autocompleteIndex; + this.render(); + } + Event.stop(event); + }, + + onClick: function(event) { + var element = Event.findElement(event, 'LI'); + this.index = element.autocompleteIndex; + this.selectEntry(); + this.hide(); + }, + + onBlur: function(event) { + // needed to make click events working + setTimeout(this.hide.bind(this), 250); + this.hasFocus = false; + this.active = false; + }, + + render: function() { + if(this.entryCount > 0) { + for (var i = 0; i < this.entryCount; i++) + this.index==i ? + Element.addClassName(this.getEntry(i),"selected") : + Element.removeClassName(this.getEntry(i),"selected"); + if(this.hasFocus) { + this.show(); + this.active = true; + } + } else { + this.active = false; + this.hide(); + } + }, + + markPrevious: function() { + if(this.index > 0) this.index--; + else this.index = this.entryCount-1; + this.getEntry(this.index).scrollIntoView(true); + }, + + markNext: function() { + if(this.index < this.entryCount-1) this.index++; + else this.index = 0; + this.getEntry(this.index).scrollIntoView(false); + }, + + getEntry: function(index) { + return this.update.firstChild.childNodes[index]; + }, + + getCurrentEntry: function() { + return this.getEntry(this.index); + }, + + selectEntry: function() { + this.active = false; + this.updateElement(this.getCurrentEntry()); + }, + + updateElement: function(selectedElement) { + if (this.options.updateElement) { + this.options.updateElement(selectedElement); + return; + } + var value = ''; + if (this.options.select) { + var nodes = $(selectedElement).select('.' + this.options.select) || []; + if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select); + } else + value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal'); + + var bounds = this.getTokenBounds(); + if (bounds[0] != -1) { + var newValue = this.element.value.substr(0, bounds[0]); + var whitespace = this.element.value.substr(bounds[0]).match(/^\s+/); + if (whitespace) + newValue += whitespace[0]; + this.element.value = newValue + value + this.element.value.substr(bounds[1]); + } else { + this.element.value = value; + } + this.oldElementValue = this.element.value; + this.element.focus(); + + if (this.options.afterUpdateElement) + this.options.afterUpdateElement(this.element, selectedElement); + }, + + updateChoices: function(choices) { + if(!this.changed && this.hasFocus) { + this.update.innerHTML = choices; + Element.cleanWhitespace(this.update); + Element.cleanWhitespace(this.update.down()); + + if(this.update.firstChild && this.update.down().childNodes) { + this.entryCount = + this.update.down().childNodes.length; + for (var i = 0; i < this.entryCount; i++) { + var entry = this.getEntry(i); + entry.autocompleteIndex = i; + this.addObservers(entry); + } + } else { + this.entryCount = 0; + } + + this.stopIndicator(); + this.index = 0; + + if(this.entryCount==1 && this.options.autoSelect) { + this.selectEntry(); + this.hide(); + } else { + this.render(); + } + } + }, + + addObservers: function(element) { + Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this)); + Event.observe(element, "click", this.onClick.bindAsEventListener(this)); + }, + + onObserverEvent: function() { + this.changed = false; + this.tokenBounds = null; + if(this.getToken().length>=this.options.minChars) { + this.getUpdatedChoices(); + } else { + this.active = false; + this.hide(); + } + this.oldElementValue = this.element.value; + }, + + getToken: function() { + var bounds = this.getTokenBounds(); + return this.element.value.substring(bounds[0], bounds[1]).strip(); + }, + + getTokenBounds: function() { + if (null != this.tokenBounds) return this.tokenBounds; + var value = this.element.value; + if (value.strip().empty()) return [-1, 0]; + var diff = arguments.callee.getFirstDifferencePos(value, this.oldElementValue); + var offset = (diff == this.oldElementValue.length ? 1 : 0); + var prevTokenPos = -1, nextTokenPos = value.length; + var tp; + for (var index = 0, l = this.options.tokens.length; index < l; ++index) { + tp = value.lastIndexOf(this.options.tokens[index], diff + offset - 1); + if (tp > prevTokenPos) prevTokenPos = tp; + tp = value.indexOf(this.options.tokens[index], diff + offset); + if (-1 != tp && tp < nextTokenPos) nextTokenPos = tp; + } + return (this.tokenBounds = [prevTokenPos + 1, nextTokenPos]); + } +}); + +Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = function(newS, oldS) { + var boundary = Math.min(newS.length, oldS.length); + for (var index = 0; index < boundary; ++index) + if (newS[index] != oldS[index]) + return index; + return boundary; +}; + +Ajax.Autocompleter = Class.create(Autocompleter.Base, { + initialize: function(element, update, url, options) { + this.baseInitialize(element, update, options); + this.options.asynchronous = true; + this.options.onComplete = this.onComplete.bind(this); + this.options.defaultParams = this.options.parameters || null; + this.url = url; + }, + + getUpdatedChoices: function() { + this.startIndicator(); + + var entry = encodeURIComponent(this.options.paramName) + '=' + + encodeURIComponent(this.getToken()); + + this.options.parameters = this.options.callback ? + this.options.callback(this.element, entry) : entry; + + if(this.options.defaultParams) + this.options.parameters += '&' + this.options.defaultParams; + + new Ajax.Request(this.url, this.options); + }, + + onComplete: function(request) { + this.updateChoices(request.responseText); + } +}); + +// The local array autocompleter. Used when you'd prefer to +// inject an array of autocompletion options into the page, rather +// than sending out Ajax queries, which can be quite slow sometimes. +// +// The constructor takes four parameters. The first two are, as usual, +// the id of the monitored textbox, and id of the autocompletion menu. +// The third is the array you want to autocomplete from, and the fourth +// is the options block. +// +// Extra local autocompletion options: +// - choices - How many autocompletion choices to offer +// +// - partialSearch - If false, the autocompleter will match entered +// text only at the beginning of strings in the +// autocomplete array. Defaults to true, which will +// match text at the beginning of any *word* in the +// strings in the autocomplete array. If you want to +// search anywhere in the string, additionally set +// the option fullSearch to true (default: off). +// +// - fullSsearch - Search anywhere in autocomplete array strings. +// +// - partialChars - How many characters to enter before triggering +// a partial match (unlike minChars, which defines +// how many characters are required to do any match +// at all). Defaults to 2. +// +// - ignoreCase - Whether to ignore case when autocompleting. +// Defaults to true. +// +// It's possible to pass in a custom function as the 'selector' +// option, if you prefer to write your own autocompletion logic. +// In that case, the other options above will not apply unless +// you support them. + +Autocompleter.Local = Class.create(Autocompleter.Base, { + initialize: function(element, update, array, options) { + this.baseInitialize(element, update, options); + this.options.array = array; + }, + + getUpdatedChoices: function() { + this.updateChoices(this.options.selector(this)); + }, + + setOptions: function(options) { + this.options = Object.extend({ + choices: 10, + partialSearch: true, + partialChars: 2, + ignoreCase: true, + fullSearch: false, + selector: function(instance) { + var ret = []; // Beginning matches + var partial = []; // Inside matches + var entry = instance.getToken(); + var count = 0; + + for (var i = 0; i < instance.options.array.length && + ret.length < instance.options.choices ; i++) { + + var elem = instance.options.array[i]; + var foundPos = instance.options.ignoreCase ? + elem.toLowerCase().indexOf(entry.toLowerCase()) : + elem.indexOf(entry); + + while (foundPos != -1) { + if (foundPos == 0 && elem.length != entry.length) { + ret.push("
  • " + elem.substr(0, entry.length) + "" + + elem.substr(entry.length) + "
  • "); + break; + } else if (entry.length >= instance.options.partialChars && + instance.options.partialSearch && foundPos != -1) { + if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) { + partial.push("
  • " + elem.substr(0, foundPos) + "" + + elem.substr(foundPos, entry.length) + "" + elem.substr( + foundPos + entry.length) + "
  • "); + break; + } + } + + foundPos = instance.options.ignoreCase ? + elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : + elem.indexOf(entry, foundPos + 1); + + } + } + if (partial.length) + ret = ret.concat(partial.slice(0, instance.options.choices - ret.length)); + return "
      " + ret.join('') + "
    "; + } + }, options || { }); + } +}); + +// AJAX in-place editor and collection editor +// Full rewrite by Christophe Porteneuve (April 2007). + +// Use this if you notice weird scrolling problems on some browsers, +// the DOM might be a bit confused when this gets called so do this +// waits 1 ms (with setTimeout) until it does the activation +Field.scrollFreeActivate = function(field) { + setTimeout(function() { + Field.activate(field); + }, 1); +}; + +Ajax.InPlaceEditor = Class.create({ + initialize: function(element, url, options) { + this.url = url; + this.element = element = $(element); + this.prepareOptions(); + this._controls = { }; + arguments.callee.dealWithDeprecatedOptions(options); // DEPRECATION LAYER!!! + Object.extend(this.options, options || { }); + if (!this.options.formId && this.element.id) { + this.options.formId = this.element.id + '-inplaceeditor'; + if ($(this.options.formId)) + this.options.formId = ''; + } + if (this.options.externalControl) + this.options.externalControl = $(this.options.externalControl); + if (!this.options.externalControl) + this.options.externalControlOnly = false; + this._originalBackground = this.element.getStyle('background-color') || 'transparent'; + this.element.title = this.options.clickToEditText; + this._boundCancelHandler = this.handleFormCancellation.bind(this); + this._boundComplete = (this.options.onComplete || Prototype.emptyFunction).bind(this); + this._boundFailureHandler = this.handleAJAXFailure.bind(this); + this._boundSubmitHandler = this.handleFormSubmission.bind(this); + this._boundWrapperHandler = this.wrapUp.bind(this); + this.registerListeners(); + }, + checkForEscapeOrReturn: function(e) { + if (!this._editing || e.ctrlKey || e.altKey || e.shiftKey) return; + if (Event.KEY_ESC == e.keyCode) + this.handleFormCancellation(e); + else if (Event.KEY_RETURN == e.keyCode) + this.handleFormSubmission(e); + }, + createControl: function(mode, handler, extraClasses) { + var control = this.options[mode + 'Control']; + var text = this.options[mode + 'Text']; + if ('button' == control) { + var btn = document.createElement('input'); + btn.type = 'submit'; + btn.value = text; + btn.className = 'editor_' + mode + '_button'; + if ('cancel' == mode) + btn.onclick = this._boundCancelHandler; + this._form.appendChild(btn); + this._controls[mode] = btn; + } else if ('link' == control) { + var link = document.createElement('a'); + link.href = '#'; + link.appendChild(document.createTextNode(text)); + link.onclick = 'cancel' == mode ? this._boundCancelHandler : this._boundSubmitHandler; + link.className = 'editor_' + mode + '_link'; + if (extraClasses) + link.className += ' ' + extraClasses; + this._form.appendChild(link); + this._controls[mode] = link; + } + }, + createEditField: function() { + var text = (this.options.loadTextURL ? this.options.loadingText : this.getText()); + var fld; + if (1 >= this.options.rows && !/\r|\n/.test(this.getText())) { + fld = document.createElement('input'); + fld.type = 'text'; + var size = this.options.size || this.options.cols || 0; + if (0 < size) fld.size = size; + } else { + fld = document.createElement('textarea'); + fld.rows = (1 >= this.options.rows ? this.options.autoRows : this.options.rows); + fld.cols = this.options.cols || 40; + } + fld.name = this.options.paramName; + fld.value = text; // No HTML breaks conversion anymore + fld.className = 'editor_field'; + if (this.options.submitOnBlur) + fld.onblur = this._boundSubmitHandler; + this._controls.editor = fld; + if (this.options.loadTextURL) + this.loadExternalText(); + this._form.appendChild(this._controls.editor); + }, + createForm: function() { + var ipe = this; + function addText(mode, condition) { + var text = ipe.options['text' + mode + 'Controls']; + if (!text || condition === false) return; + ipe._form.appendChild(document.createTextNode(text)); + }; + this._form = $(document.createElement('form')); + this._form.id = this.options.formId; + this._form.addClassName(this.options.formClassName); + this._form.onsubmit = this._boundSubmitHandler; + this.createEditField(); + if ('textarea' == this._controls.editor.tagName.toLowerCase()) + this._form.appendChild(document.createElement('br')); + if (this.options.onFormCustomization) + this.options.onFormCustomization(this, this._form); + addText('Before', this.options.okControl || this.options.cancelControl); + this.createControl('ok', this._boundSubmitHandler); + addText('Between', this.options.okControl && this.options.cancelControl); + this.createControl('cancel', this._boundCancelHandler, 'editor_cancel'); + addText('After', this.options.okControl || this.options.cancelControl); + }, + destroy: function() { + if (this._oldInnerHTML) + this.element.innerHTML = this._oldInnerHTML; + this.leaveEditMode(); + this.unregisterListeners(); + }, + enterEditMode: function(e) { + if (this._saving || this._editing) return; + this._editing = true; + this.triggerCallback('onEnterEditMode'); + if (this.options.externalControl) + this.options.externalControl.hide(); + this.element.hide(); + this.createForm(); + this.element.parentNode.insertBefore(this._form, this.element); + if (!this.options.loadTextURL) + this.postProcessEditField(); + if (e) Event.stop(e); + }, + enterHover: function(e) { + if (this.options.hoverClassName) + this.element.addClassName(this.options.hoverClassName); + if (this._saving) return; + this.triggerCallback('onEnterHover'); + }, + getText: function() { + return this.element.innerHTML.unescapeHTML(); + }, + handleAJAXFailure: function(transport) { + this.triggerCallback('onFailure', transport); + if (this._oldInnerHTML) { + this.element.innerHTML = this._oldInnerHTML; + this._oldInnerHTML = null; + } + }, + handleFormCancellation: function(e) { + this.wrapUp(); + if (e) Event.stop(e); + }, + handleFormSubmission: function(e) { + var form = this._form; + var value = $F(this._controls.editor); + this.prepareSubmission(); + var params = this.options.callback(form, value) || ''; + if (Object.isString(params)) + params = params.toQueryParams(); + params.editorId = this.element.id; + if (this.options.htmlResponse) { + var options = Object.extend({ evalScripts: true }, this.options.ajaxOptions); + Object.extend(options, { + parameters: params, + onComplete: this._boundWrapperHandler, + onFailure: this._boundFailureHandler + }); + new Ajax.Updater({ success: this.element }, this.url, options); + } else { + var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); + Object.extend(options, { + parameters: params, + onComplete: this._boundWrapperHandler, + onFailure: this._boundFailureHandler + }); + new Ajax.Request(this.url, options); + } + if (e) Event.stop(e); + }, + leaveEditMode: function() { + this.element.removeClassName(this.options.savingClassName); + this.removeForm(); + this.leaveHover(); + this.element.style.backgroundColor = this._originalBackground; + this.element.show(); + if (this.options.externalControl) + this.options.externalControl.show(); + this._saving = false; + this._editing = false; + this._oldInnerHTML = null; + this.triggerCallback('onLeaveEditMode'); + }, + leaveHover: function(e) { + if (this.options.hoverClassName) + this.element.removeClassName(this.options.hoverClassName); + if (this._saving) return; + this.triggerCallback('onLeaveHover'); + }, + loadExternalText: function() { + this._form.addClassName(this.options.loadingClassName); + this._controls.editor.disabled = true; + var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); + Object.extend(options, { + parameters: 'editorId=' + encodeURIComponent(this.element.id), + onComplete: Prototype.emptyFunction, + onSuccess: function(transport) { + this._form.removeClassName(this.options.loadingClassName); + var text = transport.responseText; + if (this.options.stripLoadedTextTags) + text = text.stripTags(); + this._controls.editor.value = text; + this._controls.editor.disabled = false; + this.postProcessEditField(); + }.bind(this), + onFailure: this._boundFailureHandler + }); + new Ajax.Request(this.options.loadTextURL, options); + }, + postProcessEditField: function() { + var fpc = this.options.fieldPostCreation; + if (fpc) + $(this._controls.editor)['focus' == fpc ? 'focus' : 'activate'](); + }, + prepareOptions: function() { + this.options = Object.clone(Ajax.InPlaceEditor.DefaultOptions); + Object.extend(this.options, Ajax.InPlaceEditor.DefaultCallbacks); + [this._extraDefaultOptions].flatten().compact().each(function(defs) { + Object.extend(this.options, defs); + }.bind(this)); + }, + prepareSubmission: function() { + this._saving = true; + this.removeForm(); + this.leaveHover(); + this.showSaving(); + }, + registerListeners: function() { + this._listeners = { }; + var listener; + $H(Ajax.InPlaceEditor.Listeners).each(function(pair) { + listener = this[pair.value].bind(this); + this._listeners[pair.key] = listener; + if (!this.options.externalControlOnly) + this.element.observe(pair.key, listener); + if (this.options.externalControl) + this.options.externalControl.observe(pair.key, listener); + }.bind(this)); + }, + removeForm: function() { + if (!this._form) return; + this._form.remove(); + this._form = null; + this._controls = { }; + }, + showSaving: function() { + this._oldInnerHTML = this.element.innerHTML; + this.element.innerHTML = this.options.savingText; + this.element.addClassName(this.options.savingClassName); + this.element.style.backgroundColor = this._originalBackground; + this.element.show(); + }, + triggerCallback: function(cbName, arg) { + if ('function' == typeof this.options[cbName]) { + this.options[cbName](this, arg); + } + }, + unregisterListeners: function() { + $H(this._listeners).each(function(pair) { + if (!this.options.externalControlOnly) + this.element.stopObserving(pair.key, pair.value); + if (this.options.externalControl) + this.options.externalControl.stopObserving(pair.key, pair.value); + }.bind(this)); + }, + wrapUp: function(transport) { + this.leaveEditMode(); + // Can't use triggerCallback due to backward compatibility: requires + // binding + direct element + this._boundComplete(transport, this.element); + } +}); + +Object.extend(Ajax.InPlaceEditor.prototype, { + dispose: Ajax.InPlaceEditor.prototype.destroy +}); + +Ajax.InPlaceCollectionEditor = Class.create(Ajax.InPlaceEditor, { + initialize: function($super, element, url, options) { + this._extraDefaultOptions = Ajax.InPlaceCollectionEditor.DefaultOptions; + $super(element, url, options); + }, + + createEditField: function() { + var list = document.createElement('select'); + list.name = this.options.paramName; + list.size = 1; + this._controls.editor = list; + this._collection = this.options.collection || []; + if (this.options.loadCollectionURL) + this.loadCollection(); + else + this.checkForExternalText(); + this._form.appendChild(this._controls.editor); + }, + + loadCollection: function() { + this._form.addClassName(this.options.loadingClassName); + this.showLoadingText(this.options.loadingCollectionText); + var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); + Object.extend(options, { + parameters: 'editorId=' + encodeURIComponent(this.element.id), + onComplete: Prototype.emptyFunction, + onSuccess: function(transport) { + var js = transport.responseText.strip(); + if (!/^\[.*\]$/.test(js)) // TODO: improve sanity check + throw('Server returned an invalid collection representation.'); + this._collection = eval(js); + this.checkForExternalText(); + }.bind(this), + onFailure: this.onFailure + }); + new Ajax.Request(this.options.loadCollectionURL, options); + }, + + showLoadingText: function(text) { + this._controls.editor.disabled = true; + var tempOption = this._controls.editor.firstChild; + if (!tempOption) { + tempOption = document.createElement('option'); + tempOption.value = ''; + this._controls.editor.appendChild(tempOption); + tempOption.selected = true; + } + tempOption.update((text || '').stripScripts().stripTags()); + }, + + checkForExternalText: function() { + this._text = this.getText(); + if (this.options.loadTextURL) + this.loadExternalText(); + else + this.buildOptionList(); + }, + + loadExternalText: function() { + this.showLoadingText(this.options.loadingText); + var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); + Object.extend(options, { + parameters: 'editorId=' + encodeURIComponent(this.element.id), + onComplete: Prototype.emptyFunction, + onSuccess: function(transport) { + this._text = transport.responseText.strip(); + this.buildOptionList(); + }.bind(this), + onFailure: this.onFailure + }); + new Ajax.Request(this.options.loadTextURL, options); + }, + + buildOptionList: function() { + this._form.removeClassName(this.options.loadingClassName); + this._collection = this._collection.map(function(entry) { + return 2 === entry.length ? entry : [entry, entry].flatten(); + }); + var marker = ('value' in this.options) ? this.options.value : this._text; + var textFound = this._collection.any(function(entry) { + return entry[0] == marker; + }.bind(this)); + this._controls.editor.update(''); + var option; + this._collection.each(function(entry, index) { + option = document.createElement('option'); + option.value = entry[0]; + option.selected = textFound ? entry[0] == marker : 0 == index; + option.appendChild(document.createTextNode(entry[1])); + this._controls.editor.appendChild(option); + }.bind(this)); + this._controls.editor.disabled = false; + Field.scrollFreeActivate(this._controls.editor); + } +}); + +//**** DEPRECATION LAYER FOR InPlace[Collection]Editor! **** +//**** This only exists for a while, in order to let **** +//**** users adapt to the new API. Read up on the new **** +//**** API and convert your code to it ASAP! **** + +Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions = function(options) { + if (!options) return; + function fallback(name, expr) { + if (name in options || expr === undefined) return; + options[name] = expr; + }; + fallback('cancelControl', (options.cancelLink ? 'link' : (options.cancelButton ? 'button' : + options.cancelLink == options.cancelButton == false ? false : undefined))); + fallback('okControl', (options.okLink ? 'link' : (options.okButton ? 'button' : + options.okLink == options.okButton == false ? false : undefined))); + fallback('highlightColor', options.highlightcolor); + fallback('highlightEndColor', options.highlightendcolor); +}; + +Object.extend(Ajax.InPlaceEditor, { + DefaultOptions: { + ajaxOptions: { }, + autoRows: 3, // Use when multi-line w/ rows == 1 + cancelControl: 'link', // 'link'|'button'|false + cancelText: 'cancel', + clickToEditText: 'Click to edit', + externalControl: null, // id|elt + externalControlOnly: false, + fieldPostCreation: 'activate', // 'activate'|'focus'|false + formClassName: 'inplaceeditor-form', + formId: null, // id|elt + highlightColor: '#ffff99', + highlightEndColor: '#ffffff', + hoverClassName: '', + htmlResponse: true, + loadingClassName: 'inplaceeditor-loading', + loadingText: 'Loading...', + okControl: 'button', // 'link'|'button'|false + okText: 'ok', + paramName: 'value', + rows: 1, // If 1 and multi-line, uses autoRows + savingClassName: 'inplaceeditor-saving', + savingText: 'Saving...', + size: 0, + stripLoadedTextTags: false, + submitOnBlur: false, + textAfterControls: '', + textBeforeControls: '', + textBetweenControls: '' + }, + DefaultCallbacks: { + callback: function(form) { + return Form.serialize(form); + }, + onComplete: function(transport, element) { + // For backward compatibility, this one is bound to the IPE, and passes + // the element directly. It was too often customized, so we don't break it. + new Effect.Highlight(element, { + startcolor: this.options.highlightColor, keepBackgroundImage: true }); + }, + onEnterEditMode: null, + onEnterHover: function(ipe) { + ipe.element.style.backgroundColor = ipe.options.highlightColor; + if (ipe._effect) + ipe._effect.cancel(); + }, + onFailure: function(transport, ipe) { + alert('Error communication with the server: ' + transport.responseText.stripTags()); + }, + onFormCustomization: null, // Takes the IPE and its generated form, after editor, before controls. + onLeaveEditMode: null, + onLeaveHover: function(ipe) { + ipe._effect = new Effect.Highlight(ipe.element, { + startcolor: ipe.options.highlightColor, endcolor: ipe.options.highlightEndColor, + restorecolor: ipe._originalBackground, keepBackgroundImage: true + }); + } + }, + Listeners: { + click: 'enterEditMode', + keydown: 'checkForEscapeOrReturn', + mouseover: 'enterHover', + mouseout: 'leaveHover' + } +}); + +Ajax.InPlaceCollectionEditor.DefaultOptions = { + loadingCollectionText: 'Loading options...' +}; + +// Delayed observer, like Form.Element.Observer, +// but waits for delay after last key input +// Ideal for live-search fields + +Form.Element.DelayedObserver = Class.create({ + initialize: function(element, delay, callback) { + this.delay = delay || 0.5; + this.element = $(element); + this.callback = callback; + this.timer = null; + this.lastValue = $F(this.element); + Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this)); + }, + delayedListener: function(event) { + if(this.lastValue == $F(this.element)) return; + if(this.timer) clearTimeout(this.timer); + this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000); + this.lastValue = $F(this.element); + }, + onTimerEvent: function() { + this.timer = null; + this.callback(this.element, $F(this.element)); + } +}); \ No newline at end of file diff --git a/web-app/js/prototype/dragdrop.js b/web-app/js/prototype/dragdrop.js new file mode 100644 index 0000000..15c6dbc --- /dev/null +++ b/web-app/js/prototype/dragdrop.js @@ -0,0 +1,974 @@ +// script.aculo.us dragdrop.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 + +// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// +// script.aculo.us is freely distributable under the terms of an MIT-style license. +// For details, see the script.aculo.us web site: http://script.aculo.us/ + +if(Object.isUndefined(Effect)) + throw("dragdrop.js requires including script.aculo.us' effects.js library"); + +var Droppables = { + drops: [], + + remove: function(element) { + this.drops = this.drops.reject(function(d) { return d.element==$(element) }); + }, + + add: function(element) { + element = $(element); + var options = Object.extend({ + greedy: true, + hoverclass: null, + tree: false + }, arguments[1] || { }); + + // cache containers + if(options.containment) { + options._containers = []; + var containment = options.containment; + if(Object.isArray(containment)) { + containment.each( function(c) { options._containers.push($(c)) }); + } else { + options._containers.push($(containment)); + } + } + + if(options.accept) options.accept = [options.accept].flatten(); + + Element.makePositioned(element); // fix IE + options.element = element; + + this.drops.push(options); + }, + + findDeepestChild: function(drops) { + deepest = drops[0]; + + for (i = 1; i < drops.length; ++i) + if (Element.isParent(drops[i].element, deepest.element)) + deepest = drops[i]; + + return deepest; + }, + + isContained: function(element, drop) { + var containmentNode; + if(drop.tree) { + containmentNode = element.treeNode; + } else { + containmentNode = element.parentNode; + } + return drop._containers.detect(function(c) { return containmentNode == c }); + }, + + isAffected: function(point, element, drop) { + return ( + (drop.element!=element) && + ((!drop._containers) || + this.isContained(element, drop)) && + ((!drop.accept) || + (Element.classNames(element).detect( + function(v) { return drop.accept.include(v) } ) )) && + Position.within(drop.element, point[0], point[1]) ); + }, + + deactivate: function(drop) { + if(drop.hoverclass) + Element.removeClassName(drop.element, drop.hoverclass); + this.last_active = null; + }, + + activate: function(drop) { + if(drop.hoverclass) + Element.addClassName(drop.element, drop.hoverclass); + this.last_active = drop; + }, + + show: function(point, element) { + if(!this.drops.length) return; + var drop, affected = []; + + this.drops.each( function(drop) { + if(Droppables.isAffected(point, element, drop)) + affected.push(drop); + }); + + if(affected.length>0) + drop = Droppables.findDeepestChild(affected); + + if(this.last_active && this.last_active != drop) this.deactivate(this.last_active); + if (drop) { + Position.within(drop.element, point[0], point[1]); + if(drop.onHover) + drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element)); + + if (drop != this.last_active) Droppables.activate(drop); + } + }, + + fire: function(event, element) { + if(!this.last_active) return; + Position.prepare(); + + if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active)) + if (this.last_active.onDrop) { + this.last_active.onDrop(element, this.last_active.element, event); + return true; + } + }, + + reset: function() { + if(this.last_active) + this.deactivate(this.last_active); + } +}; + +var Draggables = { + drags: [], + observers: [], + + register: function(draggable) { + if(this.drags.length == 0) { + this.eventMouseUp = this.endDrag.bindAsEventListener(this); + this.eventMouseMove = this.updateDrag.bindAsEventListener(this); + this.eventKeypress = this.keyPress.bindAsEventListener(this); + + Event.observe(document, "mouseup", this.eventMouseUp); + Event.observe(document, "mousemove", this.eventMouseMove); + Event.observe(document, "keypress", this.eventKeypress); + } + this.drags.push(draggable); + }, + + unregister: function(draggable) { + this.drags = this.drags.reject(function(d) { return d==draggable }); + if(this.drags.length == 0) { + Event.stopObserving(document, "mouseup", this.eventMouseUp); + Event.stopObserving(document, "mousemove", this.eventMouseMove); + Event.stopObserving(document, "keypress", this.eventKeypress); + } + }, + + activate: function(draggable) { + if(draggable.options.delay) { + this._timeout = setTimeout(function() { + Draggables._timeout = null; + window.focus(); + Draggables.activeDraggable = draggable; + }.bind(this), draggable.options.delay); + } else { + window.focus(); // allows keypress events if window isn't currently focused, fails for Safari + this.activeDraggable = draggable; + } + }, + + deactivate: function() { + this.activeDraggable = null; + }, + + updateDrag: function(event) { + if(!this.activeDraggable) return; + var pointer = [Event.pointerX(event), Event.pointerY(event)]; + // Mozilla-based browsers fire successive mousemove events with + // the same coordinates, prevent needless redrawing (moz bug?) + if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return; + this._lastPointer = pointer; + + this.activeDraggable.updateDrag(event, pointer); + }, + + endDrag: function(event) { + if(this._timeout) { + clearTimeout(this._timeout); + this._timeout = null; + } + if(!this.activeDraggable) return; + this._lastPointer = null; + this.activeDraggable.endDrag(event); + this.activeDraggable = null; + }, + + keyPress: function(event) { + if(this.activeDraggable) + this.activeDraggable.keyPress(event); + }, + + addObserver: function(observer) { + this.observers.push(observer); + this._cacheObserverCallbacks(); + }, + + removeObserver: function(element) { // element instead of observer fixes mem leaks + this.observers = this.observers.reject( function(o) { return o.element==element }); + this._cacheObserverCallbacks(); + }, + + notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag' + if(this[eventName+'Count'] > 0) + this.observers.each( function(o) { + if(o[eventName]) o[eventName](eventName, draggable, event); + }); + if(draggable.options[eventName]) draggable.options[eventName](draggable, event); + }, + + _cacheObserverCallbacks: function() { + ['onStart','onEnd','onDrag'].each( function(eventName) { + Draggables[eventName+'Count'] = Draggables.observers.select( + function(o) { return o[eventName]; } + ).length; + }); + } +}; + +/*--------------------------------------------------------------------------*/ + +var Draggable = Class.create({ + initialize: function(element) { + var defaults = { + handle: false, + reverteffect: function(element, top_offset, left_offset) { + var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02; + new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur, + queue: {scope:'_draggable', position:'end'} + }); + }, + endeffect: function(element) { + var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0; + new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, + queue: {scope:'_draggable', position:'end'}, + afterFinish: function(){ + Draggable._dragging[element] = false + } + }); + }, + zindex: 1000, + revert: false, + quiet: false, + scroll: false, + scrollSensitivity: 20, + scrollSpeed: 15, + snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] } + delay: 0 + }; + + if(!arguments[1] || Object.isUndefined(arguments[1].endeffect)) + Object.extend(defaults, { + starteffect: function(element) { + element._opacity = Element.getOpacity(element); + Draggable._dragging[element] = true; + new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); + } + }); + + var options = Object.extend(defaults, arguments[1] || { }); + + this.element = $(element); + + if(options.handle && Object.isString(options.handle)) + this.handle = this.element.down('.'+options.handle, 0); + + if(!this.handle) this.handle = $(options.handle); + if(!this.handle) this.handle = this.element; + + if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) { + options.scroll = $(options.scroll); + this._isScrollChild = Element.childOf(this.element, options.scroll); + } + + Element.makePositioned(this.element); // fix IE + + this.options = options; + this.dragging = false; + + this.eventMouseDown = this.initDrag.bindAsEventListener(this); + Event.observe(this.handle, "mousedown", this.eventMouseDown); + + Draggables.register(this); + }, + + destroy: function() { + Event.stopObserving(this.handle, "mousedown", this.eventMouseDown); + Draggables.unregister(this); + }, + + currentDelta: function() { + return([ + parseInt(Element.getStyle(this.element,'left') || '0'), + parseInt(Element.getStyle(this.element,'top') || '0')]); + }, + + initDrag: function(event) { + if(!Object.isUndefined(Draggable._dragging[this.element]) && + Draggable._dragging[this.element]) return; + if(Event.isLeftClick(event)) { + // abort on form elements, fixes a Firefox issue + var src = Event.element(event); + if((tag_name = src.tagName.toUpperCase()) && ( + tag_name=='INPUT' || + tag_name=='SELECT' || + tag_name=='OPTION' || + tag_name=='BUTTON' || + tag_name=='TEXTAREA')) return; + + var pointer = [Event.pointerX(event), Event.pointerY(event)]; + var pos = this.element.cumulativeOffset(); + this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) }); + + Draggables.activate(this); + Event.stop(event); + } + }, + + startDrag: function(event) { + this.dragging = true; + if(!this.delta) + this.delta = this.currentDelta(); + + if(this.options.zindex) { + this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0); + this.element.style.zIndex = this.options.zindex; + } + + if(this.options.ghosting) { + this._clone = this.element.cloneNode(true); + this._originallyAbsolute = (this.element.getStyle('position') == 'absolute'); + if (!this._originallyAbsolute) + Position.absolutize(this.element); + this.element.parentNode.insertBefore(this._clone, this.element); + } + + if(this.options.scroll) { + if (this.options.scroll == window) { + var where = this._getWindowScroll(this.options.scroll); + this.originalScrollLeft = where.left; + this.originalScrollTop = where.top; + } else { + this.originalScrollLeft = this.options.scroll.scrollLeft; + this.originalScrollTop = this.options.scroll.scrollTop; + } + } + + Draggables.notify('onStart', this, event); + + if(this.options.starteffect) this.options.starteffect(this.element); + }, + + updateDrag: function(event, pointer) { + if(!this.dragging) this.startDrag(event); + + if(!this.options.quiet){ + Position.prepare(); + Droppables.show(pointer, this.element); + } + + Draggables.notify('onDrag', this, event); + + this.draw(pointer); + if(this.options.change) this.options.change(this); + + if(this.options.scroll) { + this.stopScrolling(); + + var p; + if (this.options.scroll == window) { + with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; } + } else { + p = Position.page(this.options.scroll); + p[0] += this.options.scroll.scrollLeft + Position.deltaX; + p[1] += this.options.scroll.scrollTop + Position.deltaY; + p.push(p[0]+this.options.scroll.offsetWidth); + p.push(p[1]+this.options.scroll.offsetHeight); + } + var speed = [0,0]; + if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity); + if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity); + if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity); + if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity); + this.startScrolling(speed); + } + + // fix AppleWebKit rendering + if(Prototype.Browser.WebKit) window.scrollBy(0,0); + + Event.stop(event); + }, + + finishDrag: function(event, success) { + this.dragging = false; + + if(this.options.quiet){ + Position.prepare(); + var pointer = [Event.pointerX(event), Event.pointerY(event)]; + Droppables.show(pointer, this.element); + } + + if(this.options.ghosting) { + if (!this._originallyAbsolute) + Position.relativize(this.element); + delete this._originallyAbsolute; + Element.remove(this._clone); + this._clone = null; + } + + var dropped = false; + if(success) { + dropped = Droppables.fire(event, this.element); + if (!dropped) dropped = false; + } + if(dropped && this.options.onDropped) this.options.onDropped(this.element); + Draggables.notify('onEnd', this, event); + + var revert = this.options.revert; + if(revert && Object.isFunction(revert)) revert = revert(this.element); + + var d = this.currentDelta(); + if(revert && this.options.reverteffect) { + if (dropped == 0 || revert != 'failure') + this.options.reverteffect(this.element, + d[1]-this.delta[1], d[0]-this.delta[0]); + } else { + this.delta = d; + } + + if(this.options.zindex) + this.element.style.zIndex = this.originalZ; + + if(this.options.endeffect) + this.options.endeffect(this.element); + + Draggables.deactivate(this); + Droppables.reset(); + }, + + keyPress: function(event) { + if(event.keyCode!=Event.KEY_ESC) return; + this.finishDrag(event, false); + Event.stop(event); + }, + + endDrag: function(event) { + if(!this.dragging) return; + this.stopScrolling(); + this.finishDrag(event, true); + Event.stop(event); + }, + + draw: function(point) { + var pos = this.element.cumulativeOffset(); + if(this.options.ghosting) { + var r = Position.realOffset(this.element); + pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY; + } + + var d = this.currentDelta(); + pos[0] -= d[0]; pos[1] -= d[1]; + + if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) { + pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft; + pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop; + } + + var p = [0,1].map(function(i){ + return (point[i]-pos[i]-this.offset[i]) + }.bind(this)); + + if(this.options.snap) { + if(Object.isFunction(this.options.snap)) { + p = this.options.snap(p[0],p[1],this); + } else { + if(Object.isArray(this.options.snap)) { + p = p.map( function(v, i) { + return (v/this.options.snap[i]).round()*this.options.snap[i] }.bind(this)); + } else { + p = p.map( function(v) { + return (v/this.options.snap).round()*this.options.snap }.bind(this)); + } + }} + + var style = this.element.style; + if((!this.options.constraint) || (this.options.constraint=='horizontal')) + style.left = p[0] + "px"; + if((!this.options.constraint) || (this.options.constraint=='vertical')) + style.top = p[1] + "px"; + + if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering + }, + + stopScrolling: function() { + if(this.scrollInterval) { + clearInterval(this.scrollInterval); + this.scrollInterval = null; + Draggables._lastScrollPointer = null; + } + }, + + startScrolling: function(speed) { + if(!(speed[0] || speed[1])) return; + this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed]; + this.lastScrolled = new Date(); + this.scrollInterval = setInterval(this.scroll.bind(this), 10); + }, + + scroll: function() { + var current = new Date(); + var delta = current - this.lastScrolled; + this.lastScrolled = current; + if(this.options.scroll == window) { + with (this._getWindowScroll(this.options.scroll)) { + if (this.scrollSpeed[0] || this.scrollSpeed[1]) { + var d = delta / 1000; + this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] ); + } + } + } else { + this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000; + this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000; + } + + Position.prepare(); + Droppables.show(Draggables._lastPointer, this.element); + Draggables.notify('onDrag', this); + if (this._isScrollChild) { + Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer); + Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000; + Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000; + if (Draggables._lastScrollPointer[0] < 0) + Draggables._lastScrollPointer[0] = 0; + if (Draggables._lastScrollPointer[1] < 0) + Draggables._lastScrollPointer[1] = 0; + this.draw(Draggables._lastScrollPointer); + } + + if(this.options.change) this.options.change(this); + }, + + _getWindowScroll: function(w) { + var T, L, W, H; + with (w.document) { + if (w.document.documentElement && documentElement.scrollTop) { + T = documentElement.scrollTop; + L = documentElement.scrollLeft; + } else if (w.document.body) { + T = body.scrollTop; + L = body.scrollLeft; + } + if (w.innerWidth) { + W = w.innerWidth; + H = w.innerHeight; + } else if (w.document.documentElement && documentElement.clientWidth) { + W = documentElement.clientWidth; + H = documentElement.clientHeight; + } else { + W = body.offsetWidth; + H = body.offsetHeight; + } + } + return { top: T, left: L, width: W, height: H }; + } +}); + +Draggable._dragging = { }; + +/*--------------------------------------------------------------------------*/ + +var SortableObserver = Class.create({ + initialize: function(element, observer) { + this.element = $(element); + this.observer = observer; + this.lastValue = Sortable.serialize(this.element); + }, + + onStart: function() { + this.lastValue = Sortable.serialize(this.element); + }, + + onEnd: function() { + Sortable.unmark(); + if(this.lastValue != Sortable.serialize(this.element)) + this.observer(this.element) + } +}); + +var Sortable = { + SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/, + + sortables: { }, + + _findRootElement: function(element) { + while (element.tagName.toUpperCase() != "BODY") { + if(element.id && Sortable.sortables[element.id]) return element; + element = element.parentNode; + } + }, + + options: function(element) { + element = Sortable._findRootElement($(element)); + if(!element) return; + return Sortable.sortables[element.id]; + }, + + destroy: function(element){ + element = $(element); + var s = Sortable.sortables[element.id]; + + if(s) { + Draggables.removeObserver(s.element); + s.droppables.each(function(d){ Droppables.remove(d) }); + s.draggables.invoke('destroy'); + + delete Sortable.sortables[s.element.id]; + } + }, + + create: function(element) { + element = $(element); + var options = Object.extend({ + element: element, + tag: 'li', // assumes li children, override with tag: 'tagname' + dropOnEmpty: false, + tree: false, + treeTag: 'ul', + overlap: 'vertical', // one of 'vertical', 'horizontal' + constraint: 'vertical', // one of 'vertical', 'horizontal', false + containment: element, // also takes array of elements (or id's); or false + handle: false, // or a CSS class + only: false, + delay: 0, + hoverclass: null, + ghosting: false, + quiet: false, + scroll: false, + scrollSensitivity: 20, + scrollSpeed: 15, + format: this.SERIALIZE_RULE, + + // these take arrays of elements or ids and can be + // used for better initialization performance + elements: false, + handles: false, + + onChange: Prototype.emptyFunction, + onUpdate: Prototype.emptyFunction + }, arguments[1] || { }); + + // clear any old sortable with same element + this.destroy(element); + + // build options for the draggables + var options_for_draggable = { + revert: true, + quiet: options.quiet, + scroll: options.scroll, + scrollSpeed: options.scrollSpeed, + scrollSensitivity: options.scrollSensitivity, + delay: options.delay, + ghosting: options.ghosting, + constraint: options.constraint, + handle: options.handle }; + + if(options.starteffect) + options_for_draggable.starteffect = options.starteffect; + + if(options.reverteffect) + options_for_draggable.reverteffect = options.reverteffect; + else + if(options.ghosting) options_for_draggable.reverteffect = function(element) { + element.style.top = 0; + element.style.left = 0; + }; + + if(options.endeffect) + options_for_draggable.endeffect = options.endeffect; + + if(options.zindex) + options_for_draggable.zindex = options.zindex; + + // build options for the droppables + var options_for_droppable = { + overlap: options.overlap, + containment: options.containment, + tree: options.tree, + hoverclass: options.hoverclass, + onHover: Sortable.onHover + }; + + var options_for_tree = { + onHover: Sortable.onEmptyHover, + overlap: options.overlap, + containment: options.containment, + hoverclass: options.hoverclass + }; + + // fix for gecko engine + Element.cleanWhitespace(element); + + options.draggables = []; + options.droppables = []; + + // drop on empty handling + if(options.dropOnEmpty || options.tree) { + Droppables.add(element, options_for_tree); + options.droppables.push(element); + } + + (options.elements || this.findElements(element, options) || []).each( function(e,i) { + var handle = options.handles ? $(options.handles[i]) : + (options.handle ? $(e).select('.' + options.handle)[0] : e); + options.draggables.push( + new Draggable(e, Object.extend(options_for_draggable, { handle: handle }))); + Droppables.add(e, options_for_droppable); + if(options.tree) e.treeNode = element; + options.droppables.push(e); + }); + + if(options.tree) { + (Sortable.findTreeElements(element, options) || []).each( function(e) { + Droppables.add(e, options_for_tree); + e.treeNode = element; + options.droppables.push(e); + }); + } + + // keep reference + this.sortables[element.identify()] = options; + + // for onupdate + Draggables.addObserver(new SortableObserver(element, options.onUpdate)); + + }, + + // return all suitable-for-sortable elements in a guaranteed order + findElements: function(element, options) { + return Element.findChildren( + element, options.only, options.tree ? true : false, options.tag); + }, + + findTreeElements: function(element, options) { + return Element.findChildren( + element, options.only, options.tree ? true : false, options.treeTag); + }, + + onHover: function(element, dropon, overlap) { + if(Element.isParent(dropon, element)) return; + + if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) { + return; + } else if(overlap>0.5) { + Sortable.mark(dropon, 'before'); + if(dropon.previousSibling != element) { + var oldParentNode = element.parentNode; + element.style.visibility = "hidden"; // fix gecko rendering + dropon.parentNode.insertBefore(element, dropon); + if(dropon.parentNode!=oldParentNode) + Sortable.options(oldParentNode).onChange(element); + Sortable.options(dropon.parentNode).onChange(element); + } + } else { + Sortable.mark(dropon, 'after'); + var nextElement = dropon.nextSibling || null; + if(nextElement != element) { + var oldParentNode = element.parentNode; + element.style.visibility = "hidden"; // fix gecko rendering + dropon.parentNode.insertBefore(element, nextElement); + if(dropon.parentNode!=oldParentNode) + Sortable.options(oldParentNode).onChange(element); + Sortable.options(dropon.parentNode).onChange(element); + } + } + }, + + onEmptyHover: function(element, dropon, overlap) { + var oldParentNode = element.parentNode; + var droponOptions = Sortable.options(dropon); + + if(!Element.isParent(dropon, element)) { + var index; + + var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only}); + var child = null; + + if(children) { + var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap); + + for (index = 0; index < children.length; index += 1) { + if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) { + offset -= Element.offsetSize (children[index], droponOptions.overlap); + } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) { + child = index + 1 < children.length ? children[index + 1] : null; + break; + } else { + child = children[index]; + break; + } + } + } + + dropon.insertBefore(element, child); + + Sortable.options(oldParentNode).onChange(element); + droponOptions.onChange(element); + } + }, + + unmark: function() { + if(Sortable._marker) Sortable._marker.hide(); + }, + + mark: function(dropon, position) { + // mark on ghosting only + var sortable = Sortable.options(dropon.parentNode); + if(sortable && !sortable.ghosting) return; + + if(!Sortable._marker) { + Sortable._marker = + ($('dropmarker') || Element.extend(document.createElement('DIV'))). + hide().addClassName('dropmarker').setStyle({position:'absolute'}); + document.getElementsByTagName("body").item(0).appendChild(Sortable._marker); + } + var offsets = dropon.cumulativeOffset(); + Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'}); + + if(position=='after') + if(sortable.overlap == 'horizontal') + Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'}); + else + Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'}); + + Sortable._marker.show(); + }, + + _tree: function(element, options, parent) { + var children = Sortable.findElements(element, options) || []; + + for (var i = 0; i < children.length; ++i) { + var match = children[i].id.match(options.format); + + if (!match) continue; + + var child = { + id: encodeURIComponent(match ? match[1] : null), + element: element, + parent: parent, + children: [], + position: parent.children.length, + container: $(children[i]).down(options.treeTag) + }; + + /* Get the element containing the children and recurse over it */ + if (child.container) + this._tree(child.container, options, child); + + parent.children.push (child); + } + + return parent; + }, + + tree: function(element) { + element = $(element); + var sortableOptions = this.options(element); + var options = Object.extend({ + tag: sortableOptions.tag, + treeTag: sortableOptions.treeTag, + only: sortableOptions.only, + name: element.id, + format: sortableOptions.format + }, arguments[1] || { }); + + var root = { + id: null, + parent: null, + children: [], + container: element, + position: 0 + }; + + return Sortable._tree(element, options, root); + }, + + /* Construct a [i] index for a particular node */ + _constructIndex: function(node) { + var index = ''; + do { + if (node.id) index = '[' + node.position + ']' + index; + } while ((node = node.parent) != null); + return index; + }, + + sequence: function(element) { + element = $(element); + var options = Object.extend(this.options(element), arguments[1] || { }); + + return $(this.findElements(element, options) || []).map( function(item) { + return item.id.match(options.format) ? item.id.match(options.format)[1] : ''; + }); + }, + + setSequence: function(element, new_sequence) { + element = $(element); + var options = Object.extend(this.options(element), arguments[2] || { }); + + var nodeMap = { }; + this.findElements(element, options).each( function(n) { + if (n.id.match(options.format)) + nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode]; + n.parentNode.removeChild(n); + }); + + new_sequence.each(function(ident) { + var n = nodeMap[ident]; + if (n) { + n[1].appendChild(n[0]); + delete nodeMap[ident]; + } + }); + }, + + serialize: function(element) { + element = $(element); + var options = Object.extend(Sortable.options(element), arguments[1] || { }); + var name = encodeURIComponent( + (arguments[1] && arguments[1].name) ? arguments[1].name : element.id); + + if (options.tree) { + return Sortable.tree(element, arguments[1]).children.map( function (item) { + return [name + Sortable._constructIndex(item) + "[id]=" + + encodeURIComponent(item.id)].concat(item.children.map(arguments.callee)); + }).flatten().join('&'); + } else { + return Sortable.sequence(element, arguments[1]).map( function(item) { + return name + "[]=" + encodeURIComponent(item); + }).join('&'); + } + } +}; + +// Returns true if child is contained within element +Element.isParent = function(child, element) { + if (!child.parentNode || child == element) return false; + if (child.parentNode == element) return true; + return Element.isParent(child.parentNode, element); +}; + +Element.findChildren = function(element, only, recursive, tagName) { + if(!element.hasChildNodes()) return null; + tagName = tagName.toUpperCase(); + if(only) only = [only].flatten(); + var elements = []; + $A(element.childNodes).each( function(e) { + if(e.tagName && e.tagName.toUpperCase()==tagName && + (!only || (Element.classNames(e).detect(function(v) { return only.include(v) })))) + elements.push(e); + if(recursive) { + var grandchildren = Element.findChildren(e, only, recursive, tagName); + if(grandchildren) elements.push(grandchildren); + } + }); + + return (elements.length>0 ? elements.flatten() : []); +}; + +Element.offsetSize = function (element, type) { + return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')]; +}; \ No newline at end of file diff --git a/web-app/js/prototype/effects.js b/web-app/js/prototype/effects.js new file mode 100644 index 0000000..066ee59 --- /dev/null +++ b/web-app/js/prototype/effects.js @@ -0,0 +1,1123 @@ +// script.aculo.us effects.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 + +// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// Contributors: +// Justin Palmer (http://encytemedia.com/) +// Mark Pilgrim (http://diveintomark.org/) +// Martin Bialasinki +// +// script.aculo.us is freely distributable under the terms of an MIT-style license. +// For details, see the script.aculo.us web site: http://script.aculo.us/ + +// converts rgb() and #xxx to #xxxxxx format, +// returns self (or first argument) if not convertable +String.prototype.parseColor = function() { + var color = '#'; + if (this.slice(0,4) == 'rgb(') { + var cols = this.slice(4,this.length-1).split(','); + var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); + } else { + if (this.slice(0,1) == '#') { + if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); + if (this.length==7) color = this.toLowerCase(); + } + } + return (color.length==7 ? color : (arguments[0] || this)); +}; + +/*--------------------------------------------------------------------------*/ + +Element.collectTextNodes = function(element) { + return $A($(element).childNodes).collect( function(node) { + return (node.nodeType==3 ? node.nodeValue : + (node.hasChildNodes() ? Element.collectTextNodes(node) : '')); + }).flatten().join(''); +}; + +Element.collectTextNodesIgnoreClass = function(element, className) { + return $A($(element).childNodes).collect( function(node) { + return (node.nodeType==3 ? node.nodeValue : + ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? + Element.collectTextNodesIgnoreClass(node, className) : '')); + }).flatten().join(''); +}; + +Element.setContentZoom = function(element, percent) { + element = $(element); + element.setStyle({fontSize: (percent/100) + 'em'}); + if (Prototype.Browser.WebKit) window.scrollBy(0,0); + return element; +}; + +Element.getInlineOpacity = function(element){ + return $(element).style.opacity || ''; +}; + +Element.forceRerendering = function(element) { + try { + element = $(element); + var n = document.createTextNode(' '); + element.appendChild(n); + element.removeChild(n); + } catch(e) { } +}; + +/*--------------------------------------------------------------------------*/ + +var Effect = { + _elementDoesNotExistError: { + name: 'ElementDoesNotExistError', + message: 'The specified DOM element does not exist, but is required for this effect to operate' + }, + Transitions: { + linear: Prototype.K, + sinoidal: function(pos) { + return (-Math.cos(pos*Math.PI)/2) + .5; + }, + reverse: function(pos) { + return 1-pos; + }, + flicker: function(pos) { + var pos = ((-Math.cos(pos*Math.PI)/4) + .75) + Math.random()/4; + return pos > 1 ? 1 : pos; + }, + wobble: function(pos) { + return (-Math.cos(pos*Math.PI*(9*pos))/2) + .5; + }, + pulse: function(pos, pulses) { + return (-Math.cos((pos*((pulses||5)-.5)*2)*Math.PI)/2) + .5; + }, + spring: function(pos) { + return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6)); + }, + none: function(pos) { + return 0; + }, + full: function(pos) { + return 1; + } + }, + DefaultOptions: { + duration: 1.0, // seconds + fps: 100, // 100= assume 66fps max. + sync: false, // true for combining + from: 0.0, + to: 1.0, + delay: 0.0, + queue: 'parallel' + }, + tagifyText: function(element) { + var tagifyStyle = 'position:relative'; + if (Prototype.Browser.IE) tagifyStyle += ';zoom:1'; + + element = $(element); + $A(element.childNodes).each( function(child) { + if (child.nodeType==3) { + child.nodeValue.toArray().each( function(character) { + element.insertBefore( + new Element('span', {style: tagifyStyle}).update( + character == ' ' ? String.fromCharCode(160) : character), + child); + }); + Element.remove(child); + } + }); + }, + multiple: function(element, effect) { + var elements; + if (((typeof element == 'object') || + Object.isFunction(element)) && + (element.length)) + elements = element; + else + elements = $(element).childNodes; + + var options = Object.extend({ + speed: 0.1, + delay: 0.0 + }, arguments[2] || { }); + var masterDelay = options.delay; + + $A(elements).each( function(element, index) { + new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay })); + }); + }, + PAIRS: { + 'slide': ['SlideDown','SlideUp'], + 'blind': ['BlindDown','BlindUp'], + 'appear': ['Appear','Fade'] + }, + toggle: function(element, effect, options) { + element = $(element); + effect = (effect || 'appear').toLowerCase(); + + return Effect[ Effect.PAIRS[ effect ][ element.visible() ? 1 : 0 ] ](element, Object.extend({ + queue: { position:'end', scope:(element.id || 'global'), limit: 1 } + }, options || {})); + } +}; + +Effect.DefaultOptions.transition = Effect.Transitions.sinoidal; + +/* ------------- core effects ------------- */ + +Effect.ScopedQueue = Class.create(Enumerable, { + initialize: function() { + this.effects = []; + this.interval = null; + }, + _each: function(iterator) { + this.effects._each(iterator); + }, + add: function(effect) { + var timestamp = new Date().getTime(); + + var position = Object.isString(effect.options.queue) ? + effect.options.queue : effect.options.queue.position; + + switch(position) { + case 'front': + // move unstarted effects after this effect + this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) { + e.startOn += effect.finishOn; + e.finishOn += effect.finishOn; + }); + break; + case 'with-last': + timestamp = this.effects.pluck('startOn').max() || timestamp; + break; + case 'end': + // start effect after last queued effect has finished + timestamp = this.effects.pluck('finishOn').max() || timestamp; + break; + } + + effect.startOn += timestamp; + effect.finishOn += timestamp; + + if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit)) + this.effects.push(effect); + + if (!this.interval) + this.interval = setInterval(this.loop.bind(this), 15); + }, + remove: function(effect) { + this.effects = this.effects.reject(function(e) { return e==effect }); + if (this.effects.length == 0) { + clearInterval(this.interval); + this.interval = null; + } + }, + loop: function() { + var timePos = new Date().getTime(); + for(var i=0, len=this.effects.length;i= this.startOn) { + if (timePos >= this.finishOn) { + this.render(1.0); + this.cancel(); + this.event('beforeFinish'); + if (this.finish) this.finish(); + this.event('afterFinish'); + return; + } + var pos = (timePos - this.startOn) / this.totalTime, + frame = (pos * this.totalFrames).round(); + if (frame > this.currentFrame) { + this.render(pos); + this.currentFrame = frame; + } + } + }, + cancel: function() { + if (!this.options.sync) + Effect.Queues.get(Object.isString(this.options.queue) ? + 'global' : this.options.queue.scope).remove(this); + this.state = 'finished'; + }, + event: function(eventName) { + if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this); + if (this.options[eventName]) this.options[eventName](this); + }, + inspect: function() { + var data = $H(); + for(property in this) + if (!Object.isFunction(this[property])) data.set(property, this[property]); + return '#'; + } +}); + +Effect.Parallel = Class.create(Effect.Base, { + initialize: function(effects) { + this.effects = effects || []; + this.start(arguments[1]); + }, + update: function(position) { + this.effects.invoke('render', position); + }, + finish: function(position) { + this.effects.each( function(effect) { + effect.render(1.0); + effect.cancel(); + effect.event('beforeFinish'); + if (effect.finish) effect.finish(position); + effect.event('afterFinish'); + }); + } +}); + +Effect.Tween = Class.create(Effect.Base, { + initialize: function(object, from, to) { + object = Object.isString(object) ? $(object) : object; + var args = $A(arguments), method = args.last(), + options = args.length == 5 ? args[3] : null; + this.method = Object.isFunction(method) ? method.bind(object) : + Object.isFunction(object[method]) ? object[method].bind(object) : + function(value) { object[method] = value }; + this.start(Object.extend({ from: from, to: to }, options || { })); + }, + update: function(position) { + this.method(position); + } +}); + +Effect.Event = Class.create(Effect.Base, { + initialize: function() { + this.start(Object.extend({ duration: 0 }, arguments[0] || { })); + }, + update: Prototype.emptyFunction +}); + +Effect.Opacity = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + // make this work on IE on elements without 'layout' + if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) + this.element.setStyle({zoom: 1}); + var options = Object.extend({ + from: this.element.getOpacity() || 0.0, + to: 1.0 + }, arguments[1] || { }); + this.start(options); + }, + update: function(position) { + this.element.setOpacity(position); + } +}); + +Effect.Move = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ + x: 0, + y: 0, + mode: 'relative' + }, arguments[1] || { }); + this.start(options); + }, + setup: function() { + this.element.makePositioned(); + this.originalLeft = parseFloat(this.element.getStyle('left') || '0'); + this.originalTop = parseFloat(this.element.getStyle('top') || '0'); + if (this.options.mode == 'absolute') { + this.options.x = this.options.x - this.originalLeft; + this.options.y = this.options.y - this.originalTop; + } + }, + update: function(position) { + this.element.setStyle({ + left: (this.options.x * position + this.originalLeft).round() + 'px', + top: (this.options.y * position + this.originalTop).round() + 'px' + }); + } +}); + +// for backwards compatibility +Effect.MoveBy = function(element, toTop, toLeft) { + return new Effect.Move(element, + Object.extend({ x: toLeft, y: toTop }, arguments[3] || { })); +}; + +Effect.Scale = Class.create(Effect.Base, { + initialize: function(element, percent) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ + scaleX: true, + scaleY: true, + scaleContent: true, + scaleFromCenter: false, + scaleMode: 'box', // 'box' or 'contents' or { } with provided values + scaleFrom: 100.0, + scaleTo: percent + }, arguments[2] || { }); + this.start(options); + }, + setup: function() { + this.restoreAfterFinish = this.options.restoreAfterFinish || false; + this.elementPositioning = this.element.getStyle('position'); + + this.originalStyle = { }; + ['top','left','width','height','fontSize'].each( function(k) { + this.originalStyle[k] = this.element.style[k]; + }.bind(this)); + + this.originalTop = this.element.offsetTop; + this.originalLeft = this.element.offsetLeft; + + var fontSize = this.element.getStyle('font-size') || '100%'; + ['em','px','%','pt'].each( function(fontSizeType) { + if (fontSize.indexOf(fontSizeType)>0) { + this.fontSize = parseFloat(fontSize); + this.fontSizeType = fontSizeType; + } + }.bind(this)); + + this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; + + this.dims = null; + if (this.options.scaleMode=='box') + this.dims = [this.element.offsetHeight, this.element.offsetWidth]; + if (/^content/.test(this.options.scaleMode)) + this.dims = [this.element.scrollHeight, this.element.scrollWidth]; + if (!this.dims) + this.dims = [this.options.scaleMode.originalHeight, + this.options.scaleMode.originalWidth]; + }, + update: function(position) { + var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); + if (this.options.scaleContent && this.fontSize) + this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType }); + this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale); + }, + finish: function(position) { + if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle); + }, + setDimensions: function(height, width) { + var d = { }; + if (this.options.scaleX) d.width = width.round() + 'px'; + if (this.options.scaleY) d.height = height.round() + 'px'; + if (this.options.scaleFromCenter) { + var topd = (height - this.dims[0])/2; + var leftd = (width - this.dims[1])/2; + if (this.elementPositioning == 'absolute') { + if (this.options.scaleY) d.top = this.originalTop-topd + 'px'; + if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px'; + } else { + if (this.options.scaleY) d.top = -topd + 'px'; + if (this.options.scaleX) d.left = -leftd + 'px'; + } + } + this.element.setStyle(d); + } +}); + +Effect.Highlight = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { }); + this.start(options); + }, + setup: function() { + // Prevent executing on elements not in the layout flow + if (this.element.getStyle('display')=='none') { this.cancel(); return; } + // Disable background image during the effect + this.oldStyle = { }; + if (!this.options.keepBackgroundImage) { + this.oldStyle.backgroundImage = this.element.getStyle('background-image'); + this.element.setStyle({backgroundImage: 'none'}); + } + if (!this.options.endcolor) + this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff'); + if (!this.options.restorecolor) + this.options.restorecolor = this.element.getStyle('background-color'); + // init color calculations + this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this)); + this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this)); + }, + update: function(position) { + this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){ + return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) }); + }, + finish: function() { + this.element.setStyle(Object.extend(this.oldStyle, { + backgroundColor: this.options.restorecolor + })); + } +}); + +Effect.ScrollTo = function(element) { + var options = arguments[1] || { }, + scrollOffsets = document.viewport.getScrollOffsets(), + elementOffsets = $(element).cumulativeOffset(); + + if (options.offset) elementOffsets[1] += options.offset; + + return new Effect.Tween(null, + scrollOffsets.top, + elementOffsets[1], + options, + function(p){ scrollTo(scrollOffsets.left, p.round()); } + ); +}; + +/* ------------- combination effects ------------- */ + +Effect.Fade = function(element) { + element = $(element); + var oldOpacity = element.getInlineOpacity(); + var options = Object.extend({ + from: element.getOpacity() || 1.0, + to: 0.0, + afterFinishInternal: function(effect) { + if (effect.options.to!=0) return; + effect.element.hide().setStyle({opacity: oldOpacity}); + } + }, arguments[1] || { }); + return new Effect.Opacity(element,options); +}; + +Effect.Appear = function(element) { + element = $(element); + var options = Object.extend({ + from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0), + to: 1.0, + // force Safari to render floated elements properly + afterFinishInternal: function(effect) { + effect.element.forceRerendering(); + }, + beforeSetup: function(effect) { + effect.element.setOpacity(effect.options.from).show(); + }}, arguments[1] || { }); + return new Effect.Opacity(element,options); +}; + +Effect.Puff = function(element) { + element = $(element); + var oldStyle = { + opacity: element.getInlineOpacity(), + position: element.getStyle('position'), + top: element.style.top, + left: element.style.left, + width: element.style.width, + height: element.style.height + }; + return new Effect.Parallel( + [ new Effect.Scale(element, 200, + { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), + new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], + Object.extend({ duration: 1.0, + beforeSetupInternal: function(effect) { + Position.absolutize(effect.effects[0].element); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.hide().setStyle(oldStyle); } + }, arguments[1] || { }) + ); +}; + +Effect.BlindUp = function(element) { + element = $(element); + element.makeClipping(); + return new Effect.Scale(element, 0, + Object.extend({ scaleContent: false, + scaleX: false, + restoreAfterFinish: true, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping(); + } + }, arguments[1] || { }) + ); +}; + +Effect.BlindDown = function(element) { + element = $(element); + var elementDimensions = element.getDimensions(); + return new Effect.Scale(element, 100, Object.extend({ + scaleContent: false, + scaleX: false, + scaleFrom: 0, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { + effect.element.makeClipping().setStyle({height: '0px'}).show(); + }, + afterFinishInternal: function(effect) { + effect.element.undoClipping(); + } + }, arguments[1] || { })); +}; + +Effect.SwitchOff = function(element) { + element = $(element); + var oldOpacity = element.getInlineOpacity(); + return new Effect.Appear(element, Object.extend({ + duration: 0.4, + from: 0, + transition: Effect.Transitions.flicker, + afterFinishInternal: function(effect) { + new Effect.Scale(effect.element, 1, { + duration: 0.3, scaleFromCenter: true, + scaleX: false, scaleContent: false, restoreAfterFinish: true, + beforeSetup: function(effect) { + effect.element.makePositioned().makeClipping(); + }, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity}); + } + }); + } + }, arguments[1] || { })); +}; + +Effect.DropOut = function(element) { + element = $(element); + var oldStyle = { + top: element.getStyle('top'), + left: element.getStyle('left'), + opacity: element.getInlineOpacity() }; + return new Effect.Parallel( + [ new Effect.Move(element, {x: 0, y: 100, sync: true }), + new Effect.Opacity(element, { sync: true, to: 0.0 }) ], + Object.extend( + { duration: 0.5, + beforeSetup: function(effect) { + effect.effects[0].element.makePositioned(); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle); + } + }, arguments[1] || { })); +}; + +Effect.Shake = function(element) { + element = $(element); + var options = Object.extend({ + distance: 20, + duration: 0.5 + }, arguments[1] || {}); + var distance = parseFloat(options.distance); + var split = parseFloat(options.duration) / 10.0; + var oldStyle = { + top: element.getStyle('top'), + left: element.getStyle('left') }; + return new Effect.Move(element, + { x: distance, y: 0, duration: split, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) { + effect.element.undoPositioned().setStyle(oldStyle); + }}); }}); }}); }}); }}); }}); +}; + +Effect.SlideDown = function(element) { + element = $(element).cleanWhitespace(); + // SlideDown need to have the content of the element wrapped in a container element with fixed height! + var oldInnerBottom = element.down().getStyle('bottom'); + var elementDimensions = element.getDimensions(); + return new Effect.Scale(element, 100, Object.extend({ + scaleContent: false, + scaleX: false, + scaleFrom: window.opera ? 0 : 1, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { + effect.element.makePositioned(); + effect.element.down().makePositioned(); + if (window.opera) effect.element.setStyle({top: ''}); + effect.element.makeClipping().setStyle({height: '0px'}).show(); + }, + afterUpdateInternal: function(effect) { + effect.element.down().setStyle({bottom: + (effect.dims[0] - effect.element.clientHeight) + 'px' }); + }, + afterFinishInternal: function(effect) { + effect.element.undoClipping().undoPositioned(); + effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); } + }, arguments[1] || { }) + ); +}; + +Effect.SlideUp = function(element) { + element = $(element).cleanWhitespace(); + var oldInnerBottom = element.down().getStyle('bottom'); + var elementDimensions = element.getDimensions(); + return new Effect.Scale(element, window.opera ? 0 : 1, + Object.extend({ scaleContent: false, + scaleX: false, + scaleMode: 'box', + scaleFrom: 100, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { + effect.element.makePositioned(); + effect.element.down().makePositioned(); + if (window.opera) effect.element.setStyle({top: ''}); + effect.element.makeClipping().show(); + }, + afterUpdateInternal: function(effect) { + effect.element.down().setStyle({bottom: + (effect.dims[0] - effect.element.clientHeight) + 'px' }); + }, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping().undoPositioned(); + effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); + } + }, arguments[1] || { }) + ); +}; + +// Bug in opera makes the TD containing this element expand for a instance after finish +Effect.Squish = function(element) { + return new Effect.Scale(element, window.opera ? 1 : 0, { + restoreAfterFinish: true, + beforeSetup: function(effect) { + effect.element.makeClipping(); + }, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping(); + } + }); +}; + +Effect.Grow = function(element) { + element = $(element); + var options = Object.extend({ + direction: 'center', + moveTransition: Effect.Transitions.sinoidal, + scaleTransition: Effect.Transitions.sinoidal, + opacityTransition: Effect.Transitions.full + }, arguments[1] || { }); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: element.getInlineOpacity() }; + + var dims = element.getDimensions(); + var initialMoveX, initialMoveY; + var moveX, moveY; + + switch (options.direction) { + case 'top-left': + initialMoveX = initialMoveY = moveX = moveY = 0; + break; + case 'top-right': + initialMoveX = dims.width; + initialMoveY = moveY = 0; + moveX = -dims.width; + break; + case 'bottom-left': + initialMoveX = moveX = 0; + initialMoveY = dims.height; + moveY = -dims.height; + break; + case 'bottom-right': + initialMoveX = dims.width; + initialMoveY = dims.height; + moveX = -dims.width; + moveY = -dims.height; + break; + case 'center': + initialMoveX = dims.width / 2; + initialMoveY = dims.height / 2; + moveX = -dims.width / 2; + moveY = -dims.height / 2; + break; + } + + return new Effect.Move(element, { + x: initialMoveX, + y: initialMoveY, + duration: 0.01, + beforeSetup: function(effect) { + effect.element.hide().makeClipping().makePositioned(); + }, + afterFinishInternal: function(effect) { + new Effect.Parallel( + [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }), + new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }), + new Effect.Scale(effect.element, 100, { + scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, + sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true}) + ], Object.extend({ + beforeSetup: function(effect) { + effect.effects[0].element.setStyle({height: '0px'}).show(); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); + } + }, options) + ); + } + }); +}; + +Effect.Shrink = function(element) { + element = $(element); + var options = Object.extend({ + direction: 'center', + moveTransition: Effect.Transitions.sinoidal, + scaleTransition: Effect.Transitions.sinoidal, + opacityTransition: Effect.Transitions.none + }, arguments[1] || { }); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: element.getInlineOpacity() }; + + var dims = element.getDimensions(); + var moveX, moveY; + + switch (options.direction) { + case 'top-left': + moveX = moveY = 0; + break; + case 'top-right': + moveX = dims.width; + moveY = 0; + break; + case 'bottom-left': + moveX = 0; + moveY = dims.height; + break; + case 'bottom-right': + moveX = dims.width; + moveY = dims.height; + break; + case 'center': + moveX = dims.width / 2; + moveY = dims.height / 2; + break; + } + + return new Effect.Parallel( + [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }), + new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}), + new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }) + ], Object.extend({ + beforeStartInternal: function(effect) { + effect.effects[0].element.makePositioned().makeClipping(); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); } + }, options) + ); +}; + +Effect.Pulsate = function(element) { + element = $(element); + var options = arguments[1] || { }, + oldOpacity = element.getInlineOpacity(), + transition = options.transition || Effect.Transitions.linear, + reverser = function(pos){ + return 1 - transition((-Math.cos((pos*(options.pulses||5)*2)*Math.PI)/2) + .5); + }; + + return new Effect.Opacity(element, + Object.extend(Object.extend({ duration: 2.0, from: 0, + afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); } + }, options), {transition: reverser})); +}; + +Effect.Fold = function(element) { + element = $(element); + var oldStyle = { + top: element.style.top, + left: element.style.left, + width: element.style.width, + height: element.style.height }; + element.makeClipping(); + return new Effect.Scale(element, 5, Object.extend({ + scaleContent: false, + scaleX: false, + afterFinishInternal: function(effect) { + new Effect.Scale(element, 1, { + scaleContent: false, + scaleY: false, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping().setStyle(oldStyle); + } }); + }}, arguments[1] || { })); +}; + +Effect.Morph = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ + style: { } + }, arguments[1] || { }); + + if (!Object.isString(options.style)) this.style = $H(options.style); + else { + if (options.style.include(':')) + this.style = options.style.parseStyle(); + else { + this.element.addClassName(options.style); + this.style = $H(this.element.getStyles()); + this.element.removeClassName(options.style); + var css = this.element.getStyles(); + this.style = this.style.reject(function(style) { + return style.value == css[style.key]; + }); + options.afterFinishInternal = function(effect) { + effect.element.addClassName(effect.options.style); + effect.transforms.each(function(transform) { + effect.element.style[transform.style] = ''; + }); + }; + } + } + this.start(options); + }, + + setup: function(){ + function parseColor(color){ + if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff'; + color = color.parseColor(); + return $R(0,2).map(function(i){ + return parseInt( color.slice(i*2+1,i*2+3), 16 ); + }); + } + this.transforms = this.style.map(function(pair){ + var property = pair[0], value = pair[1], unit = null; + + if (value.parseColor('#zzzzzz') != '#zzzzzz') { + value = value.parseColor(); + unit = 'color'; + } else if (property == 'opacity') { + value = parseFloat(value); + if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) + this.element.setStyle({zoom: 1}); + } else if (Element.CSS_LENGTH.test(value)) { + var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/); + value = parseFloat(components[1]); + unit = (components.length == 3) ? components[2] : null; + } + + var originalValue = this.element.getStyle(property); + return { + style: property.camelize(), + originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), + targetValue: unit=='color' ? parseColor(value) : value, + unit: unit + }; + }.bind(this)).reject(function(transform){ + return ( + (transform.originalValue == transform.targetValue) || + ( + transform.unit != 'color' && + (isNaN(transform.originalValue) || isNaN(transform.targetValue)) + ) + ); + }); + }, + update: function(position) { + var style = { }, transform, i = this.transforms.length; + while(i--) + style[(transform = this.transforms[i]).style] = + transform.unit=='color' ? '#'+ + (Math.round(transform.originalValue[0]+ + (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() + + (Math.round(transform.originalValue[1]+ + (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() + + (Math.round(transform.originalValue[2]+ + (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() : + (transform.originalValue + + (transform.targetValue - transform.originalValue) * position).toFixed(3) + + (transform.unit === null ? '' : transform.unit); + this.element.setStyle(style, true); + } +}); + +Effect.Transform = Class.create({ + initialize: function(tracks){ + this.tracks = []; + this.options = arguments[1] || { }; + this.addTracks(tracks); + }, + addTracks: function(tracks){ + tracks.each(function(track){ + track = $H(track); + var data = track.values().first(); + this.tracks.push($H({ + ids: track.keys().first(), + effect: Effect.Morph, + options: { style: data } + })); + }.bind(this)); + return this; + }, + play: function(){ + return new Effect.Parallel( + this.tracks.map(function(track){ + var ids = track.get('ids'), effect = track.get('effect'), options = track.get('options'); + var elements = [$(ids) || $$(ids)].flatten(); + return elements.map(function(e){ return new effect(e, Object.extend({ sync:true }, options)) }); + }).flatten(), + this.options + ); + } +}); + +Element.CSS_PROPERTIES = $w( + 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + + 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' + + 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' + + 'borderTopColor borderTopStyle borderTopWidth bottom clip color ' + + 'fontSize fontWeight height left letterSpacing lineHeight ' + + 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+ + 'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' + + 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' + + 'right textIndent top width wordSpacing zIndex'); + +Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/; + +String.__parseStyleElement = document.createElement('div'); +String.prototype.parseStyle = function(){ + var style, styleRules = $H(); + if (Prototype.Browser.WebKit) + style = new Element('div',{style:this}).style; + else { + String.__parseStyleElement.innerHTML = '
    '; + style = String.__parseStyleElement.childNodes[0].style; + } + + Element.CSS_PROPERTIES.each(function(property){ + if (style[property]) styleRules.set(property, style[property]); + }); + + if (Prototype.Browser.IE && this.include('opacity')) + styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]); + + return styleRules; +}; + +if (document.defaultView && document.defaultView.getComputedStyle) { + Element.getStyles = function(element) { + var css = document.defaultView.getComputedStyle($(element), null); + return Element.CSS_PROPERTIES.inject({ }, function(styles, property) { + styles[property] = css[property]; + return styles; + }); + }; +} else { + Element.getStyles = function(element) { + element = $(element); + var css = element.currentStyle, styles; + styles = Element.CSS_PROPERTIES.inject({ }, function(results, property) { + results[property] = css[property]; + return results; + }); + if (!styles.opacity) styles.opacity = element.getOpacity(); + return styles; + }; +} + +Effect.Methods = { + morph: function(element, style) { + element = $(element); + new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { })); + return element; + }, + visualEffect: function(element, effect, options) { + element = $(element); + var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1); + new Effect[klass](element, options); + return element; + }, + highlight: function(element, options) { + element = $(element); + new Effect.Highlight(element, options); + return element; + } +}; + +$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+ + 'pulsate shake puff squish switchOff dropOut').each( + function(effect) { + Effect.Methods[effect] = function(element, options){ + element = $(element); + Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options); + return element; + }; + } +); + +$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each( + function(f) { Effect.Methods[f] = Element[f]; } +); + +Element.addMethods(Effect.Methods); \ No newline at end of file diff --git a/web-app/js/prototype/prototype.js b/web-app/js/prototype/prototype.js new file mode 100644 index 0000000..9fe6e12 --- /dev/null +++ b/web-app/js/prototype/prototype.js @@ -0,0 +1,4874 @@ +/* Prototype JavaScript framework, version 1.6.1 + * (c) 2005-2009 Sam Stephenson + * + * Prototype is freely distributable under the terms of an MIT-style license. + * For details, see the Prototype web site: http://www.prototypejs.org/ + * + *--------------------------------------------------------------------------*/ + +var Prototype = { + Version: '1.6.1', + + Browser: (function(){ + var ua = navigator.userAgent; + var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]'; + return { + IE: !!window.attachEvent && !isOpera, + Opera: isOpera, + WebKit: ua.indexOf('AppleWebKit/') > -1, + Gecko: ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1, + MobileSafari: /Apple.*Mobile.*Safari/.test(ua) + } + })(), + + BrowserFeatures: { + XPath: !!document.evaluate, + SelectorsAPI: !!document.querySelector, + ElementExtensions: (function() { + var constructor = window.Element || window.HTMLElement; + return !!(constructor && constructor.prototype); + })(), + SpecificElementExtensions: (function() { + if (typeof window.HTMLDivElement !== 'undefined') + return true; + + var div = document.createElement('div'); + var form = document.createElement('form'); + var isSupported = false; + + if (div['__proto__'] && (div['__proto__'] !== form['__proto__'])) { + isSupported = true; + } + + div = form = null; + + return isSupported; + })() + }, + + ScriptFragment: ']*>([\\S\\s]*?)<\/script>', + JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/, + + emptyFunction: function() { }, + K: function(x) { return x } +}; + +if (Prototype.Browser.MobileSafari) + Prototype.BrowserFeatures.SpecificElementExtensions = false; + + +var Abstract = { }; + + +var Try = { + these: function() { + var returnValue; + + for (var i = 0, length = arguments.length; i < length; i++) { + var lambda = arguments[i]; + try { + returnValue = lambda(); + break; + } catch (e) { } + } + + return returnValue; + } +}; + +/* Based on Alex Arnell's inheritance implementation. */ + +var Class = (function() { + function subclass() {}; + function create() { + var parent = null, properties = $A(arguments); + if (Object.isFunction(properties[0])) + parent = properties.shift(); + + function klass() { + this.initialize.apply(this, arguments); + } + + Object.extend(klass, Class.Methods); + klass.superclass = parent; + klass.subclasses = []; + + if (parent) { + subclass.prototype = parent.prototype; + klass.prototype = new subclass; + parent.subclasses.push(klass); + } + + for (var i = 0; i < properties.length; i++) + klass.addMethods(properties[i]); + + if (!klass.prototype.initialize) + klass.prototype.initialize = Prototype.emptyFunction; + + klass.prototype.constructor = klass; + return klass; + } + + function addMethods(source) { + var ancestor = this.superclass && this.superclass.prototype; + var properties = Object.keys(source); + + if (!Object.keys({ toString: true }).length) { + if (source.toString != Object.prototype.toString) + properties.push("toString"); + if (source.valueOf != Object.prototype.valueOf) + properties.push("valueOf"); + } + + for (var i = 0, length = properties.length; i < length; i++) { + var property = properties[i], value = source[property]; + if (ancestor && Object.isFunction(value) && + value.argumentNames().first() == "$super") { + var method = value; + value = (function(m) { + return function() { return ancestor[m].apply(this, arguments); }; + })(property).wrap(method); + + value.valueOf = method.valueOf.bind(method); + value.toString = method.toString.bind(method); + } + this.prototype[property] = value; + } + + return this; + } + + return { + create: create, + Methods: { + addMethods: addMethods + } + }; +})(); +(function() { + + var _toString = Object.prototype.toString; + + function extend(destination, source) { + for (var property in source) + destination[property] = source[property]; + return destination; + } + + function inspect(object) { + try { + if (isUndefined(object)) return 'undefined'; + if (object === null) return 'null'; + return object.inspect ? object.inspect() : String(object); + } catch (e) { + if (e instanceof RangeError) return '...'; + throw e; + } + } + + function toJSON(object) { + var type = typeof object; + switch (type) { + case 'undefined': + case 'function': + case 'unknown': return; + case 'boolean': return object.toString(); + } + + if (object === null) return 'null'; + if (object.toJSON) return object.toJSON(); + if (isElement(object)) return; + + var results = []; + for (var property in object) { + var value = toJSON(object[property]); + if (!isUndefined(value)) + results.push(property.toJSON() + ': ' + value); + } + + return '{' + results.join(', ') + '}'; + } + + function toQueryString(object) { + return $H(object).toQueryString(); + } + + function toHTML(object) { + return object && object.toHTML ? object.toHTML() : String.interpret(object); + } + + function keys(object) { + var results = []; + for (var property in object) + results.push(property); + return results; + } + + function values(object) { + var results = []; + for (var property in object) + results.push(object[property]); + return results; + } + + function clone(object) { + return extend({ }, object); + } + + function isElement(object) { + return !!(object && object.nodeType == 1); + } + + function isArray(object) { + return _toString.call(object) == "[object Array]"; + } + + + function isHash(object) { + return object instanceof Hash; + } + + function isFunction(object) { + return typeof object === "function"; + } + + function isString(object) { + return _toString.call(object) == "[object String]"; + } + + function isNumber(object) { + return _toString.call(object) == "[object Number]"; + } + + function isUndefined(object) { + return typeof object === "undefined"; + } + + extend(Object, { + extend: extend, + inspect: inspect, + toJSON: toJSON, + toQueryString: toQueryString, + toHTML: toHTML, + keys: keys, + values: values, + clone: clone, + isElement: isElement, + isArray: isArray, + isHash: isHash, + isFunction: isFunction, + isString: isString, + isNumber: isNumber, + isUndefined: isUndefined + }); +})(); +Object.extend(Function.prototype, (function() { + var slice = Array.prototype.slice; + + function update(array, args) { + var arrayLength = array.length, length = args.length; + while (length--) array[arrayLength + length] = args[length]; + return array; + } + + function merge(array, args) { + array = slice.call(array, 0); + return update(array, args); + } + + function argumentNames() { + var names = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1] + .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '') + .replace(/\s+/g, '').split(','); + return names.length == 1 && !names[0] ? [] : names; + } + + function bind(context) { + if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this; + var __method = this, args = slice.call(arguments, 1); + return function() { + var a = merge(args, arguments); + return __method.apply(context, a); + } + } + + function bindAsEventListener(context) { + var __method = this, args = slice.call(arguments, 1); + return function(event) { + var a = update([event || window.event], args); + return __method.apply(context, a); + } + } + + function curry() { + if (!arguments.length) return this; + var __method = this, args = slice.call(arguments, 0); + return function() { + var a = merge(args, arguments); + return __method.apply(this, a); + } + } + + function delay(timeout) { + var __method = this, args = slice.call(arguments, 1); + timeout = timeout * 1000 + return window.setTimeout(function() { + return __method.apply(__method, args); + }, timeout); + } + + function defer() { + var args = update([0.01], arguments); + return this.delay.apply(this, args); + } + + function wrap(wrapper) { + var __method = this; + return function() { + var a = update([__method.bind(this)], arguments); + return wrapper.apply(this, a); + } + } + + function methodize() { + if (this._methodized) return this._methodized; + var __method = this; + return this._methodized = function() { + var a = update([this], arguments); + return __method.apply(null, a); + }; + } + + return { + argumentNames: argumentNames, + bind: bind, + bindAsEventListener: bindAsEventListener, + curry: curry, + delay: delay, + defer: defer, + wrap: wrap, + methodize: methodize + } +})()); + + +Date.prototype.toJSON = function() { + return '"' + this.getUTCFullYear() + '-' + + (this.getUTCMonth() + 1).toPaddedString(2) + '-' + + this.getUTCDate().toPaddedString(2) + 'T' + + this.getUTCHours().toPaddedString(2) + ':' + + this.getUTCMinutes().toPaddedString(2) + ':' + + this.getUTCSeconds().toPaddedString(2) + 'Z"'; +}; + + +RegExp.prototype.match = RegExp.prototype.test; + +RegExp.escape = function(str) { + return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); +}; +var PeriodicalExecuter = Class.create({ + initialize: function(callback, frequency) { + this.callback = callback; + this.frequency = frequency; + this.currentlyExecuting = false; + + this.registerCallback(); + }, + + registerCallback: function() { + this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); + }, + + execute: function() { + this.callback(this); + }, + + stop: function() { + if (!this.timer) return; + clearInterval(this.timer); + this.timer = null; + }, + + onTimerEvent: function() { + if (!this.currentlyExecuting) { + try { + this.currentlyExecuting = true; + this.execute(); + this.currentlyExecuting = false; + } catch(e) { + this.currentlyExecuting = false; + throw e; + } + } + } +}); +Object.extend(String, { + interpret: function(value) { + return value == null ? '' : String(value); + }, + specialChar: { + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '\\': '\\\\' + } +}); + +Object.extend(String.prototype, (function() { + + function prepareReplacement(replacement) { + if (Object.isFunction(replacement)) return replacement; + var template = new Template(replacement); + return function(match) { return template.evaluate(match) }; + } + + function gsub(pattern, replacement) { + var result = '', source = this, match; + replacement = prepareReplacement(replacement); + + if (Object.isString(pattern)) + pattern = RegExp.escape(pattern); + + if (!(pattern.length || pattern.source)) { + replacement = replacement(''); + return replacement + source.split('').join(replacement) + replacement; + } + + while (source.length > 0) { + if (match = source.match(pattern)) { + result += source.slice(0, match.index); + result += String.interpret(replacement(match)); + source = source.slice(match.index + match[0].length); + } else { + result += source, source = ''; + } + } + return result; + } + + function sub(pattern, replacement, count) { + replacement = prepareReplacement(replacement); + count = Object.isUndefined(count) ? 1 : count; + + return this.gsub(pattern, function(match) { + if (--count < 0) return match[0]; + return replacement(match); + }); + } + + function scan(pattern, iterator) { + this.gsub(pattern, iterator); + return String(this); + } + + function truncate(length, truncation) { + length = length || 30; + truncation = Object.isUndefined(truncation) ? '...' : truncation; + return this.length > length ? + this.slice(0, length - truncation.length) + truncation : String(this); + } + + function strip() { + return this.replace(/^\s+/, '').replace(/\s+$/, ''); + } + + function stripTags() { + return this.replace(/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi, ''); + } + + function stripScripts() { + return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); + } + + function extractScripts() { + var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); + var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); + return (this.match(matchAll) || []).map(function(scriptTag) { + return (scriptTag.match(matchOne) || ['', ''])[1]; + }); + } + + function evalScripts() { + return this.extractScripts().map(function(script) { return eval(script) }); + } + + function escapeHTML() { + return this.replace(/&/g,'&').replace(//g,'>'); + } + + function unescapeHTML() { + return this.stripTags().replace(/</g,'<').replace(/>/g,'>').replace(/&/g,'&'); + } + + + function toQueryParams(separator) { + var match = this.strip().match(/([^?#]*)(#.*)?$/); + if (!match) return { }; + + return match[1].split(separator || '&').inject({ }, function(hash, pair) { + if ((pair = pair.split('='))[0]) { + var key = decodeURIComponent(pair.shift()); + var value = pair.length > 1 ? pair.join('=') : pair[0]; + if (value != undefined) value = decodeURIComponent(value); + + if (key in hash) { + if (!Object.isArray(hash[key])) hash[key] = [hash[key]]; + hash[key].push(value); + } + else hash[key] = value; + } + return hash; + }); + } + + function toArray() { + return this.split(''); + } + + function succ() { + return this.slice(0, this.length - 1) + + String.fromCharCode(this.charCodeAt(this.length - 1) + 1); + } + + function times(count) { + return count < 1 ? '' : new Array(count + 1).join(this); + } + + function camelize() { + var parts = this.split('-'), len = parts.length; + if (len == 1) return parts[0]; + + var camelized = this.charAt(0) == '-' + ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) + : parts[0]; + + for (var i = 1; i < len; i++) + camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1); + + return camelized; + } + + function capitalize() { + return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); + } + + function underscore() { + return this.replace(/::/g, '/') + .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2') + .replace(/([a-z\d])([A-Z])/g, '$1_$2') + .replace(/-/g, '_') + .toLowerCase(); + } + + function dasherize() { + return this.replace(/_/g, '-'); + } + + function inspect(useDoubleQuotes) { + var escapedString = this.replace(/[\x00-\x1f\\]/g, function(character) { + if (character in String.specialChar) { + return String.specialChar[character]; + } + return '\\u00' + character.charCodeAt().toPaddedString(2, 16); + }); + if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; + return "'" + escapedString.replace(/'/g, '\\\'') + "'"; + } + + function toJSON() { + return this.inspect(true); + } + + function unfilterJSON(filter) { + return this.replace(filter || Prototype.JSONFilter, '$1'); + } + + function isJSON() { + var str = this; + if (str.blank()) return false; + str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''); + return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str); + } + + function evalJSON(sanitize) { + var json = this.unfilterJSON(); + try { + if (!sanitize || json.isJSON()) return eval('(' + json + ')'); + } catch (e) { } + throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); + } + + function include(pattern) { + return this.indexOf(pattern) > -1; + } + + function startsWith(pattern) { + return this.indexOf(pattern) === 0; + } + + function endsWith(pattern) { + var d = this.length - pattern.length; + return d >= 0 && this.lastIndexOf(pattern) === d; + } + + function empty() { + return this == ''; + } + + function blank() { + return /^\s*$/.test(this); + } + + function interpolate(object, pattern) { + return new Template(this, pattern).evaluate(object); + } + + return { + gsub: gsub, + sub: sub, + scan: scan, + truncate: truncate, + strip: String.prototype.trim ? String.prototype.trim : strip, + stripTags: stripTags, + stripScripts: stripScripts, + extractScripts: extractScripts, + evalScripts: evalScripts, + escapeHTML: escapeHTML, + unescapeHTML: unescapeHTML, + toQueryParams: toQueryParams, + parseQuery: toQueryParams, + toArray: toArray, + succ: succ, + times: times, + camelize: camelize, + capitalize: capitalize, + underscore: underscore, + dasherize: dasherize, + inspect: inspect, + toJSON: toJSON, + unfilterJSON: unfilterJSON, + isJSON: isJSON, + evalJSON: evalJSON, + include: include, + startsWith: startsWith, + endsWith: endsWith, + empty: empty, + blank: blank, + interpolate: interpolate + }; +})()); + +var Template = Class.create({ + initialize: function(template, pattern) { + this.template = template.toString(); + this.pattern = pattern || Template.Pattern; + }, + + evaluate: function(object) { + if (object && Object.isFunction(object.toTemplateReplacements)) + object = object.toTemplateReplacements(); + + return this.template.gsub(this.pattern, function(match) { + if (object == null) return (match[1] + ''); + + var before = match[1] || ''; + if (before == '\\') return match[2]; + + var ctx = object, expr = match[3]; + var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; + match = pattern.exec(expr); + if (match == null) return before; + + while (match != null) { + var comp = match[1].startsWith('[') ? match[2].replace(/\\\\]/g, ']') : match[1]; + ctx = ctx[comp]; + if (null == ctx || '' == match[3]) break; + expr = expr.substring('[' == match[3] ? match[1].length : match[0].length); + match = pattern.exec(expr); + } + + return before + String.interpret(ctx); + }); + } +}); +Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; + +var $break = { }; + +var Enumerable = (function() { + function each(iterator, context) { + var index = 0; + try { + this._each(function(value) { + iterator.call(context, value, index++); + }); + } catch (e) { + if (e != $break) throw e; + } + return this; + } + + function eachSlice(number, iterator, context) { + var index = -number, slices = [], array = this.toArray(); + if (number < 1) return array; + while ((index += number) < array.length) + slices.push(array.slice(index, index+number)); + return slices.collect(iterator, context); + } + + function all(iterator, context) { + iterator = iterator || Prototype.K; + var result = true; + this.each(function(value, index) { + result = result && !!iterator.call(context, value, index); + if (!result) throw $break; + }); + return result; + } + + function any(iterator, context) { + iterator = iterator || Prototype.K; + var result = false; + this.each(function(value, index) { + if (result = !!iterator.call(context, value, index)) + throw $break; + }); + return result; + } + + function collect(iterator, context) { + iterator = iterator || Prototype.K; + var results = []; + this.each(function(value, index) { + results.push(iterator.call(context, value, index)); + }); + return results; + } + + function detect(iterator, context) { + var result; + this.each(function(value, index) { + if (iterator.call(context, value, index)) { + result = value; + throw $break; + } + }); + return result; + } + + function findAll(iterator, context) { + var results = []; + this.each(function(value, index) { + if (iterator.call(context, value, index)) + results.push(value); + }); + return results; + } + + function grep(filter, iterator, context) { + iterator = iterator || Prototype.K; + var results = []; + + if (Object.isString(filter)) + filter = new RegExp(RegExp.escape(filter)); + + this.each(function(value, index) { + if (filter.match(value)) + results.push(iterator.call(context, value, index)); + }); + return results; + } + + function include(object) { + if (Object.isFunction(this.indexOf)) + if (this.indexOf(object) != -1) return true; + + var found = false; + this.each(function(value) { + if (value == object) { + found = true; + throw $break; + } + }); + return found; + } + + function inGroupsOf(number, fillWith) { + fillWith = Object.isUndefined(fillWith) ? null : fillWith; + return this.eachSlice(number, function(slice) { + while(slice.length < number) slice.push(fillWith); + return slice; + }); + } + + function inject(memo, iterator, context) { + this.each(function(value, index) { + memo = iterator.call(context, memo, value, index); + }); + return memo; + } + + function invoke(method) { + var args = $A(arguments).slice(1); + return this.map(function(value) { + return value[method].apply(value, args); + }); + } + + function max(iterator, context) { + iterator = iterator || Prototype.K; + var result; + this.each(function(value, index) { + value = iterator.call(context, value, index); + if (result == null || value >= result) + result = value; + }); + return result; + } + + function min(iterator, context) { + iterator = iterator || Prototype.K; + var result; + this.each(function(value, index) { + value = iterator.call(context, value, index); + if (result == null || value < result) + result = value; + }); + return result; + } + + function partition(iterator, context) { + iterator = iterator || Prototype.K; + var trues = [], falses = []; + this.each(function(value, index) { + (iterator.call(context, value, index) ? + trues : falses).push(value); + }); + return [trues, falses]; + } + + function pluck(property) { + var results = []; + this.each(function(value) { + results.push(value[property]); + }); + return results; + } + + function reject(iterator, context) { + var results = []; + this.each(function(value, index) { + if (!iterator.call(context, value, index)) + results.push(value); + }); + return results; + } + + function sortBy(iterator, context) { + return this.map(function(value, index) { + return { + value: value, + criteria: iterator.call(context, value, index) + }; + }).sort(function(left, right) { + var a = left.criteria, b = right.criteria; + return a < b ? -1 : a > b ? 1 : 0; + }).pluck('value'); + } + + function toArray() { + return this.map(); + } + + function zip() { + var iterator = Prototype.K, args = $A(arguments); + if (Object.isFunction(args.last())) + iterator = args.pop(); + + var collections = [this].concat(args).map($A); + return this.map(function(value, index) { + return iterator(collections.pluck(index)); + }); + } + + function size() { + return this.toArray().length; + } + + function inspect() { + return '#'; + } + + + + + + + + + + return { + each: each, + eachSlice: eachSlice, + all: all, + every: all, + any: any, + some: any, + collect: collect, + map: collect, + detect: detect, + findAll: findAll, + select: findAll, + filter: findAll, + grep: grep, + include: include, + member: include, + inGroupsOf: inGroupsOf, + inject: inject, + invoke: invoke, + max: max, + min: min, + partition: partition, + pluck: pluck, + reject: reject, + sortBy: sortBy, + toArray: toArray, + entries: toArray, + zip: zip, + size: size, + inspect: inspect, + find: detect + }; +})(); +function $A(iterable) { + if (!iterable) return []; + if ('toArray' in Object(iterable)) return iterable.toArray(); + var length = iterable.length || 0, results = new Array(length); + while (length--) results[length] = iterable[length]; + return results; +} + +function $w(string) { + if (!Object.isString(string)) return []; + string = string.strip(); + return string ? string.split(/\s+/) : []; +} + +Array.from = $A; + + +(function() { + var arrayProto = Array.prototype, + slice = arrayProto.slice, + _each = arrayProto.forEach; // use native browser JS 1.6 implementation if available + + function each(iterator) { + for (var i = 0, length = this.length; i < length; i++) + iterator(this[i]); + } + if (!_each) _each = each; + + function clear() { + this.length = 0; + return this; + } + + function first() { + return this[0]; + } + + function last() { + return this[this.length - 1]; + } + + function compact() { + return this.select(function(value) { + return value != null; + }); + } + + function flatten() { + return this.inject([], function(array, value) { + if (Object.isArray(value)) + return array.concat(value.flatten()); + array.push(value); + return array; + }); + } + + function without() { + var values = slice.call(arguments, 0); + return this.select(function(value) { + return !values.include(value); + }); + } + + function reverse(inline) { + return (inline !== false ? this : this.toArray())._reverse(); + } + + function uniq(sorted) { + return this.inject([], function(array, value, index) { + if (0 == index || (sorted ? array.last() != value : !array.include(value))) + array.push(value); + return array; + }); + } + + function intersect(array) { + return this.uniq().findAll(function(item) { + return array.detect(function(value) { return item === value }); + }); + } + + + function clone() { + return slice.call(this, 0); + } + + function size() { + return this.length; + } + + function inspect() { + return '[' + this.map(Object.inspect).join(', ') + ']'; + } + + function toJSON() { + var results = []; + this.each(function(object) { + var value = Object.toJSON(object); + if (!Object.isUndefined(value)) results.push(value); + }); + return '[' + results.join(', ') + ']'; + } + + function indexOf(item, i) { + i || (i = 0); + var length = this.length; + if (i < 0) i = length + i; + for (; i < length; i++) + if (this[i] === item) return i; + return -1; + } + + function lastIndexOf(item, i) { + i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; + var n = this.slice(0, i).reverse().indexOf(item); + return (n < 0) ? n : i - n - 1; + } + + function concat() { + var array = slice.call(this, 0), item; + for (var i = 0, length = arguments.length; i < length; i++) { + item = arguments[i]; + if (Object.isArray(item) && !('callee' in item)) { + for (var j = 0, arrayLength = item.length; j < arrayLength; j++) + array.push(item[j]); + } else { + array.push(item); + } + } + return array; + } + + Object.extend(arrayProto, Enumerable); + + if (!arrayProto._reverse) + arrayProto._reverse = arrayProto.reverse; + + Object.extend(arrayProto, { + _each: _each, + clear: clear, + first: first, + last: last, + compact: compact, + flatten: flatten, + without: without, + reverse: reverse, + uniq: uniq, + intersect: intersect, + clone: clone, + toArray: clone, + size: size, + inspect: inspect, + toJSON: toJSON + }); + + var CONCAT_ARGUMENTS_BUGGY = (function() { + return [].concat(arguments)[0][0] !== 1; + })(1,2) + + if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat = concat; + + if (!arrayProto.indexOf) arrayProto.indexOf = indexOf; + if (!arrayProto.lastIndexOf) arrayProto.lastIndexOf = lastIndexOf; +})(); +function $H(object) { + return new Hash(object); +}; + +var Hash = Class.create(Enumerable, (function() { + function initialize(object) { + this._object = Object.isHash(object) ? object.toObject() : Object.clone(object); + } + + function _each(iterator) { + for (var key in this._object) { + var value = this._object[key], pair = [key, value]; + pair.key = key; + pair.value = value; + iterator(pair); + } + } + + function set(key, value) { + return this._object[key] = value; + } + + function get(key) { + if (this._object[key] !== Object.prototype[key]) + return this._object[key]; + } + + function unset(key) { + var value = this._object[key]; + delete this._object[key]; + return value; + } + + function toObject() { + return Object.clone(this._object); + } + + function keys() { + return this.pluck('key'); + } + + function values() { + return this.pluck('value'); + } + + function index(value) { + var match = this.detect(function(pair) { + return pair.value === value; + }); + return match && match.key; + } + + function merge(object) { + return this.clone().update(object); + } + + function update(object) { + return new Hash(object).inject(this, function(result, pair) { + result.set(pair.key, pair.value); + return result; + }); + } + + function toQueryPair(key, value) { + if (Object.isUndefined(value)) return key; + return key + '=' + encodeURIComponent(String.interpret(value)); + } + + function toQueryString() { + return this.inject([], function(results, pair) { + var key = encodeURIComponent(pair.key), values = pair.value; + + if (values && typeof values == 'object') { + if (Object.isArray(values)) + return results.concat(values.map(toQueryPair.curry(key))); + } else results.push(toQueryPair(key, values)); + return results; + }).join('&'); + } + + function inspect() { + return '#'; + } + + function toJSON() { + return Object.toJSON(this.toObject()); + } + + function clone() { + return new Hash(this); + } + + return { + initialize: initialize, + _each: _each, + set: set, + get: get, + unset: unset, + toObject: toObject, + toTemplateReplacements: toObject, + keys: keys, + values: values, + index: index, + merge: merge, + update: update, + toQueryString: toQueryString, + inspect: inspect, + toJSON: toJSON, + clone: clone + }; +})()); + +Hash.from = $H; +Object.extend(Number.prototype, (function() { + function toColorPart() { + return this.toPaddedString(2, 16); + } + + function succ() { + return this + 1; + } + + function times(iterator, context) { + $R(0, this, true).each(iterator, context); + return this; + } + + function toPaddedString(length, radix) { + var string = this.toString(radix || 10); + return '0'.times(length - string.length) + string; + } + + function toJSON() { + return isFinite(this) ? this.toString() : 'null'; + } + + function abs() { + return Math.abs(this); + } + + function round() { + return Math.round(this); + } + + function ceil() { + return Math.ceil(this); + } + + function floor() { + return Math.floor(this); + } + + return { + toColorPart: toColorPart, + succ: succ, + times: times, + toPaddedString: toPaddedString, + toJSON: toJSON, + abs: abs, + round: round, + ceil: ceil, + floor: floor + }; +})()); + +function $R(start, end, exclusive) { + return new ObjectRange(start, end, exclusive); +} + +var ObjectRange = Class.create(Enumerable, (function() { + function initialize(start, end, exclusive) { + this.start = start; + this.end = end; + this.exclusive = exclusive; + } + + function _each(iterator) { + var value = this.start; + while (this.include(value)) { + iterator(value); + value = value.succ(); + } + } + + function include(value) { + if (value < this.start) + return false; + if (this.exclusive) + return value < this.end; + return value <= this.end; + } + + return { + initialize: initialize, + _each: _each, + include: include + }; +})()); + + + +var Ajax = { + getTransport: function() { + return Try.these( + function() {return new XMLHttpRequest()}, + function() {return new ActiveXObject('Msxml2.XMLHTTP')}, + function() {return new ActiveXObject('Microsoft.XMLHTTP')} + ) || false; + }, + + activeRequestCount: 0 +}; + +Ajax.Responders = { + responders: [], + + _each: function(iterator) { + this.responders._each(iterator); + }, + + register: function(responder) { + if (!this.include(responder)) + this.responders.push(responder); + }, + + unregister: function(responder) { + this.responders = this.responders.without(responder); + }, + + dispatch: function(callback, request, transport, json) { + this.each(function(responder) { + if (Object.isFunction(responder[callback])) { + try { + responder[callback].apply(responder, [request, transport, json]); + } catch (e) { } + } + }); + } +}; + +Object.extend(Ajax.Responders, Enumerable); + +Ajax.Responders.register({ + onCreate: function() { Ajax.activeRequestCount++ }, + onComplete: function() { Ajax.activeRequestCount-- } +}); +Ajax.Base = Class.create({ + initialize: function(options) { + this.options = { + method: 'post', + asynchronous: true, + contentType: 'application/x-www-form-urlencoded', + encoding: 'UTF-8', + parameters: '', + evalJSON: true, + evalJS: true + }; + Object.extend(this.options, options || { }); + + this.options.method = this.options.method.toLowerCase(); + + if (Object.isString(this.options.parameters)) + this.options.parameters = this.options.parameters.toQueryParams(); + else if (Object.isHash(this.options.parameters)) + this.options.parameters = this.options.parameters.toObject(); + } +}); +Ajax.Request = Class.create(Ajax.Base, { + _complete: false, + + initialize: function($super, url, options) { + $super(options); + this.transport = Ajax.getTransport(); + this.request(url); + }, + + request: function(url) { + this.url = url; + this.method = this.options.method; + var params = Object.clone(this.options.parameters); + + if (!['get', 'post'].include(this.method)) { + params['_method'] = this.method; + this.method = 'post'; + } + + this.parameters = params; + + if (params = Object.toQueryString(params)) { + if (this.method == 'get') + this.url += (this.url.include('?') ? '&' : '?') + params; + else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) + params += '&_='; + } + + try { + var response = new Ajax.Response(this); + if (this.options.onCreate) this.options.onCreate(response); + Ajax.Responders.dispatch('onCreate', this, response); + + this.transport.open(this.method.toUpperCase(), this.url, + this.options.asynchronous); + + if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1); + + this.transport.onreadystatechange = this.onStateChange.bind(this); + this.setRequestHeaders(); + + this.body = this.method == 'post' ? (this.options.postBody || params) : null; + this.transport.send(this.body); + + /* Force Firefox to handle ready state 4 for synchronous requests */ + if (!this.options.asynchronous && this.transport.overrideMimeType) + this.onStateChange(); + + } + catch (e) { + this.dispatchException(e); + } + }, + + onStateChange: function() { + var readyState = this.transport.readyState; + if (readyState > 1 && !((readyState == 4) && this._complete)) + this.respondToReadyState(this.transport.readyState); + }, + + setRequestHeaders: function() { + var headers = { + 'X-Requested-With': 'XMLHttpRequest', + 'X-Prototype-Version': Prototype.Version, + 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' + }; + + if (this.method == 'post') { + headers['Content-type'] = this.options.contentType + + (this.options.encoding ? '; charset=' + this.options.encoding : ''); + + /* Force "Connection: close" for older Mozilla browsers to work + * around a bug where XMLHttpRequest sends an incorrect + * Content-length header. See Mozilla Bugzilla #246651. + */ + if (this.transport.overrideMimeType && + (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) + headers['Connection'] = 'close'; + } + + if (typeof this.options.requestHeaders == 'object') { + var extras = this.options.requestHeaders; + + if (Object.isFunction(extras.push)) + for (var i = 0, length = extras.length; i < length; i += 2) + headers[extras[i]] = extras[i+1]; + else + $H(extras).each(function(pair) { headers[pair.key] = pair.value }); + } + + for (var name in headers) + this.transport.setRequestHeader(name, headers[name]); + }, + + success: function() { + var status = this.getStatus(); + return !status || (status >= 200 && status < 300); + }, + + getStatus: function() { + try { + return this.transport.status || 0; + } catch (e) { return 0 } + }, + + respondToReadyState: function(readyState) { + var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this); + + if (state == 'Complete') { + try { + this._complete = true; + (this.options['on' + response.status] + || this.options['on' + (this.success() ? 'Success' : 'Failure')] + || Prototype.emptyFunction)(response, response.headerJSON); + } catch (e) { + this.dispatchException(e); + } + + var contentType = response.getHeader('Content-type'); + if (this.options.evalJS == 'force' + || (this.options.evalJS && this.isSameOrigin() && contentType + && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) + this.evalResponse(); + } + + try { + (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON); + Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON); + } catch (e) { + this.dispatchException(e); + } + + if (state == 'Complete') { + this.transport.onreadystatechange = Prototype.emptyFunction; + } + }, + + isSameOrigin: function() { + var m = this.url.match(/^\s*https?:\/\/[^\/]*/); + return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({ + protocol: location.protocol, + domain: document.domain, + port: location.port ? ':' + location.port : '' + })); + }, + + getHeader: function(name) { + try { + return this.transport.getResponseHeader(name) || null; + } catch (e) { return null; } + }, + + evalResponse: function() { + try { + return eval((this.transport.responseText || '').unfilterJSON()); + } catch (e) { + this.dispatchException(e); + } + }, + + dispatchException: function(exception) { + (this.options.onException || Prototype.emptyFunction)(this, exception); + Ajax.Responders.dispatch('onException', this, exception); + } +}); + +Ajax.Request.Events = + ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; + + + + + + + + +Ajax.Response = Class.create({ + initialize: function(request){ + this.request = request; + var transport = this.transport = request.transport, + readyState = this.readyState = transport.readyState; + + if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { + this.status = this.getStatus(); + this.statusText = this.getStatusText(); + this.responseText = String.interpret(transport.responseText); + this.headerJSON = this._getHeaderJSON(); + } + + if(readyState == 4) { + var xml = transport.responseXML; + this.responseXML = Object.isUndefined(xml) ? null : xml; + this.responseJSON = this._getResponseJSON(); + } + }, + + status: 0, + + statusText: '', + + getStatus: Ajax.Request.prototype.getStatus, + + getStatusText: function() { + try { + return this.transport.statusText || ''; + } catch (e) { return '' } + }, + + getHeader: Ajax.Request.prototype.getHeader, + + getAllHeaders: function() { + try { + return this.getAllResponseHeaders(); + } catch (e) { return null } + }, + + getResponseHeader: function(name) { + return this.transport.getResponseHeader(name); + }, + + getAllResponseHeaders: function() { + return this.transport.getAllResponseHeaders(); + }, + + _getHeaderJSON: function() { + var json = this.getHeader('X-JSON'); + if (!json) return null; + json = decodeURIComponent(escape(json)); + try { + return json.evalJSON(this.request.options.sanitizeJSON || + !this.request.isSameOrigin()); + } catch (e) { + this.request.dispatchException(e); + } + }, + + _getResponseJSON: function() { + var options = this.request.options; + if (!options.evalJSON || (options.evalJSON != 'force' && + !(this.getHeader('Content-type') || '').include('application/json')) || + this.responseText.blank()) + return null; + try { + return this.responseText.evalJSON(options.sanitizeJSON || + !this.request.isSameOrigin()); + } catch (e) { + this.request.dispatchException(e); + } + } +}); + +Ajax.Updater = Class.create(Ajax.Request, { + initialize: function($super, container, url, options) { + this.container = { + success: (container.success || container), + failure: (container.failure || (container.success ? null : container)) + }; + + options = Object.clone(options); + var onComplete = options.onComplete; + options.onComplete = (function(response, json) { + this.updateContent(response.responseText); + if (Object.isFunction(onComplete)) onComplete(response, json); + }).bind(this); + + $super(url, options); + }, + + updateContent: function(responseText) { + var receiver = this.container[this.success() ? 'success' : 'failure'], + options = this.options; + + if (!options.evalScripts) responseText = responseText.stripScripts(); + + if (receiver = $(receiver)) { + if (options.insertion) { + if (Object.isString(options.insertion)) { + var insertion = { }; insertion[options.insertion] = responseText; + receiver.insert(insertion); + } + else options.insertion(receiver, responseText); + } + else receiver.update(responseText); + } + } +}); + +Ajax.PeriodicalUpdater = Class.create(Ajax.Base, { + initialize: function($super, container, url, options) { + $super(options); + this.onComplete = this.options.onComplete; + + this.frequency = (this.options.frequency || 2); + this.decay = (this.options.decay || 1); + + this.updater = { }; + this.container = container; + this.url = url; + + this.start(); + }, + + start: function() { + this.options.onComplete = this.updateComplete.bind(this); + this.onTimerEvent(); + }, + + stop: function() { + this.updater.options.onComplete = undefined; + clearTimeout(this.timer); + (this.onComplete || Prototype.emptyFunction).apply(this, arguments); + }, + + updateComplete: function(response) { + if (this.options.decay) { + this.decay = (response.responseText == this.lastText ? + this.decay * this.options.decay : 1); + + this.lastText = response.responseText; + } + this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency); + }, + + onTimerEvent: function() { + this.updater = new Ajax.Updater(this.container, this.url, this.options); + } +}); + + + +function $(element) { + if (arguments.length > 1) { + for (var i = 0, elements = [], length = arguments.length; i < length; i++) + elements.push($(arguments[i])); + return elements; + } + if (Object.isString(element)) + element = document.getElementById(element); + return Element.extend(element); +} + +if (Prototype.BrowserFeatures.XPath) { + document._getElementsByXPath = function(expression, parentElement) { + var results = []; + var query = document.evaluate(expression, $(parentElement) || document, + null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + for (var i = 0, length = query.snapshotLength; i < length; i++) + results.push(Element.extend(query.snapshotItem(i))); + return results; + }; +} + +/*--------------------------------------------------------------------------*/ + +if (!window.Node) var Node = { }; + +if (!Node.ELEMENT_NODE) { + Object.extend(Node, { + ELEMENT_NODE: 1, + ATTRIBUTE_NODE: 2, + TEXT_NODE: 3, + CDATA_SECTION_NODE: 4, + ENTITY_REFERENCE_NODE: 5, + ENTITY_NODE: 6, + PROCESSING_INSTRUCTION_NODE: 7, + COMMENT_NODE: 8, + DOCUMENT_NODE: 9, + DOCUMENT_TYPE_NODE: 10, + DOCUMENT_FRAGMENT_NODE: 11, + NOTATION_NODE: 12 + }); +} + + +(function(global) { + + var SETATTRIBUTE_IGNORES_NAME = (function(){ + var elForm = document.createElement("form"); + var elInput = document.createElement("input"); + var root = document.documentElement; + elInput.setAttribute("name", "test"); + elForm.appendChild(elInput); + root.appendChild(elForm); + var isBuggy = elForm.elements + ? (typeof elForm.elements.test == "undefined") + : null; + root.removeChild(elForm); + elForm = elInput = null; + return isBuggy; + })(); + + var element = global.Element; + global.Element = function(tagName, attributes) { + attributes = attributes || { }; + tagName = tagName.toLowerCase(); + var cache = Element.cache; + if (SETATTRIBUTE_IGNORES_NAME && attributes.name) { + tagName = '<' + tagName + ' name="' + attributes.name + '">'; + delete attributes.name; + return Element.writeAttribute(document.createElement(tagName), attributes); + } + if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName)); + return Element.writeAttribute(cache[tagName].cloneNode(false), attributes); + }; + Object.extend(global.Element, element || { }); + if (element) global.Element.prototype = element.prototype; +})(this); + +Element.cache = { }; +Element.idCounter = 1; + +Element.Methods = { + visible: function(element) { + return $(element).style.display != 'none'; + }, + + toggle: function(element) { + element = $(element); + Element[Element.visible(element) ? 'hide' : 'show'](element); + return element; + }, + + + hide: function(element) { + element = $(element); + element.style.display = 'none'; + return element; + }, + + show: function(element) { + element = $(element); + element.style.display = ''; + return element; + }, + + remove: function(element) { + element = $(element); + element.parentNode.removeChild(element); + return element; + }, + + update: (function(){ + + var SELECT_ELEMENT_INNERHTML_BUGGY = (function(){ + var el = document.createElement("select"), + isBuggy = true; + el.innerHTML = ""; + if (el.options && el.options[0]) { + isBuggy = el.options[0].nodeName.toUpperCase() !== "OPTION"; + } + el = null; + return isBuggy; + })(); + + var TABLE_ELEMENT_INNERHTML_BUGGY = (function(){ + try { + var el = document.createElement("table"); + if (el && el.tBodies) { + el.innerHTML = "test"; + var isBuggy = typeof el.tBodies[0] == "undefined"; + el = null; + return isBuggy; + } + } catch (e) { + return true; + } + })(); + + var SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING = (function () { + var s = document.createElement("script"), + isBuggy = false; + try { + s.appendChild(document.createTextNode("")); + isBuggy = !s.firstChild || + s.firstChild && s.firstChild.nodeType !== 3; + } catch (e) { + isBuggy = true; + } + s = null; + return isBuggy; + })(); + + function update(element, content) { + element = $(element); + + if (content && content.toElement) + content = content.toElement(); + + if (Object.isElement(content)) + return element.update().insert(content); + + content = Object.toHTML(content); + + var tagName = element.tagName.toUpperCase(); + + if (tagName === 'SCRIPT' && SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING) { + element.text = content; + return element; + } + + if (SELECT_ELEMENT_INNERHTML_BUGGY || TABLE_ELEMENT_INNERHTML_BUGGY) { + if (tagName in Element._insertionTranslations.tags) { + while (element.firstChild) { + element.removeChild(element.firstChild); + } + Element._getContentFromAnonymousElement(tagName, content.stripScripts()) + .each(function(node) { + element.appendChild(node) + }); + } + else { + element.innerHTML = content.stripScripts(); + } + } + else { + element.innerHTML = content.stripScripts(); + } + + content.evalScripts.bind(content).defer(); + return element; + } + + return update; + })(), + + replace: function(element, content) { + element = $(element); + if (content && content.toElement) content = content.toElement(); + else if (!Object.isElement(content)) { + content = Object.toHTML(content); + var range = element.ownerDocument.createRange(); + range.selectNode(element); + content.evalScripts.bind(content).defer(); + content = range.createContextualFragment(content.stripScripts()); + } + element.parentNode.replaceChild(content, element); + return element; + }, + + insert: function(element, insertions) { + element = $(element); + + if (Object.isString(insertions) || Object.isNumber(insertions) || + Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) + insertions = {bottom:insertions}; + + var content, insert, tagName, childNodes; + + for (var position in insertions) { + content = insertions[position]; + position = position.toLowerCase(); + insert = Element._insertionTranslations[position]; + + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) { + insert(element, content); + continue; + } + + content = Object.toHTML(content); + + tagName = ((position == 'before' || position == 'after') + ? element.parentNode : element).tagName.toUpperCase(); + + childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); + + if (position == 'top' || position == 'after') childNodes.reverse(); + childNodes.each(insert.curry(element)); + + content.evalScripts.bind(content).defer(); + } + + return element; + }, + + wrap: function(element, wrapper, attributes) { + element = $(element); + if (Object.isElement(wrapper)) + $(wrapper).writeAttribute(attributes || { }); + else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes); + else wrapper = new Element('div', wrapper); + if (element.parentNode) + element.parentNode.replaceChild(wrapper, element); + wrapper.appendChild(element); + return wrapper; + }, + + inspect: function(element) { + element = $(element); + var result = '<' + element.tagName.toLowerCase(); + $H({'id': 'id', 'className': 'class'}).each(function(pair) { + var property = pair.first(), attribute = pair.last(); + var value = (element[property] || '').toString(); + if (value) result += ' ' + attribute + '=' + value.inspect(true); + }); + return result + '>'; + }, + + recursivelyCollect: function(element, property) { + element = $(element); + var elements = []; + while (element = element[property]) + if (element.nodeType == 1) + elements.push(Element.extend(element)); + return elements; + }, + + ancestors: function(element) { + return Element.recursivelyCollect(element, 'parentNode'); + }, + + descendants: function(element) { + return Element.select(element, "*"); + }, + + firstDescendant: function(element) { + element = $(element).firstChild; + while (element && element.nodeType != 1) element = element.nextSibling; + return $(element); + }, + + immediateDescendants: function(element) { + if (!(element = $(element).firstChild)) return []; + while (element && element.nodeType != 1) element = element.nextSibling; + if (element) return [element].concat($(element).nextSiblings()); + return []; + }, + + previousSiblings: function(element) { + return Element.recursivelyCollect(element, 'previousSibling'); + }, + + nextSiblings: function(element) { + return Element.recursivelyCollect(element, 'nextSibling'); + }, + + siblings: function(element) { + element = $(element); + return Element.previousSiblings(element).reverse() + .concat(Element.nextSiblings(element)); + }, + + match: function(element, selector) { + if (Object.isString(selector)) + selector = new Selector(selector); + return selector.match($(element)); + }, + + up: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return $(element.parentNode); + var ancestors = Element.ancestors(element); + return Object.isNumber(expression) ? ancestors[expression] : + Selector.findElement(ancestors, expression, index); + }, + + down: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return Element.firstDescendant(element); + return Object.isNumber(expression) ? Element.descendants(element)[expression] : + Element.select(element, expression)[index || 0]; + }, + + previous: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element)); + var previousSiblings = Element.previousSiblings(element); + return Object.isNumber(expression) ? previousSiblings[expression] : + Selector.findElement(previousSiblings, expression, index); + }, + + next: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element)); + var nextSiblings = Element.nextSiblings(element); + return Object.isNumber(expression) ? nextSiblings[expression] : + Selector.findElement(nextSiblings, expression, index); + }, + + + select: function(element) { + var args = Array.prototype.slice.call(arguments, 1); + return Selector.findChildElements(element, args); + }, + + adjacent: function(element) { + var args = Array.prototype.slice.call(arguments, 1); + return Selector.findChildElements(element.parentNode, args).without(element); + }, + + identify: function(element) { + element = $(element); + var id = Element.readAttribute(element, 'id'); + if (id) return id; + do { id = 'anonymous_element_' + Element.idCounter++ } while ($(id)); + Element.writeAttribute(element, 'id', id); + return id; + }, + + readAttribute: function(element, name) { + element = $(element); + if (Prototype.Browser.IE) { + var t = Element._attributeTranslations.read; + if (t.values[name]) return t.values[name](element, name); + if (t.names[name]) name = t.names[name]; + if (name.include(':')) { + return (!element.attributes || !element.attributes[name]) ? null : + element.attributes[name].value; + } + } + return element.getAttribute(name); + }, + + writeAttribute: function(element, name, value) { + element = $(element); + var attributes = { }, t = Element._attributeTranslations.write; + + if (typeof name == 'object') attributes = name; + else attributes[name] = Object.isUndefined(value) ? true : value; + + for (var attr in attributes) { + name = t.names[attr] || attr; + value = attributes[attr]; + if (t.values[attr]) name = t.values[attr](element, value); + if (value === false || value === null) + element.removeAttribute(name); + else if (value === true) + element.setAttribute(name, name); + else element.setAttribute(name, value); + } + return element; + }, + + getHeight: function(element) { + return Element.getDimensions(element).height; + }, + + getWidth: function(element) { + return Element.getDimensions(element).width; + }, + + classNames: function(element) { + return new Element.ClassNames(element); + }, + + hasClassName: function(element, className) { + if (!(element = $(element))) return; + var elementClassName = element.className; + return (elementClassName.length > 0 && (elementClassName == className || + new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName))); + }, + + addClassName: function(element, className) { + if (!(element = $(element))) return; + if (!Element.hasClassName(element, className)) + element.className += (element.className ? ' ' : '') + className; + return element; + }, + + removeClassName: function(element, className) { + if (!(element = $(element))) return; + element.className = element.className.replace( + new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip(); + return element; + }, + + toggleClassName: function(element, className) { + if (!(element = $(element))) return; + return Element[Element.hasClassName(element, className) ? + 'removeClassName' : 'addClassName'](element, className); + }, + + cleanWhitespace: function(element) { + element = $(element); + var node = element.firstChild; + while (node) { + var nextNode = node.nextSibling; + if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) + element.removeChild(node); + node = nextNode; + } + return element; + }, + + empty: function(element) { + return $(element).innerHTML.blank(); + }, + + descendantOf: function(element, ancestor) { + element = $(element), ancestor = $(ancestor); + + if (element.compareDocumentPosition) + return (element.compareDocumentPosition(ancestor) & 8) === 8; + + if (ancestor.contains) + return ancestor.contains(element) && ancestor !== element; + + while (element = element.parentNode) + if (element == ancestor) return true; + + return false; + }, + + scrollTo: function(element) { + element = $(element); + var pos = Element.cumulativeOffset(element); + window.scrollTo(pos[0], pos[1]); + return element; + }, + + getStyle: function(element, style) { + element = $(element); + style = style == 'float' ? 'cssFloat' : style.camelize(); + var value = element.style[style]; + if (!value || value == 'auto') { + var css = document.defaultView.getComputedStyle(element, null); + value = css ? css[style] : null; + } + if (style == 'opacity') return value ? parseFloat(value) : 1.0; + return value == 'auto' ? null : value; + }, + + getOpacity: function(element) { + return $(element).getStyle('opacity'); + }, + + setStyle: function(element, styles) { + element = $(element); + var elementStyle = element.style, match; + if (Object.isString(styles)) { + element.style.cssText += ';' + styles; + return styles.include('opacity') ? + element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element; + } + for (var property in styles) + if (property == 'opacity') element.setOpacity(styles[property]); + else + elementStyle[(property == 'float' || property == 'cssFloat') ? + (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') : + property] = styles[property]; + + return element; + }, + + setOpacity: function(element, value) { + element = $(element); + element.style.opacity = (value == 1 || value === '') ? '' : + (value < 0.00001) ? 0 : value; + return element; + }, + + getDimensions: function(element) { + element = $(element); + var display = Element.getStyle(element, 'display'); + if (display != 'none' && display != null) // Safari bug + return {width: element.offsetWidth, height: element.offsetHeight}; + + var els = element.style; + var originalVisibility = els.visibility; + var originalPosition = els.position; + var originalDisplay = els.display; + els.visibility = 'hidden'; + if (originalPosition != 'fixed') // Switching fixed to absolute causes issues in Safari + els.position = 'absolute'; + els.display = 'block'; + var originalWidth = element.clientWidth; + var originalHeight = element.clientHeight; + els.display = originalDisplay; + els.position = originalPosition; + els.visibility = originalVisibility; + return {width: originalWidth, height: originalHeight}; + }, + + makePositioned: function(element) { + element = $(element); + var pos = Element.getStyle(element, 'position'); + if (pos == 'static' || !pos) { + element._madePositioned = true; + element.style.position = 'relative'; + if (Prototype.Browser.Opera) { + element.style.top = 0; + element.style.left = 0; + } + } + return element; + }, + + undoPositioned: function(element) { + element = $(element); + if (element._madePositioned) { + element._madePositioned = undefined; + element.style.position = + element.style.top = + element.style.left = + element.style.bottom = + element.style.right = ''; + } + return element; + }, + + makeClipping: function(element) { + element = $(element); + if (element._overflow) return element; + element._overflow = Element.getStyle(element, 'overflow') || 'auto'; + if (element._overflow !== 'hidden') + element.style.overflow = 'hidden'; + return element; + }, + + undoClipping: function(element) { + element = $(element); + if (!element._overflow) return element; + element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; + element._overflow = null; + return element; + }, + + cumulativeOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + } while (element); + return Element._returnOffset(valueL, valueT); + }, + + positionedOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + if (element) { + if (element.tagName.toUpperCase() == 'BODY') break; + var p = Element.getStyle(element, 'position'); + if (p !== 'static') break; + } + } while (element); + return Element._returnOffset(valueL, valueT); + }, + + absolutize: function(element) { + element = $(element); + if (Element.getStyle(element, 'position') == 'absolute') return element; + + var offsets = Element.positionedOffset(element); + var top = offsets[1]; + var left = offsets[0]; + var width = element.clientWidth; + var height = element.clientHeight; + + element._originalLeft = left - parseFloat(element.style.left || 0); + element._originalTop = top - parseFloat(element.style.top || 0); + element._originalWidth = element.style.width; + element._originalHeight = element.style.height; + + element.style.position = 'absolute'; + element.style.top = top + 'px'; + element.style.left = left + 'px'; + element.style.width = width + 'px'; + element.style.height = height + 'px'; + return element; + }, + + relativize: function(element) { + element = $(element); + if (Element.getStyle(element, 'position') == 'relative') return element; + + element.style.position = 'relative'; + var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); + var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); + + element.style.top = top + 'px'; + element.style.left = left + 'px'; + element.style.height = element._originalHeight; + element.style.width = element._originalWidth; + return element; + }, + + cumulativeScrollOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.scrollTop || 0; + valueL += element.scrollLeft || 0; + element = element.parentNode; + } while (element); + return Element._returnOffset(valueL, valueT); + }, + + getOffsetParent: function(element) { + if (element.offsetParent) return $(element.offsetParent); + if (element == document.body) return $(element); + + while ((element = element.parentNode) && element != document.body) + if (Element.getStyle(element, 'position') != 'static') + return $(element); + + return $(document.body); + }, + + viewportOffset: function(forElement) { + var valueT = 0, valueL = 0; + + var element = forElement; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + + if (element.offsetParent == document.body && + Element.getStyle(element, 'position') == 'absolute') break; + + } while (element = element.offsetParent); + + element = forElement; + do { + if (!Prototype.Browser.Opera || (element.tagName && (element.tagName.toUpperCase() == 'BODY'))) { + valueT -= element.scrollTop || 0; + valueL -= element.scrollLeft || 0; + } + } while (element = element.parentNode); + + return Element._returnOffset(valueL, valueT); + }, + + clonePosition: function(element, source) { + var options = Object.extend({ + setLeft: true, + setTop: true, + setWidth: true, + setHeight: true, + offsetTop: 0, + offsetLeft: 0 + }, arguments[2] || { }); + + source = $(source); + var p = Element.viewportOffset(source); + + element = $(element); + var delta = [0, 0]; + var parent = null; + if (Element.getStyle(element, 'position') == 'absolute') { + parent = Element.getOffsetParent(element); + delta = Element.viewportOffset(parent); + } + + if (parent == document.body) { + delta[0] -= document.body.offsetLeft; + delta[1] -= document.body.offsetTop; + } + + if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; + if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; + if (options.setWidth) element.style.width = source.offsetWidth + 'px'; + if (options.setHeight) element.style.height = source.offsetHeight + 'px'; + return element; + } +}; + +Object.extend(Element.Methods, { + getElementsBySelector: Element.Methods.select, + + childElements: Element.Methods.immediateDescendants +}); + +Element._attributeTranslations = { + write: { + names: { + className: 'class', + htmlFor: 'for' + }, + values: { } + } +}; + +if (Prototype.Browser.Opera) { + Element.Methods.getStyle = Element.Methods.getStyle.wrap( + function(proceed, element, style) { + switch (style) { + case 'left': case 'top': case 'right': case 'bottom': + if (proceed(element, 'position') === 'static') return null; + case 'height': case 'width': + if (!Element.visible(element)) return null; + + var dim = parseInt(proceed(element, style), 10); + + if (dim !== element['offset' + style.capitalize()]) + return dim + 'px'; + + var properties; + if (style === 'height') { + properties = ['border-top-width', 'padding-top', + 'padding-bottom', 'border-bottom-width']; + } + else { + properties = ['border-left-width', 'padding-left', + 'padding-right', 'border-right-width']; + } + return properties.inject(dim, function(memo, property) { + var val = proceed(element, property); + return val === null ? memo : memo - parseInt(val, 10); + }) + 'px'; + default: return proceed(element, style); + } + } + ); + + Element.Methods.readAttribute = Element.Methods.readAttribute.wrap( + function(proceed, element, attribute) { + if (attribute === 'title') return element.title; + return proceed(element, attribute); + } + ); +} + +else if (Prototype.Browser.IE) { + Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap( + function(proceed, element) { + element = $(element); + try { element.offsetParent } + catch(e) { return $(document.body) } + var position = element.getStyle('position'); + if (position !== 'static') return proceed(element); + element.setStyle({ position: 'relative' }); + var value = proceed(element); + element.setStyle({ position: position }); + return value; + } + ); + + $w('positionedOffset viewportOffset').each(function(method) { + Element.Methods[method] = Element.Methods[method].wrap( + function(proceed, element) { + element = $(element); + try { element.offsetParent } + catch(e) { return Element._returnOffset(0,0) } + var position = element.getStyle('position'); + if (position !== 'static') return proceed(element); + var offsetParent = element.getOffsetParent(); + if (offsetParent && offsetParent.getStyle('position') === 'fixed') + offsetParent.setStyle({ zoom: 1 }); + element.setStyle({ position: 'relative' }); + var value = proceed(element); + element.setStyle({ position: position }); + return value; + } + ); + }); + + Element.Methods.cumulativeOffset = Element.Methods.cumulativeOffset.wrap( + function(proceed, element) { + try { element.offsetParent } + catch(e) { return Element._returnOffset(0,0) } + return proceed(element); + } + ); + + Element.Methods.getStyle = function(element, style) { + element = $(element); + style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); + var value = element.style[style]; + if (!value && element.currentStyle) value = element.currentStyle[style]; + + if (style == 'opacity') { + if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) + if (value[1]) return parseFloat(value[1]) / 100; + return 1.0; + } + + if (value == 'auto') { + if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none')) + return element['offset' + style.capitalize()] + 'px'; + return null; + } + return value; + }; + + Element.Methods.setOpacity = function(element, value) { + function stripAlpha(filter){ + return filter.replace(/alpha\([^\)]*\)/gi,''); + } + element = $(element); + var currentStyle = element.currentStyle; + if ((currentStyle && !currentStyle.hasLayout) || + (!currentStyle && element.style.zoom == 'normal')) + element.style.zoom = 1; + + var filter = element.getStyle('filter'), style = element.style; + if (value == 1 || value === '') { + (filter = stripAlpha(filter)) ? + style.filter = filter : style.removeAttribute('filter'); + return element; + } else if (value < 0.00001) value = 0; + style.filter = stripAlpha(filter) + + 'alpha(opacity=' + (value * 100) + ')'; + return element; + }; + + Element._attributeTranslations = (function(){ + + var classProp = 'className'; + var forProp = 'for'; + + var el = document.createElement('div'); + + el.setAttribute(classProp, 'x'); + + if (el.className !== 'x') { + el.setAttribute('class', 'x'); + if (el.className === 'x') { + classProp = 'class'; + } + } + el = null; + + el = document.createElement('label'); + el.setAttribute(forProp, 'x'); + if (el.htmlFor !== 'x') { + el.setAttribute('htmlFor', 'x'); + if (el.htmlFor === 'x') { + forProp = 'htmlFor'; + } + } + el = null; + + return { + read: { + names: { + 'class': classProp, + 'className': classProp, + 'for': forProp, + 'htmlFor': forProp + }, + values: { + _getAttr: function(element, attribute) { + return element.getAttribute(attribute); + }, + _getAttr2: function(element, attribute) { + return element.getAttribute(attribute, 2); + }, + _getAttrNode: function(element, attribute) { + var node = element.getAttributeNode(attribute); + return node ? node.value : ""; + }, + _getEv: (function(){ + + var el = document.createElement('div'); + el.onclick = Prototype.emptyFunction; + var value = el.getAttribute('onclick'); + var f; + + if (String(value).indexOf('{') > -1) { + f = function(element, attribute) { + attribute = element.getAttribute(attribute); + if (!attribute) return null; + attribute = attribute.toString(); + attribute = attribute.split('{')[1]; + attribute = attribute.split('}')[0]; + return attribute.strip(); + }; + } + else if (value === '') { + f = function(element, attribute) { + attribute = element.getAttribute(attribute); + if (!attribute) return null; + return attribute.strip(); + }; + } + el = null; + return f; + })(), + _flag: function(element, attribute) { + return $(element).hasAttribute(attribute) ? attribute : null; + }, + style: function(element) { + return element.style.cssText.toLowerCase(); + }, + title: function(element) { + return element.title; + } + } + } + } + })(); + + Element._attributeTranslations.write = { + names: Object.extend({ + cellpadding: 'cellPadding', + cellspacing: 'cellSpacing' + }, Element._attributeTranslations.read.names), + values: { + checked: function(element, value) { + element.checked = !!value; + }, + + style: function(element, value) { + element.style.cssText = value ? value : ''; + } + } + }; + + Element._attributeTranslations.has = {}; + + $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' + + 'encType maxLength readOnly longDesc frameBorder').each(function(attr) { + Element._attributeTranslations.write.names[attr.toLowerCase()] = attr; + Element._attributeTranslations.has[attr.toLowerCase()] = attr; + }); + + (function(v) { + Object.extend(v, { + href: v._getAttr2, + src: v._getAttr2, + type: v._getAttr, + action: v._getAttrNode, + disabled: v._flag, + checked: v._flag, + readonly: v._flag, + multiple: v._flag, + onload: v._getEv, + onunload: v._getEv, + onclick: v._getEv, + ondblclick: v._getEv, + onmousedown: v._getEv, + onmouseup: v._getEv, + onmouseover: v._getEv, + onmousemove: v._getEv, + onmouseout: v._getEv, + onfocus: v._getEv, + onblur: v._getEv, + onkeypress: v._getEv, + onkeydown: v._getEv, + onkeyup: v._getEv, + onsubmit: v._getEv, + onreset: v._getEv, + onselect: v._getEv, + onchange: v._getEv + }); + })(Element._attributeTranslations.read.values); + + if (Prototype.BrowserFeatures.ElementExtensions) { + (function() { + function _descendants(element) { + var nodes = element.getElementsByTagName('*'), results = []; + for (var i = 0, node; node = nodes[i]; i++) + if (node.tagName !== "!") // Filter out comment nodes. + results.push(node); + return results; + } + + Element.Methods.down = function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return element.firstDescendant(); + return Object.isNumber(expression) ? _descendants(element)[expression] : + Element.select(element, expression)[index || 0]; + } + })(); + } + +} + +else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) { + Element.Methods.setOpacity = function(element, value) { + element = $(element); + element.style.opacity = (value == 1) ? 0.999999 : + (value === '') ? '' : (value < 0.00001) ? 0 : value; + return element; + }; +} + +else if (Prototype.Browser.WebKit) { + Element.Methods.setOpacity = function(element, value) { + element = $(element); + element.style.opacity = (value == 1 || value === '') ? '' : + (value < 0.00001) ? 0 : value; + + if (value == 1) + if(element.tagName.toUpperCase() == 'IMG' && element.width) { + element.width++; element.width--; + } else try { + var n = document.createTextNode(' '); + element.appendChild(n); + element.removeChild(n); + } catch (e) { } + + return element; + }; + + Element.Methods.cumulativeOffset = function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + if (element.offsetParent == document.body) + if (Element.getStyle(element, 'position') == 'absolute') break; + + element = element.offsetParent; + } while (element); + + return Element._returnOffset(valueL, valueT); + }; +} + +if ('outerHTML' in document.documentElement) { + Element.Methods.replace = function(element, content) { + element = $(element); + + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) { + element.parentNode.replaceChild(content, element); + return element; + } + + content = Object.toHTML(content); + var parent = element.parentNode, tagName = parent.tagName.toUpperCase(); + + if (Element._insertionTranslations.tags[tagName]) { + var nextSibling = element.next(); + var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); + parent.removeChild(element); + if (nextSibling) + fragments.each(function(node) { parent.insertBefore(node, nextSibling) }); + else + fragments.each(function(node) { parent.appendChild(node) }); + } + else element.outerHTML = content.stripScripts(); + + content.evalScripts.bind(content).defer(); + return element; + }; +} + +Element._returnOffset = function(l, t) { + var result = [l, t]; + result.left = l; + result.top = t; + return result; +}; + +Element._getContentFromAnonymousElement = function(tagName, html) { + var div = new Element('div'), t = Element._insertionTranslations.tags[tagName]; + if (t) { + div.innerHTML = t[0] + html + t[1]; + t[2].times(function() { div = div.firstChild }); + } else div.innerHTML = html; + return $A(div.childNodes); +}; + +Element._insertionTranslations = { + before: function(element, node) { + element.parentNode.insertBefore(node, element); + }, + top: function(element, node) { + element.insertBefore(node, element.firstChild); + }, + bottom: function(element, node) { + element.appendChild(node); + }, + after: function(element, node) { + element.parentNode.insertBefore(node, element.nextSibling); + }, + tags: { + TABLE: ['', '
    ', 1], + TBODY: ['', '
    ', 2], + TR: ['', '
    ', 3], + TD: ['
    ', '
    ', 4], + SELECT: ['', 1] + } +}; + +(function() { + var tags = Element._insertionTranslations.tags; + Object.extend(tags, { + THEAD: tags.TBODY, + TFOOT: tags.TBODY, + TH: tags.TD + }); +})(); + +Element.Methods.Simulated = { + hasAttribute: function(element, attribute) { + attribute = Element._attributeTranslations.has[attribute] || attribute; + var node = $(element).getAttributeNode(attribute); + return !!(node && node.specified); + } +}; + +Element.Methods.ByTag = { }; + +Object.extend(Element, Element.Methods); + +(function(div) { + + if (!Prototype.BrowserFeatures.ElementExtensions && div['__proto__']) { + window.HTMLElement = { }; + window.HTMLElement.prototype = div['__proto__']; + Prototype.BrowserFeatures.ElementExtensions = true; + } + + div = null; + +})(document.createElement('div')) + +Element.extend = (function() { + + function checkDeficiency(tagName) { + if (typeof window.Element != 'undefined') { + var proto = window.Element.prototype; + if (proto) { + var id = '_' + (Math.random()+'').slice(2); + var el = document.createElement(tagName); + proto[id] = 'x'; + var isBuggy = (el[id] !== 'x'); + delete proto[id]; + el = null; + return isBuggy; + } + } + return false; + } + + function extendElementWith(element, methods) { + for (var property in methods) { + var value = methods[property]; + if (Object.isFunction(value) && !(property in element)) + element[property] = value.methodize(); + } + } + + var HTMLOBJECTELEMENT_PROTOTYPE_BUGGY = checkDeficiency('object'); + + if (Prototype.BrowserFeatures.SpecificElementExtensions) { + if (HTMLOBJECTELEMENT_PROTOTYPE_BUGGY) { + return function(element) { + if (element && typeof element._extendedByPrototype == 'undefined') { + var t = element.tagName; + if (t && (/^(?:object|applet|embed)$/i.test(t))) { + extendElementWith(element, Element.Methods); + extendElementWith(element, Element.Methods.Simulated); + extendElementWith(element, Element.Methods.ByTag[t.toUpperCase()]); + } + } + return element; + } + } + return Prototype.K; + } + + var Methods = { }, ByTag = Element.Methods.ByTag; + + var extend = Object.extend(function(element) { + if (!element || typeof element._extendedByPrototype != 'undefined' || + element.nodeType != 1 || element == window) return element; + + var methods = Object.clone(Methods), + tagName = element.tagName.toUpperCase(); + + if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]); + + extendElementWith(element, methods); + + element._extendedByPrototype = Prototype.emptyFunction; + return element; + + }, { + refresh: function() { + if (!Prototype.BrowserFeatures.ElementExtensions) { + Object.extend(Methods, Element.Methods); + Object.extend(Methods, Element.Methods.Simulated); + } + } + }); + + extend.refresh(); + return extend; +})(); + +Element.hasAttribute = function(element, attribute) { + if (element.hasAttribute) return element.hasAttribute(attribute); + return Element.Methods.Simulated.hasAttribute(element, attribute); +}; + +Element.addMethods = function(methods) { + var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag; + + if (!methods) { + Object.extend(Form, Form.Methods); + Object.extend(Form.Element, Form.Element.Methods); + Object.extend(Element.Methods.ByTag, { + "FORM": Object.clone(Form.Methods), + "INPUT": Object.clone(Form.Element.Methods), + "SELECT": Object.clone(Form.Element.Methods), + "TEXTAREA": Object.clone(Form.Element.Methods) + }); + } + + if (arguments.length == 2) { + var tagName = methods; + methods = arguments[1]; + } + + if (!tagName) Object.extend(Element.Methods, methods || { }); + else { + if (Object.isArray(tagName)) tagName.each(extend); + else extend(tagName); + } + + function extend(tagName) { + tagName = tagName.toUpperCase(); + if (!Element.Methods.ByTag[tagName]) + Element.Methods.ByTag[tagName] = { }; + Object.extend(Element.Methods.ByTag[tagName], methods); + } + + function copy(methods, destination, onlyIfAbsent) { + onlyIfAbsent = onlyIfAbsent || false; + for (var property in methods) { + var value = methods[property]; + if (!Object.isFunction(value)) continue; + if (!onlyIfAbsent || !(property in destination)) + destination[property] = value.methodize(); + } + } + + function findDOMClass(tagName) { + var klass; + var trans = { + "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph", + "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList", + "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading", + "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote", + "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION": + "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD": + "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR": + "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET": + "FrameSet", "IFRAME": "IFrame" + }; + if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element'; + if (window[klass]) return window[klass]; + klass = 'HTML' + tagName + 'Element'; + if (window[klass]) return window[klass]; + klass = 'HTML' + tagName.capitalize() + 'Element'; + if (window[klass]) return window[klass]; + + var element = document.createElement(tagName); + var proto = element['__proto__'] || element.constructor.prototype; + element = null; + return proto; + } + + var elementPrototype = window.HTMLElement ? HTMLElement.prototype : + Element.prototype; + + if (F.ElementExtensions) { + copy(Element.Methods, elementPrototype); + copy(Element.Methods.Simulated, elementPrototype, true); + } + + if (F.SpecificElementExtensions) { + for (var tag in Element.Methods.ByTag) { + var klass = findDOMClass(tag); + if (Object.isUndefined(klass)) continue; + copy(T[tag], klass.prototype); + } + } + + Object.extend(Element, Element.Methods); + delete Element.ByTag; + + if (Element.extend.refresh) Element.extend.refresh(); + Element.cache = { }; +}; + + +document.viewport = { + + getDimensions: function() { + return { width: this.getWidth(), height: this.getHeight() }; + }, + + getScrollOffsets: function() { + return Element._returnOffset( + window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, + window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop); + } +}; + +(function(viewport) { + var B = Prototype.Browser, doc = document, element, property = {}; + + function getRootElement() { + if (B.WebKit && !doc.evaluate) + return document; + + if (B.Opera && window.parseFloat(window.opera.version()) < 9.5) + return document.body; + + return document.documentElement; + } + + function define(D) { + if (!element) element = getRootElement(); + + property[D] = 'client' + D; + + viewport['get' + D] = function() { return element[property[D]] }; + return viewport['get' + D](); + } + + viewport.getWidth = define.curry('Width'); + + viewport.getHeight = define.curry('Height'); +})(document.viewport); + + +Element.Storage = { + UID: 1 +}; + +Element.addMethods({ + getStorage: function(element) { + if (!(element = $(element))) return; + + var uid; + if (element === window) { + uid = 0; + } else { + if (typeof element._prototypeUID === "undefined") + element._prototypeUID = [Element.Storage.UID++]; + uid = element._prototypeUID[0]; + } + + if (!Element.Storage[uid]) + Element.Storage[uid] = $H(); + + return Element.Storage[uid]; + }, + + store: function(element, key, value) { + if (!(element = $(element))) return; + + if (arguments.length === 2) { + Element.getStorage(element).update(key); + } else { + Element.getStorage(element).set(key, value); + } + + return element; + }, + + retrieve: function(element, key, defaultValue) { + if (!(element = $(element))) return; + var hash = Element.getStorage(element), value = hash.get(key); + + if (Object.isUndefined(value)) { + hash.set(key, defaultValue); + value = defaultValue; + } + + return value; + }, + + clone: function(element, deep) { + if (!(element = $(element))) return; + var clone = element.cloneNode(deep); + clone._prototypeUID = void 0; + if (deep) { + var descendants = Element.select(clone, '*'), + i = descendants.length; + while (i--) { + descendants[i]._prototypeUID = void 0; + } + } + return Element.extend(clone); + } +}); +/* Portions of the Selector class are derived from Jack Slocum's DomQuery, + * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style + * license. Please see http://www.yui-ext.com/ for more information. */ + +var Selector = Class.create({ + initialize: function(expression) { + this.expression = expression.strip(); + + if (this.shouldUseSelectorsAPI()) { + this.mode = 'selectorsAPI'; + } else if (this.shouldUseXPath()) { + this.mode = 'xpath'; + this.compileXPathMatcher(); + } else { + this.mode = "normal"; + this.compileMatcher(); + } + + }, + + shouldUseXPath: (function() { + + var IS_DESCENDANT_SELECTOR_BUGGY = (function(){ + var isBuggy = false; + if (document.evaluate && window.XPathResult) { + var el = document.createElement('div'); + el.innerHTML = '
    '; + + var xpath = ".//*[local-name()='ul' or local-name()='UL']" + + "//*[local-name()='li' or local-name()='LI']"; + + var result = document.evaluate(xpath, el, null, + XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + + isBuggy = (result.snapshotLength !== 2); + el = null; + } + return isBuggy; + })(); + + return function() { + if (!Prototype.BrowserFeatures.XPath) return false; + + var e = this.expression; + + if (Prototype.Browser.WebKit && + (e.include("-of-type") || e.include(":empty"))) + return false; + + if ((/(\[[\w-]*?:|:checked)/).test(e)) + return false; + + if (IS_DESCENDANT_SELECTOR_BUGGY) return false; + + return true; + } + + })(), + + shouldUseSelectorsAPI: function() { + if (!Prototype.BrowserFeatures.SelectorsAPI) return false; + + if (Selector.CASE_INSENSITIVE_CLASS_NAMES) return false; + + if (!Selector._div) Selector._div = new Element('div'); + + try { + Selector._div.querySelector(this.expression); + } catch(e) { + return false; + } + + return true; + }, + + compileMatcher: function() { + var e = this.expression, ps = Selector.patterns, h = Selector.handlers, + c = Selector.criteria, le, p, m, len = ps.length, name; + + if (Selector._cache[e]) { + this.matcher = Selector._cache[e]; + return; + } + + this.matcher = ["this.matcher = function(root) {", + "var r = root, h = Selector.handlers, c = false, n;"]; + + while (e && le != e && (/\S/).test(e)) { + le = e; + for (var i = 0; i"; + } +}); + +if (Prototype.BrowserFeatures.SelectorsAPI && + document.compatMode === 'BackCompat') { + Selector.CASE_INSENSITIVE_CLASS_NAMES = (function(){ + var div = document.createElement('div'), + span = document.createElement('span'); + + div.id = "prototype_test_id"; + span.className = 'Test'; + div.appendChild(span); + var isIgnored = (div.querySelector('#prototype_test_id .test') !== null); + div = span = null; + return isIgnored; + })(); +} + +Object.extend(Selector, { + _cache: { }, + + xpath: { + descendant: "//*", + child: "/*", + adjacent: "/following-sibling::*[1]", + laterSibling: '/following-sibling::*', + tagName: function(m) { + if (m[1] == '*') return ''; + return "[local-name()='" + m[1].toLowerCase() + + "' or local-name()='" + m[1].toUpperCase() + "']"; + }, + className: "[contains(concat(' ', @class, ' '), ' #{1} ')]", + id: "[@id='#{1}']", + attrPresence: function(m) { + m[1] = m[1].toLowerCase(); + return new Template("[@#{1}]").evaluate(m); + }, + attr: function(m) { + m[1] = m[1].toLowerCase(); + m[3] = m[5] || m[6]; + return new Template(Selector.xpath.operators[m[2]]).evaluate(m); + }, + pseudo: function(m) { + var h = Selector.xpath.pseudos[m[1]]; + if (!h) return ''; + if (Object.isFunction(h)) return h(m); + return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m); + }, + operators: { + '=': "[@#{1}='#{3}']", + '!=': "[@#{1}!='#{3}']", + '^=': "[starts-with(@#{1}, '#{3}')]", + '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']", + '*=': "[contains(@#{1}, '#{3}')]", + '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]", + '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]" + }, + pseudos: { + 'first-child': '[not(preceding-sibling::*)]', + 'last-child': '[not(following-sibling::*)]', + 'only-child': '[not(preceding-sibling::* or following-sibling::*)]', + 'empty': "[count(*) = 0 and (count(text()) = 0)]", + 'checked': "[@checked]", + 'disabled': "[(@disabled) and (@type!='hidden')]", + 'enabled': "[not(@disabled) and (@type!='hidden')]", + 'not': function(m) { + var e = m[6], p = Selector.patterns, + x = Selector.xpath, le, v, len = p.length, name; + + var exclusion = []; + while (e && le != e && (/\S/).test(e)) { + le = e; + for (var i = 0; i= 0)]"; + return new Template(predicate).evaluate({ + fragment: fragment, a: a, b: b }); + } + } + } + }, + + criteria: { + tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;', + className: 'n = h.className(n, r, "#{1}", c); c = false;', + id: 'n = h.id(n, r, "#{1}", c); c = false;', + attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;', + attr: function(m) { + m[3] = (m[5] || m[6]); + return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m); + }, + pseudo: function(m) { + if (m[6]) m[6] = m[6].replace(/"/g, '\\"'); + return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m); + }, + descendant: 'c = "descendant";', + child: 'c = "child";', + adjacent: 'c = "adjacent";', + laterSibling: 'c = "laterSibling";' + }, + + patterns: [ + { name: 'laterSibling', re: /^\s*~\s*/ }, + { name: 'child', re: /^\s*>\s*/ }, + { name: 'adjacent', re: /^\s*\+\s*/ }, + { name: 'descendant', re: /^\s/ }, + + { name: 'tagName', re: /^\s*(\*|[\w\-]+)(\b|$)?/ }, + { name: 'id', re: /^#([\w\-\*]+)(\b|$)/ }, + { name: 'className', re: /^\.([\w\-\*]+)(\b|$)/ }, + { name: 'pseudo', re: /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/ }, + { name: 'attrPresence', re: /^\[((?:[\w-]+:)?[\w-]+)\]/ }, + { name: 'attr', re: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/ } + ], + + assertions: { + tagName: function(element, matches) { + return matches[1].toUpperCase() == element.tagName.toUpperCase(); + }, + + className: function(element, matches) { + return Element.hasClassName(element, matches[1]); + }, + + id: function(element, matches) { + return element.id === matches[1]; + }, + + attrPresence: function(element, matches) { + return Element.hasAttribute(element, matches[1]); + }, + + attr: function(element, matches) { + var nodeValue = Element.readAttribute(element, matches[1]); + return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] || matches[6]); + } + }, + + handlers: { + concat: function(a, b) { + for (var i = 0, node; node = b[i]; i++) + a.push(node); + return a; + }, + + mark: function(nodes) { + var _true = Prototype.emptyFunction; + for (var i = 0, node; node = nodes[i]; i++) + node._countedByPrototype = _true; + return nodes; + }, + + unmark: (function(){ + + var PROPERTIES_ATTRIBUTES_MAP = (function(){ + var el = document.createElement('div'), + isBuggy = false, + propName = '_countedByPrototype', + value = 'x' + el[propName] = value; + isBuggy = (el.getAttribute(propName) === value); + el = null; + return isBuggy; + })(); + + return PROPERTIES_ATTRIBUTES_MAP ? + function(nodes) { + for (var i = 0, node; node = nodes[i]; i++) + node.removeAttribute('_countedByPrototype'); + return nodes; + } : + function(nodes) { + for (var i = 0, node; node = nodes[i]; i++) + node._countedByPrototype = void 0; + return nodes; + } + })(), + + index: function(parentNode, reverse, ofType) { + parentNode._countedByPrototype = Prototype.emptyFunction; + if (reverse) { + for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) { + var node = nodes[i]; + if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; + } + } else { + for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++) + if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; + } + }, + + unique: function(nodes) { + if (nodes.length == 0) return nodes; + var results = [], n; + for (var i = 0, l = nodes.length; i < l; i++) + if (typeof (n = nodes[i])._countedByPrototype == 'undefined') { + n._countedByPrototype = Prototype.emptyFunction; + results.push(Element.extend(n)); + } + return Selector.handlers.unmark(results); + }, + + descendant: function(nodes) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) + h.concat(results, node.getElementsByTagName('*')); + return results; + }, + + child: function(nodes) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) { + for (var j = 0, child; child = node.childNodes[j]; j++) + if (child.nodeType == 1 && child.tagName != '!') results.push(child); + } + return results; + }, + + adjacent: function(nodes) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + var next = this.nextElementSibling(node); + if (next) results.push(next); + } + return results; + }, + + laterSibling: function(nodes) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) + h.concat(results, Element.nextSiblings(node)); + return results; + }, + + nextElementSibling: function(node) { + while (node = node.nextSibling) + if (node.nodeType == 1) return node; + return null; + }, + + previousElementSibling: function(node) { + while (node = node.previousSibling) + if (node.nodeType == 1) return node; + return null; + }, + + tagName: function(nodes, root, tagName, combinator) { + var uTagName = tagName.toUpperCase(); + var results = [], h = Selector.handlers; + if (nodes) { + if (combinator) { + if (combinator == "descendant") { + for (var i = 0, node; node = nodes[i]; i++) + h.concat(results, node.getElementsByTagName(tagName)); + return results; + } else nodes = this[combinator](nodes); + if (tagName == "*") return nodes; + } + for (var i = 0, node; node = nodes[i]; i++) + if (node.tagName.toUpperCase() === uTagName) results.push(node); + return results; + } else return root.getElementsByTagName(tagName); + }, + + id: function(nodes, root, id, combinator) { + var targetNode = $(id), h = Selector.handlers; + + if (root == document) { + if (!targetNode) return []; + if (!nodes) return [targetNode]; + } else { + if (!root.sourceIndex || root.sourceIndex < 1) { + var nodes = root.getElementsByTagName('*'); + for (var j = 0, node; node = nodes[j]; j++) { + if (node.id === id) return [node]; + } + } + } + + if (nodes) { + if (combinator) { + if (combinator == 'child') { + for (var i = 0, node; node = nodes[i]; i++) + if (targetNode.parentNode == node) return [targetNode]; + } else if (combinator == 'descendant') { + for (var i = 0, node; node = nodes[i]; i++) + if (Element.descendantOf(targetNode, node)) return [targetNode]; + } else if (combinator == 'adjacent') { + for (var i = 0, node; node = nodes[i]; i++) + if (Selector.handlers.previousElementSibling(targetNode) == node) + return [targetNode]; + } else nodes = h[combinator](nodes); + } + for (var i = 0, node; node = nodes[i]; i++) + if (node == targetNode) return [targetNode]; + return []; + } + return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : []; + }, + + className: function(nodes, root, className, combinator) { + if (nodes && combinator) nodes = this[combinator](nodes); + return Selector.handlers.byClassName(nodes, root, className); + }, + + byClassName: function(nodes, root, className) { + if (!nodes) nodes = Selector.handlers.descendant([root]); + var needle = ' ' + className + ' '; + for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) { + nodeClassName = node.className; + if (nodeClassName.length == 0) continue; + if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle)) + results.push(node); + } + return results; + }, + + attrPresence: function(nodes, root, attr, combinator) { + if (!nodes) nodes = root.getElementsByTagName("*"); + if (nodes && combinator) nodes = this[combinator](nodes); + var results = []; + for (var i = 0, node; node = nodes[i]; i++) + if (Element.hasAttribute(node, attr)) results.push(node); + return results; + }, + + attr: function(nodes, root, attr, value, operator, combinator) { + if (!nodes) nodes = root.getElementsByTagName("*"); + if (nodes && combinator) nodes = this[combinator](nodes); + var handler = Selector.operators[operator], results = []; + for (var i = 0, node; node = nodes[i]; i++) { + var nodeValue = Element.readAttribute(node, attr); + if (nodeValue === null) continue; + if (handler(nodeValue, value)) results.push(node); + } + return results; + }, + + pseudo: function(nodes, name, value, root, combinator) { + if (nodes && combinator) nodes = this[combinator](nodes); + if (!nodes) nodes = root.getElementsByTagName("*"); + return Selector.pseudos[name](nodes, value, root); + } + }, + + pseudos: { + 'first-child': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + if (Selector.handlers.previousElementSibling(node)) continue; + results.push(node); + } + return results; + }, + 'last-child': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + if (Selector.handlers.nextElementSibling(node)) continue; + results.push(node); + } + return results; + }, + 'only-child': function(nodes, value, root) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (!h.previousElementSibling(node) && !h.nextElementSibling(node)) + results.push(node); + return results; + }, + 'nth-child': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root); + }, + 'nth-last-child': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root, true); + }, + 'nth-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root, false, true); + }, + 'nth-last-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root, true, true); + }, + 'first-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, "1", root, false, true); + }, + 'last-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, "1", root, true, true); + }, + 'only-of-type': function(nodes, formula, root) { + var p = Selector.pseudos; + return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root); + }, + + getIndices: function(a, b, total) { + if (a == 0) return b > 0 ? [b] : []; + return $R(1, total).inject([], function(memo, i) { + if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i); + return memo; + }); + }, + + nth: function(nodes, formula, root, reverse, ofType) { + if (nodes.length == 0) return []; + if (formula == 'even') formula = '2n+0'; + if (formula == 'odd') formula = '2n+1'; + var h = Selector.handlers, results = [], indexed = [], m; + h.mark(nodes); + for (var i = 0, node; node = nodes[i]; i++) { + if (!node.parentNode._countedByPrototype) { + h.index(node.parentNode, reverse, ofType); + indexed.push(node.parentNode); + } + } + if (formula.match(/^\d+$/)) { // just a number + formula = Number(formula); + for (var i = 0, node; node = nodes[i]; i++) + if (node.nodeIndex == formula) results.push(node); + } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b + if (m[1] == "-") m[1] = -1; + var a = m[1] ? Number(m[1]) : 1; + var b = m[2] ? Number(m[2]) : 0; + var indices = Selector.pseudos.getIndices(a, b, nodes.length); + for (var i = 0, node, l = indices.length; node = nodes[i]; i++) { + for (var j = 0; j < l; j++) + if (node.nodeIndex == indices[j]) results.push(node); + } + } + h.unmark(nodes); + h.unmark(indexed); + return results; + }, + + 'empty': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + if (node.tagName == '!' || node.firstChild) continue; + results.push(node); + } + return results; + }, + + 'not': function(nodes, selector, root) { + var h = Selector.handlers, selectorType, m; + var exclusions = new Selector(selector).findElements(root); + h.mark(exclusions); + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (!node._countedByPrototype) results.push(node); + h.unmark(exclusions); + return results; + }, + + 'enabled': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (!node.disabled && (!node.type || node.type !== 'hidden')) + results.push(node); + return results; + }, + + 'disabled': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (node.disabled) results.push(node); + return results; + }, + + 'checked': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (node.checked) results.push(node); + return results; + } + }, + + operators: { + '=': function(nv, v) { return nv == v; }, + '!=': function(nv, v) { return nv != v; }, + '^=': function(nv, v) { return nv == v || nv && nv.startsWith(v); }, + '$=': function(nv, v) { return nv == v || nv && nv.endsWith(v); }, + '*=': function(nv, v) { return nv == v || nv && nv.include(v); }, + '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); }, + '|=': function(nv, v) { return ('-' + (nv || "").toUpperCase() + + '-').include('-' + (v || "").toUpperCase() + '-'); } + }, + + split: function(expression) { + var expressions = []; + expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) { + expressions.push(m[1].strip()); + }); + return expressions; + }, + + matchElements: function(elements, expression) { + var matches = $$(expression), h = Selector.handlers; + h.mark(matches); + for (var i = 0, results = [], element; element = elements[i]; i++) + if (element._countedByPrototype) results.push(element); + h.unmark(matches); + return results; + }, + + findElement: function(elements, expression, index) { + if (Object.isNumber(expression)) { + index = expression; expression = false; + } + return Selector.matchElements(elements, expression || '*')[index || 0]; + }, + + findChildElements: function(element, expressions) { + expressions = Selector.split(expressions.join(',')); + var results = [], h = Selector.handlers; + for (var i = 0, l = expressions.length, selector; i < l; i++) { + selector = new Selector(expressions[i].strip()); + h.concat(results, selector.findElements(element)); + } + return (l > 1) ? h.unique(results) : results; + } +}); + +if (Prototype.Browser.IE) { + Object.extend(Selector.handlers, { + concat: function(a, b) { + for (var i = 0, node; node = b[i]; i++) + if (node.tagName !== "!") a.push(node); + return a; + } + }); +} + +function $$() { + return Selector.findChildElements(document, $A(arguments)); +} + +var Form = { + reset: function(form) { + form = $(form); + form.reset(); + return form; + }, + + serializeElements: function(elements, options) { + if (typeof options != 'object') options = { hash: !!options }; + else if (Object.isUndefined(options.hash)) options.hash = true; + var key, value, submitted = false, submit = options.submit; + + var data = elements.inject({ }, function(result, element) { + if (!element.disabled && element.name) { + key = element.name; value = $(element).getValue(); + if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted && + submit !== false && (!submit || key == submit) && (submitted = true)))) { + if (key in result) { + if (!Object.isArray(result[key])) result[key] = [result[key]]; + result[key].push(value); + } + else result[key] = value; + } + } + return result; + }); + + return options.hash ? data : Object.toQueryString(data); + } +}; + +Form.Methods = { + serialize: function(form, options) { + return Form.serializeElements(Form.getElements(form), options); + }, + + getElements: function(form) { + var elements = $(form).getElementsByTagName('*'), + element, + arr = [ ], + serializers = Form.Element.Serializers; + for (var i = 0; element = elements[i]; i++) { + arr.push(element); + } + return arr.inject([], function(elements, child) { + if (serializers[child.tagName.toLowerCase()]) + elements.push(Element.extend(child)); + return elements; + }) + }, + + getInputs: function(form, typeName, name) { + form = $(form); + var inputs = form.getElementsByTagName('input'); + + if (!typeName && !name) return $A(inputs).map(Element.extend); + + for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) { + var input = inputs[i]; + if ((typeName && input.type != typeName) || (name && input.name != name)) + continue; + matchingInputs.push(Element.extend(input)); + } + + return matchingInputs; + }, + + disable: function(form) { + form = $(form); + Form.getElements(form).invoke('disable'); + return form; + }, + + enable: function(form) { + form = $(form); + Form.getElements(form).invoke('enable'); + return form; + }, + + findFirstElement: function(form) { + var elements = $(form).getElements().findAll(function(element) { + return 'hidden' != element.type && !element.disabled; + }); + var firstByIndex = elements.findAll(function(element) { + return element.hasAttribute('tabIndex') && element.tabIndex >= 0; + }).sortBy(function(element) { return element.tabIndex }).first(); + + return firstByIndex ? firstByIndex : elements.find(function(element) { + return /^(?:input|select|textarea)$/i.test(element.tagName); + }); + }, + + focusFirstElement: function(form) { + form = $(form); + form.findFirstElement().activate(); + return form; + }, + + request: function(form, options) { + form = $(form), options = Object.clone(options || { }); + + var params = options.parameters, action = form.readAttribute('action') || ''; + if (action.blank()) action = window.location.href; + options.parameters = form.serialize(true); + + if (params) { + if (Object.isString(params)) params = params.toQueryParams(); + Object.extend(options.parameters, params); + } + + if (form.hasAttribute('method') && !options.method) + options.method = form.method; + + return new Ajax.Request(action, options); + } +}; + +/*--------------------------------------------------------------------------*/ + + +Form.Element = { + focus: function(element) { + $(element).focus(); + return element; + }, + + select: function(element) { + $(element).select(); + return element; + } +}; + +Form.Element.Methods = { + + serialize: function(element) { + element = $(element); + if (!element.disabled && element.name) { + var value = element.getValue(); + if (value != undefined) { + var pair = { }; + pair[element.name] = value; + return Object.toQueryString(pair); + } + } + return ''; + }, + + getValue: function(element) { + element = $(element); + var method = element.tagName.toLowerCase(); + return Form.Element.Serializers[method](element); + }, + + setValue: function(element, value) { + element = $(element); + var method = element.tagName.toLowerCase(); + Form.Element.Serializers[method](element, value); + return element; + }, + + clear: function(element) { + $(element).value = ''; + return element; + }, + + present: function(element) { + return $(element).value != ''; + }, + + activate: function(element) { + element = $(element); + try { + element.focus(); + if (element.select && (element.tagName.toLowerCase() != 'input' || + !(/^(?:button|reset|submit)$/i.test(element.type)))) + element.select(); + } catch (e) { } + return element; + }, + + disable: function(element) { + element = $(element); + element.disabled = true; + return element; + }, + + enable: function(element) { + element = $(element); + element.disabled = false; + return element; + } +}; + +/*--------------------------------------------------------------------------*/ + +var Field = Form.Element; + +var $F = Form.Element.Methods.getValue; + +/*--------------------------------------------------------------------------*/ + +Form.Element.Serializers = { + input: function(element, value) { + switch (element.type.toLowerCase()) { + case 'checkbox': + case 'radio': + return Form.Element.Serializers.inputSelector(element, value); + default: + return Form.Element.Serializers.textarea(element, value); + } + }, + + inputSelector: function(element, value) { + if (Object.isUndefined(value)) return element.checked ? element.value : null; + else element.checked = !!value; + }, + + textarea: function(element, value) { + if (Object.isUndefined(value)) return element.value; + else element.value = value; + }, + + select: function(element, value) { + if (Object.isUndefined(value)) + return this[element.type == 'select-one' ? + 'selectOne' : 'selectMany'](element); + else { + var opt, currentValue, single = !Object.isArray(value); + for (var i = 0, length = element.length; i < length; i++) { + opt = element.options[i]; + currentValue = this.optionValue(opt); + if (single) { + if (currentValue == value) { + opt.selected = true; + return; + } + } + else opt.selected = value.include(currentValue); + } + } + }, + + selectOne: function(element) { + var index = element.selectedIndex; + return index >= 0 ? this.optionValue(element.options[index]) : null; + }, + + selectMany: function(element) { + var values, length = element.length; + if (!length) return null; + + for (var i = 0, values = []; i < length; i++) { + var opt = element.options[i]; + if (opt.selected) values.push(this.optionValue(opt)); + } + return values; + }, + + optionValue: function(opt) { + return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; + } +}; + +/*--------------------------------------------------------------------------*/ + + +Abstract.TimedObserver = Class.create(PeriodicalExecuter, { + initialize: function($super, element, frequency, callback) { + $super(callback, frequency); + this.element = $(element); + this.lastValue = this.getValue(); + }, + + execute: function() { + var value = this.getValue(); + if (Object.isString(this.lastValue) && Object.isString(value) ? + this.lastValue != value : String(this.lastValue) != String(value)) { + this.callback(this.element, value); + this.lastValue = value; + } + } +}); + +Form.Element.Observer = Class.create(Abstract.TimedObserver, { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.Observer = Class.create(Abstract.TimedObserver, { + getValue: function() { + return Form.serialize(this.element); + } +}); + +/*--------------------------------------------------------------------------*/ + +Abstract.EventObserver = Class.create({ + initialize: function(element, callback) { + this.element = $(element); + this.callback = callback; + + this.lastValue = this.getValue(); + if (this.element.tagName.toLowerCase() == 'form') + this.registerFormCallbacks(); + else + this.registerCallback(this.element); + }, + + onElementEvent: function() { + var value = this.getValue(); + if (this.lastValue != value) { + this.callback(this.element, value); + this.lastValue = value; + } + }, + + registerFormCallbacks: function() { + Form.getElements(this.element).each(this.registerCallback, this); + }, + + registerCallback: function(element) { + if (element.type) { + switch (element.type.toLowerCase()) { + case 'checkbox': + case 'radio': + Event.observe(element, 'click', this.onElementEvent.bind(this)); + break; + default: + Event.observe(element, 'change', this.onElementEvent.bind(this)); + break; + } + } + } +}); + +Form.Element.EventObserver = Class.create(Abstract.EventObserver, { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.EventObserver = Class.create(Abstract.EventObserver, { + getValue: function() { + return Form.serialize(this.element); + } +}); +(function() { + + var Event = { + KEY_BACKSPACE: 8, + KEY_TAB: 9, + KEY_RETURN: 13, + KEY_ESC: 27, + KEY_LEFT: 37, + KEY_UP: 38, + KEY_RIGHT: 39, + KEY_DOWN: 40, + KEY_DELETE: 46, + KEY_HOME: 36, + KEY_END: 35, + KEY_PAGEUP: 33, + KEY_PAGEDOWN: 34, + KEY_INSERT: 45, + + cache: {} + }; + + var docEl = document.documentElement; + var MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED = 'onmouseenter' in docEl + && 'onmouseleave' in docEl; + + var _isButton; + if (Prototype.Browser.IE) { + var buttonMap = { 0: 1, 1: 4, 2: 2 }; + _isButton = function(event, code) { + return event.button === buttonMap[code]; + }; + } else if (Prototype.Browser.WebKit) { + _isButton = function(event, code) { + switch (code) { + case 0: return event.which == 1 && !event.metaKey; + case 1: return event.which == 1 && event.metaKey; + default: return false; + } + }; + } else { + _isButton = function(event, code) { + return event.which ? (event.which === code + 1) : (event.button === code); + }; + } + + function isLeftClick(event) { return _isButton(event, 0) } + + function isMiddleClick(event) { return _isButton(event, 1) } + + function isRightClick(event) { return _isButton(event, 2) } + + function element(event) { + event = Event.extend(event); + + var node = event.target, type = event.type, + currentTarget = event.currentTarget; + + if (currentTarget && currentTarget.tagName) { + if (type === 'load' || type === 'error' || + (type === 'click' && currentTarget.tagName.toLowerCase() === 'input' + && currentTarget.type === 'radio')) + node = currentTarget; + } + + if (node.nodeType == Node.TEXT_NODE) + node = node.parentNode; + + return Element.extend(node); + } + + function findElement(event, expression) { + var element = Event.element(event); + if (!expression) return element; + var elements = [element].concat(element.ancestors()); + return Selector.findElement(elements, expression, 0); + } + + function pointer(event) { + return { x: pointerX(event), y: pointerY(event) }; + } + + function pointerX(event) { + var docElement = document.documentElement, + body = document.body || { scrollLeft: 0 }; + + return event.pageX || (event.clientX + + (docElement.scrollLeft || body.scrollLeft) - + (docElement.clientLeft || 0)); + } + + function pointerY(event) { + var docElement = document.documentElement, + body = document.body || { scrollTop: 0 }; + + return event.pageY || (event.clientY + + (docElement.scrollTop || body.scrollTop) - + (docElement.clientTop || 0)); + } + + + function stop(event) { + Event.extend(event); + event.preventDefault(); + event.stopPropagation(); + + event.stopped = true; + } + + Event.Methods = { + isLeftClick: isLeftClick, + isMiddleClick: isMiddleClick, + isRightClick: isRightClick, + + element: element, + findElement: findElement, + + pointer: pointer, + pointerX: pointerX, + pointerY: pointerY, + + stop: stop + }; + + + var methods = Object.keys(Event.Methods).inject({ }, function(m, name) { + m[name] = Event.Methods[name].methodize(); + return m; + }); + + if (Prototype.Browser.IE) { + function _relatedTarget(event) { + var element; + switch (event.type) { + case 'mouseover': element = event.fromElement; break; + case 'mouseout': element = event.toElement; break; + default: return null; + } + return Element.extend(element); + } + + Object.extend(methods, { + stopPropagation: function() { this.cancelBubble = true }, + preventDefault: function() { this.returnValue = false }, + inspect: function() { return '[object Event]' } + }); + + Event.extend = function(event, element) { + if (!event) return false; + if (event._extendedByPrototype) return event; + + event._extendedByPrototype = Prototype.emptyFunction; + var pointer = Event.pointer(event); + + Object.extend(event, { + target: event.srcElement || element, + relatedTarget: _relatedTarget(event), + pageX: pointer.x, + pageY: pointer.y + }); + + return Object.extend(event, methods); + }; + } else { + Event.prototype = window.Event.prototype || document.createEvent('HTMLEvents').__proto__; + Object.extend(Event.prototype, methods); + Event.extend = Prototype.K; + } + + function _createResponder(element, eventName, handler) { + var registry = Element.retrieve(element, 'prototype_event_registry'); + + if (Object.isUndefined(registry)) { + CACHE.push(element); + registry = Element.retrieve(element, 'prototype_event_registry', $H()); + } + + var respondersForEvent = registry.get(eventName); + if (Object.isUndefined(respondersForEvent)) { + respondersForEvent = []; + registry.set(eventName, respondersForEvent); + } + + if (respondersForEvent.pluck('handler').include(handler)) return false; + + var responder; + if (eventName.include(":")) { + responder = function(event) { + if (Object.isUndefined(event.eventName)) + return false; + + if (event.eventName !== eventName) + return false; + + Event.extend(event, element); + handler.call(element, event); + }; + } else { + if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED && + (eventName === "mouseenter" || eventName === "mouseleave")) { + if (eventName === "mouseenter" || eventName === "mouseleave") { + responder = function(event) { + Event.extend(event, element); + + var parent = event.relatedTarget; + while (parent && parent !== element) { + try { parent = parent.parentNode; } + catch(e) { parent = element; } + } + + if (parent === element) return; + + handler.call(element, event); + }; + } + } else { + responder = function(event) { + Event.extend(event, element); + handler.call(element, event); + }; + } + } + + responder.handler = handler; + respondersForEvent.push(responder); + return responder; + } + + function _destroyCache() { + for (var i = 0, length = CACHE.length; i < length; i++) { + Event.stopObserving(CACHE[i]); + CACHE[i] = null; + } + } + + var CACHE = []; + + if (Prototype.Browser.IE) + window.attachEvent('onunload', _destroyCache); + + if (Prototype.Browser.WebKit) + window.addEventListener('unload', Prototype.emptyFunction, false); + + + var _getDOMEventName = Prototype.K; + + if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED) { + _getDOMEventName = function(eventName) { + var translations = { mouseenter: "mouseover", mouseleave: "mouseout" }; + return eventName in translations ? translations[eventName] : eventName; + }; + } + + function observe(element, eventName, handler) { + element = $(element); + + var responder = _createResponder(element, eventName, handler); + + if (!responder) return element; + + if (eventName.include(':')) { + if (element.addEventListener) + element.addEventListener("dataavailable", responder, false); + else { + element.attachEvent("ondataavailable", responder); + element.attachEvent("onfilterchange", responder); + } + } else { + var actualEventName = _getDOMEventName(eventName); + + if (element.addEventListener) + element.addEventListener(actualEventName, responder, false); + else + element.attachEvent("on" + actualEventName, responder); + } + + return element; + } + + function stopObserving(element, eventName, handler) { + element = $(element); + + var registry = Element.retrieve(element, 'prototype_event_registry'); + + if (Object.isUndefined(registry)) return element; + + if (eventName && !handler) { + var responders = registry.get(eventName); + + if (Object.isUndefined(responders)) return element; + + responders.each( function(r) { + Element.stopObserving(element, eventName, r.handler); + }); + return element; + } else if (!eventName) { + registry.each( function(pair) { + var eventName = pair.key, responders = pair.value; + + responders.each( function(r) { + Element.stopObserving(element, eventName, r.handler); + }); + }); + return element; + } + + var responders = registry.get(eventName); + + if (!responders) return; + + var responder = responders.find( function(r) { return r.handler === handler; }); + if (!responder) return element; + + var actualEventName = _getDOMEventName(eventName); + + if (eventName.include(':')) { + if (element.removeEventListener) + element.removeEventListener("dataavailable", responder, false); + else { + element.detachEvent("ondataavailable", responder); + element.detachEvent("onfilterchange", responder); + } + } else { + if (element.removeEventListener) + element.removeEventListener(actualEventName, responder, false); + else + element.detachEvent('on' + actualEventName, responder); + } + + registry.set(eventName, responders.without(responder)); + + return element; + } + + function fire(element, eventName, memo, bubble) { + element = $(element); + + if (Object.isUndefined(bubble)) + bubble = true; + + if (element == document && document.createEvent && !element.dispatchEvent) + element = document.documentElement; + + var event; + if (document.createEvent) { + event = document.createEvent('HTMLEvents'); + event.initEvent('dataavailable', true, true); + } else { + event = document.createEventObject(); + event.eventType = bubble ? 'ondataavailable' : 'onfilterchange'; + } + + event.eventName = eventName; + event.memo = memo || { }; + + if (document.createEvent) + element.dispatchEvent(event); + else + element.fireEvent(event.eventType, event); + + return Event.extend(event); + } + + + Object.extend(Event, Event.Methods); + + Object.extend(Event, { + fire: fire, + observe: observe, + stopObserving: stopObserving + }); + + Element.addMethods({ + fire: fire, + + observe: observe, + + stopObserving: stopObserving + }); + + Object.extend(document, { + fire: fire.methodize(), + + observe: observe.methodize(), + + stopObserving: stopObserving.methodize(), + + loaded: false + }); + + if (window.Event) Object.extend(window.Event, Event); + else window.Event = Event; +})(); + +(function() { + /* Support for the DOMContentLoaded event is based on work by Dan Webb, + Matthias Miller, Dean Edwards, John Resig, and Diego Perini. */ + + var timer; + + function fireContentLoadedEvent() { + if (document.loaded) return; + if (timer) window.clearTimeout(timer); + document.loaded = true; + document.fire('dom:loaded'); + } + + function checkReadyState() { + if (document.readyState === 'complete') { + document.stopObserving('readystatechange', checkReadyState); + fireContentLoadedEvent(); + } + } + + function pollDoScroll() { + try { document.documentElement.doScroll('left'); } + catch(e) { + timer = pollDoScroll.defer(); + return; + } + fireContentLoadedEvent(); + } + + if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false); + } else { + document.observe('readystatechange', checkReadyState); + if (window == top) + timer = pollDoScroll.defer(); + } + + Event.observe(window, 'load', fireContentLoadedEvent); +})(); + +Element.addMethods(); + +/*------------------------------- DEPRECATED -------------------------------*/ + +Hash.toQueryString = Object.toQueryString; + +var Toggle = { display: Element.toggle }; + +Element.Methods.childOf = Element.Methods.descendantOf; + +var Insertion = { + Before: function(element, content) { + return Element.insert(element, {before:content}); + }, + + Top: function(element, content) { + return Element.insert(element, {top:content}); + }, + + Bottom: function(element, content) { + return Element.insert(element, {bottom:content}); + }, + + After: function(element, content) { + return Element.insert(element, {after:content}); + } +}; + +var $continue = new Error('"throw $continue" is deprecated, use "return" instead'); + +var Position = { + includeScrollOffsets: false, + + prepare: function() { + this.deltaX = window.pageXOffset + || document.documentElement.scrollLeft + || document.body.scrollLeft + || 0; + this.deltaY = window.pageYOffset + || document.documentElement.scrollTop + || document.body.scrollTop + || 0; + }, + + within: function(element, x, y) { + if (this.includeScrollOffsets) + return this.withinIncludingScrolloffsets(element, x, y); + this.xcomp = x; + this.ycomp = y; + this.offset = Element.cumulativeOffset(element); + + return (y >= this.offset[1] && + y < this.offset[1] + element.offsetHeight && + x >= this.offset[0] && + x < this.offset[0] + element.offsetWidth); + }, + + withinIncludingScrolloffsets: function(element, x, y) { + var offsetcache = Element.cumulativeScrollOffset(element); + + this.xcomp = x + offsetcache[0] - this.deltaX; + this.ycomp = y + offsetcache[1] - this.deltaY; + this.offset = Element.cumulativeOffset(element); + + return (this.ycomp >= this.offset[1] && + this.ycomp < this.offset[1] + element.offsetHeight && + this.xcomp >= this.offset[0] && + this.xcomp < this.offset[0] + element.offsetWidth); + }, + + overlap: function(mode, element) { + if (!mode) return 0; + if (mode == 'vertical') + return ((this.offset[1] + element.offsetHeight) - this.ycomp) / + element.offsetHeight; + if (mode == 'horizontal') + return ((this.offset[0] + element.offsetWidth) - this.xcomp) / + element.offsetWidth; + }, + + + cumulativeOffset: Element.Methods.cumulativeOffset, + + positionedOffset: Element.Methods.positionedOffset, + + absolutize: function(element) { + Position.prepare(); + return Element.absolutize(element); + }, + + relativize: function(element) { + Position.prepare(); + return Element.relativize(element); + }, + + realOffset: Element.Methods.cumulativeScrollOffset, + + offsetParent: Element.Methods.getOffsetParent, + + page: Element.Methods.viewportOffset, + + clone: function(source, target, options) { + options = options || { }; + return Element.clonePosition(target, source, options); + } +}; + +/*--------------------------------------------------------------------------*/ + +if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){ + function iter(name) { + return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]"; + } + + instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ? + function(element, className) { + className = className.toString().strip(); + var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className); + return cond ? document._getElementsByXPath('.//*' + cond, element) : []; + } : function(element, className) { + className = className.toString().strip(); + var elements = [], classNames = (/\s/.test(className) ? $w(className) : null); + if (!classNames && !className) return elements; + + var nodes = $(element).getElementsByTagName('*'); + className = ' ' + className + ' '; + + for (var i = 0, child, cn; child = nodes[i]; i++) { + if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) || + (classNames && classNames.all(function(name) { + return !name.toString().blank() && cn.include(' ' + name + ' '); + })))) + elements.push(Element.extend(child)); + } + return elements; + }; + + return function(className, parentElement) { + return $(parentElement || document.body).getElementsByClassName(className); + }; +}(Element.Methods); + +/*--------------------------------------------------------------------------*/ + +Element.ClassNames = Class.create(); +Element.ClassNames.prototype = { + initialize: function(element) { + this.element = $(element); + }, + + _each: function(iterator) { + this.element.className.split(/\s+/).select(function(name) { + return name.length > 0; + })._each(iterator); + }, + + set: function(className) { + this.element.className = className; + }, + + add: function(classNameToAdd) { + if (this.include(classNameToAdd)) return; + this.set($A(this).concat(classNameToAdd).join(' ')); + }, + + remove: function(classNameToRemove) { + if (!this.include(classNameToRemove)) return; + this.set($A(this).without(classNameToRemove).join(' ')); + }, + + toString: function() { + return $A(this).join(' '); + } +}; + +Object.extend(Element.ClassNames.prototype, Enumerable); + +/*--------------------------------------------------------------------------*/ diff --git a/web-app/js/prototype/rico.js b/web-app/js/prototype/rico.js new file mode 100644 index 0000000..f0b6fb5 --- /dev/null +++ b/web-app/js/prototype/rico.js @@ -0,0 +1,2691 @@ +/** + * + * Copyright 2005 Sabre Airline Solutions + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + **/ + + +//-------------------- rico.js +var Rico = { + Version: '1.1-beta2' +} + +Rico.ArrayExtensions = new Array(); + +if (Object.prototype.extend) { + // in prototype.js... + Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Object.prototype.extend; +} + +if (Array.prototype.push) { + // in prototype.js... + Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Array.prototype.push; +} + +if (!Array.prototype.remove) { + Array.prototype.remove = function(dx) { + if( isNaN(dx) || dx > this.length ) + return false; + for( var i=0,n=0; i 1 ) { + if(typeof(arguments[1]) == "object" && arguments[1].length != undefined) { + queryString = this._createQueryString(arguments[1], 0); + } + else { + queryString = this._createQueryString(arguments, 1); + } + } + + new Ajax.Request(requestURL, this._requestOptions(queryString)); + }, + + sendRequestWithData: function(requestName, xmlDocument) { + var requestURL = this.requestURLS[requestName]; + if ( requestURL == null ) + return; + + var queryString = ""; + if ( arguments.length > 2 ) { + if(typeof(arguments[2]) == "object" && arguments[2].length != undefined) { + queryString = this._createQueryString(arguments[2], 0); + } + else { + queryString = this._createQueryString(arguments, 2); + } + } + + new Ajax.Request(requestURL + "?" + queryString, this._requestOptions(null,xmlDocument)); + }, + + sendRequestAndUpdate: function(requestName,container,options) { + var requestURL = this.requestURLS[requestName]; + if ( requestURL == null ) + return; + + var queryString = ""; + if ( arguments.length > 3 ) { + if(typeof(arguments[3]) == "object" && arguments[3].length != undefined) { + queryString = this._createQueryString(arguments[3], 0); + } + else { + queryString = this._createQueryString(arguments, 3); + } + } + + var updaterOptions = this._requestOptions(queryString); + updaterOptions.onComplete = null; + updaterOptions.extend(options); + + new Ajax.Updater(container, requestURL, updaterOptions); + }, + + sendRequestWithDataAndUpdate: function(requestName,xmlDocument,container,options) { + var requestURL = this.requestURLS[requestName]; + if ( requestURL == null ) + return; + + var queryString = ""; + if ( arguments.length > 4 ) { + if(typeof(arguments[4]) == "object" && arguments[4].length != undefined) { + queryString = this._createQueryString(arguments[4], 0); + } + else { + queryString = this._createQueryString(arguments, 4); + } + } + + + var updaterOptions = this._requestOptions(queryString,xmlDocument); + updaterOptions.onComplete = null; + updaterOptions.extend(options); + + new Ajax.Updater(container, requestURL + "?" + queryString, updaterOptions); + }, + + // Private -- not part of intended engine API -------------------------------------------------------------------- + + _requestOptions: function(queryString,xmlDoc) { + var self = this; + + var requestHeaders = ['X-Rico-Version', Rico.Version ]; + var sendMethod = "post" + if ( arguments[1] ) + requestHeaders.push( 'Content-type', 'text/xml' ); + else + sendMethod = "get"; + + return { requestHeaders: requestHeaders, + parameters: queryString, + postBody: arguments[1] ? xmlDoc : null, + method: sendMethod, + onComplete: self._onRequestComplete.bind(self) }; + }, + + _createQueryString: function( theArgs, offset ) { + var self = this; + var queryString = "" + for ( var i = offset ; i < theArgs.length ; i++ ) { + if ( i != offset ) + queryString += "&"; + + var anArg = theArgs[i]; + + if ( anArg.name != undefined && anArg.value != undefined ) { + queryString += anArg.name + "=" + escape(anArg.value); + } + else { + var ePos = anArg.indexOf('='); + var argName = anArg.substring( 0, ePos ); + var argValue = anArg.substring( ePos + 1 ); + queryString += argName + "=" + escape(argValue); + } + } + + return queryString; + }, + _onRequestComplete : function(request) { + + //!!TODO: error handling infrastructure?? + if (request.status != 200) + return; + + var response = request.responseXML.getElementsByTagName("ajax-response"); + if (response == null || response.length != 1) + return; + this._processAjaxResponse( response[0].childNodes ); + }, + + _processAjaxResponse: function( xmlResponseElements ) { + for ( var i = 0 ; i < xmlResponseElements.length ; i++ ) { + var responseElement = xmlResponseElements[i]; + + // only process nodes of type element..... + if ( responseElement.nodeType != 1 ) + continue; + + var responseType = responseElement.getAttribute("type"); + var responseId = responseElement.getAttribute("id"); + + if ( responseType == "object" ) + this._processAjaxObjectUpdate( this.ajaxObjects[ responseId ], responseElement ); + else if ( responseType == "element" ) + this._processAjaxElementUpdate( this.ajaxElements[ responseId ], responseElement ); + else + alert('unrecognized AjaxResponse type : ' + responseType ); + } + }, + + _processAjaxObjectUpdate: function( ajaxObject, responseElement ) { + ajaxObject.ajaxUpdate( responseElement ); + }, + + _processAjaxElementUpdate: function( ajaxElement, responseElement ) { + ajaxElement.innerHTML = RicoUtil.getContentAsString(responseElement); + } + +} + +var ajaxEngine = new Rico.AjaxEngine(); + + +//-------------------- ricoColor.js +Rico.Color = Class.create(); + +Rico.Color.prototype = { + + initialize: function(red, green, blue) { + this.rgb = { r: red, g : green, b : blue }; + }, + + setRed: function(r) { + this.rgb.r = r; + }, + + setGreen: function(g) { + this.rgb.g = g; + }, + + setBlue: function(b) { + this.rgb.b = b; + }, + + setHue: function(h) { + + // get an HSB model, and set the new hue... + var hsb = this.asHSB(); + hsb.h = h; + + // convert back to RGB... + this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, hsb.b); + }, + + setSaturation: function(s) { + // get an HSB model, and set the new hue... + var hsb = this.asHSB(); + hsb.s = s; + + // convert back to RGB and set values... + this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, hsb.b); + }, + + setBrightness: function(b) { + // get an HSB model, and set the new hue... + var hsb = this.asHSB(); + hsb.b = b; + + // convert back to RGB and set values... + this.rgb = Rico.Color.HSBtoRGB( hsb.h, hsb.s, hsb.b ); + }, + + darken: function(percent) { + var hsb = this.asHSB(); + this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, Math.max(hsb.b - percent,0)); + }, + + brighten: function(percent) { + var hsb = this.asHSB(); + this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, Math.min(hsb.b + percent,1)); + }, + + blend: function(other) { + this.rgb.r = Math.floor((this.rgb.r + other.rgb.r)/2); + this.rgb.g = Math.floor((this.rgb.g + other.rgb.g)/2); + this.rgb.b = Math.floor((this.rgb.b + other.rgb.b)/2); + }, + + isBright: function() { + var hsb = this.asHSB(); + return this.asHSB().b > 0.5; + }, + + isDark: function() { + return ! this.isBright(); + }, + + asRGB: function() { + return "rgb(" + this.rgb.r + "," + this.rgb.g + "," + this.rgb.b + ")"; + }, + + asHex: function() { + return "#" + this.rgb.r.toColorPart() + this.rgb.g.toColorPart() + this.rgb.b.toColorPart(); + }, + + asHSB: function() { + return Rico.Color.RGBtoHSB(this.rgb.r, this.rgb.g, this.rgb.b); + }, + + toString: function() { + return this.asHex(); + } + +}; + +Rico.Color.createFromHex = function(hexCode) { + + if ( hexCode.indexOf('#') == 0 ) + hexCode = hexCode.substring(1); + var red = hexCode.substring(0,2); + var green = hexCode.substring(2,4); + var blue = hexCode.substring(4,6); + return new Rico.Color( parseInt(red,16), parseInt(green,16), parseInt(blue,16) ); +} + +/** + * Factory method for creating a color from the background of + * an HTML element. + */ +Rico.Color.createColorFromBackground = function(elem) { + + var actualColor = RicoUtil.getElementsComputedStyle($(elem), "backgroundColor", "background-color"); + + if ( actualColor == "transparent" && elem.parent ) + return Rico.Color.createColorFromBackground(elem.parent); + + if ( actualColor == null ) + return new Rico.Color(255,255,255); + + if ( actualColor.indexOf("rgb(") == 0 ) { + var colors = actualColor.substring(4, actualColor.length - 1 ); + var colorArray = colors.split(","); + return new Rico.Color( parseInt( colorArray[0] ), + parseInt( colorArray[1] ), + parseInt( colorArray[2] ) ); + + } + else if ( actualColor.indexOf("#") == 0 ) { + var redPart = parseInt(actualColor.substring(1,3), 16); + var greenPart = parseInt(actualColor.substring(3,5), 16); + var bluePart = parseInt(actualColor.substring(5), 16); + return new Rico.Color( redPart, greenPart, bluePart ); + } + else + return new Rico.Color(255,255,255); +} + +Rico.Color.HSBtoRGB = function(hue, saturation, brightness) { + + var red = 0; + var green = 0; + var blue = 0; + + if (saturation == 0) { + red = parseInt(brightness * 255.0 + 0.5); + green = red; + blue = red; + } + else { + var h = (hue - Math.floor(hue)) * 6.0; + var f = h - Math.floor(h); + var p = brightness * (1.0 - saturation); + var q = brightness * (1.0 - saturation * f); + var t = brightness * (1.0 - (saturation * (1.0 - f))); + + switch (parseInt(h)) { + case 0: + red = (brightness * 255.0 + 0.5); + green = (t * 255.0 + 0.5); + blue = (p * 255.0 + 0.5); + break; + case 1: + red = (q * 255.0 + 0.5); + green = (brightness * 255.0 + 0.5); + blue = (p * 255.0 + 0.5); + break; + case 2: + red = (p * 255.0 + 0.5); + green = (brightness * 255.0 + 0.5); + blue = (t * 255.0 + 0.5); + break; + case 3: + red = (p * 255.0 + 0.5); + green = (q * 255.0 + 0.5); + blue = (brightness * 255.0 + 0.5); + break; + case 4: + red = (t * 255.0 + 0.5); + green = (p * 255.0 + 0.5); + blue = (brightness * 255.0 + 0.5); + break; + case 5: + red = (brightness * 255.0 + 0.5); + green = (p * 255.0 + 0.5); + blue = (q * 255.0 + 0.5); + break; + } + } + + return { r : parseInt(red), g : parseInt(green) , b : parseInt(blue) }; +} + +Rico.Color.RGBtoHSB = function(r, g, b) { + + var hue; + var saturaton; + var brightness; + + var cmax = (r > g) ? r : g; + if (b > cmax) + cmax = b; + + var cmin = (r < g) ? r : g; + if (b < cmin) + cmin = b; + + brightness = cmax / 255.0; + if (cmax != 0) + saturation = (cmax - cmin)/cmax; + else + saturation = 0; + + if (saturation == 0) + hue = 0; + else { + var redc = (cmax - r)/(cmax - cmin); + var greenc = (cmax - g)/(cmax - cmin); + var bluec = (cmax - b)/(cmax - cmin); + + if (r == cmax) + hue = bluec - greenc; + else if (g == cmax) + hue = 2.0 + redc - bluec; + else + hue = 4.0 + greenc - redc; + + hue = hue / 6.0; + if (hue < 0) + hue = hue + 1.0; + } + + return { h : hue, s : saturation, b : brightness }; +} + + +//-------------------- ricoCorner.js + +Rico.Corner = { + + round: function(e, options) { + var e = $(e); + this._setOptions(options); + + var color = this.options.color; + if ( this.options.color == "fromElement" ) + color = this._background(e); + + var bgColor = this.options.bgColor; + if ( this.options.bgColor == "fromParent" ) + bgColor = this._background(e.offsetParent); + + this._roundCornersImpl(e, color, bgColor); + }, + + _roundCornersImpl: function(e, color, bgColor) { + if(this.options.border) + this._renderBorder(e,bgColor); + if(this._isTopRounded()) + this._roundTopCorners(e,color,bgColor); + if(this._isBottomRounded()) + this._roundBottomCorners(e,color,bgColor); + }, + + _renderBorder: function(el,bgColor) { + var borderValue = "1px solid " + this._borderColor(bgColor); + var borderL = "border-left: " + borderValue; + var borderR = "border-right: " + borderValue; + var style = "style='" + borderL + ";" + borderR + "'"; + el.innerHTML = "
    " + el.innerHTML + "
    " + }, + + _roundTopCorners: function(el, color, bgColor) { + var corner = this._createCorner(bgColor); + for(var i=0 ; i < this.options.numSlices ; i++ ) + corner.appendChild(this._createCornerSlice(color,bgColor,i,"top")); + el.style.paddingTop = 0; + el.insertBefore(corner,el.firstChild); + }, + + _roundBottomCorners: function(el, color, bgColor) { + var corner = this._createCorner(bgColor); + for(var i=(this.options.numSlices-1) ; i >= 0 ; i-- ) + corner.appendChild(this._createCornerSlice(color,bgColor,i,"bottom")); + el.style.paddingBottom = 0; + el.appendChild(corner); + }, + + _createCorner: function(bgColor) { + var corner = document.createElement("div"); + corner.style.backgroundColor = (this._isTransparent() ? "transparent" : bgColor); + return corner; + }, + + _createCornerSlice: function(color,bgColor, n, position) { + var slice = document.createElement("span"); + + var inStyle = slice.style; + inStyle.backgroundColor = color; + inStyle.display = "block"; + inStyle.height = "1px"; + inStyle.overflow = "hidden"; + inStyle.fontSize = "1px"; + + var borderColor = this._borderColor(color,bgColor); + if ( this.options.border && n == 0 ) { + inStyle.borderTopStyle = "solid"; + inStyle.borderTopWidth = "1px"; + inStyle.borderLeftWidth = "0px"; + inStyle.borderRightWidth = "0px"; + inStyle.borderBottomWidth = "0px"; + inStyle.height = "0px"; // assumes css compliant box model + inStyle.borderColor = borderColor; + } + else if(borderColor) { + inStyle.borderColor = borderColor; + inStyle.borderStyle = "solid"; + inStyle.borderWidth = "0px 1px"; + } + + if ( !this.options.compact && (n == (this.options.numSlices-1)) ) + inStyle.height = "2px"; + + this._setMargin(slice, n, position); + this._setBorder(slice, n, position); + + return slice; + }, + + _setOptions: function(options) { + this.options = { + corners : "all", + color : "fromElement", + bgColor : "fromParent", + blend : true, + border : false, + compact : false + }.extend(options || {}); + + this.options.numSlices = this.options.compact ? 2 : 4; + if ( this._isTransparent() ) + this.options.blend = false; + }, + + _whichSideTop: function() { + if ( this._hasString(this.options.corners, "all", "top") ) + return ""; + + if ( this.options.corners.indexOf("tl") >= 0 && this.options.corners.indexOf("tr") >= 0 ) + return ""; + + if (this.options.corners.indexOf("tl") >= 0) + return "left"; + else if (this.options.corners.indexOf("tr") >= 0) + return "right"; + return ""; + }, + + _whichSideBottom: function() { + if ( this._hasString(this.options.corners, "all", "bottom") ) + return ""; + + if ( this.options.corners.indexOf("bl")>=0 && this.options.corners.indexOf("br")>=0 ) + return ""; + + if(this.options.corners.indexOf("bl") >=0) + return "left"; + else if(this.options.corners.indexOf("br")>=0) + return "right"; + return ""; + }, + + _borderColor : function(color,bgColor) { + if ( color == "transparent" ) + return bgColor; + else if ( this.options.border ) + return this.options.border; + else if ( this.options.blend ) + return this._blend( bgColor, color ); + else + return ""; + }, + + + _setMargin: function(el, n, corners) { + var marginSize = this._marginSize(n); + var whichSide = corners == "top" ? this._whichSideTop() : this._whichSideBottom(); + + if ( whichSide == "left" ) { + el.style.marginLeft = marginSize + "px"; el.style.marginRight = "0px"; + } + else if ( whichSide == "right" ) { + el.style.marginRight = marginSize + "px"; el.style.marginLeft = "0px"; + } + else { + el.style.marginLeft = marginSize + "px"; el.style.marginRight = marginSize + "px"; + } + }, + + _setBorder: function(el,n,corners) { + var borderSize = this._borderSize(n); + var whichSide = corners == "top" ? this._whichSideTop() : this._whichSideBottom(); + + if ( whichSide == "left" ) { + el.style.borderLeftWidth = borderSize + "px"; el.style.borderRightWidth = "0px"; + } + else if ( whichSide == "right" ) { + el.style.borderRightWidth = borderSize + "px"; el.style.borderLeftWidth = "0px"; + } + else { + el.style.borderLeftWidth = borderSize + "px"; el.style.borderRightWidth = borderSize + "px"; + } + }, + + _marginSize: function(n) { + if ( this._isTransparent() ) + return 0; + + var marginSizes = [ 5, 3, 2, 1 ]; + var blendedMarginSizes = [ 3, 2, 1, 0 ]; + var compactMarginSizes = [ 2, 1 ]; + var smBlendedMarginSizes = [ 1, 0 ]; + + if ( this.options.compact && this.options.blend ) + return smBlendedMarginSizes[n]; + else if ( this.options.compact ) + return compactMarginSizes[n]; + else if ( this.options.blend ) + return blendedMarginSizes[n]; + else + return marginSizes[n]; + }, + + _borderSize: function(n) { + var transparentBorderSizes = [ 5, 3, 2, 1 ]; + var blendedBorderSizes = [ 2, 1, 1, 1 ]; + var compactBorderSizes = [ 1, 0 ]; + var actualBorderSizes = [ 0, 2, 0, 0 ]; + + if ( this.options.compact && (this.options.blend || this._isTransparent()) ) + return 1; + else if ( this.options.compact ) + return compactBorderSizes[n]; + else if ( this.options.blend ) + return blendedBorderSizes[n]; + else if ( this.options.border ) + return actualBorderSizes[n]; + else if ( this._isTransparent() ) + return transparentBorderSizes[n]; + return 0; + }, + + _hasString: function(str) { for(var i=1 ; i= 0) return true; return false; }, + _blend: function(c1, c2) { var cc1 = Rico.Color.createFromHex(c1); cc1.blend(Rico.Color.createFromHex(c2)); return cc1; }, + _background: function(el) { try { return Rico.Color.createColorFromBackground(el).asHex(); } catch(err) { return "#ffffff"; } }, + _isTransparent: function() { return this.options.color == "transparent"; }, + _isTopRounded: function() { return this._hasString(this.options.corners, "all", "top", "tl", "tr"); }, + _isBottomRounded: function() { return this._hasString(this.options.corners, "all", "bottom", "bl", "br"); }, + _hasSingleTextChild: function(el) { return el.childNodes.length == 1 && el.childNodes[0].nodeType == 3; } +} + + +//-------------------- ricoDragAndDrop.js +Rico.DragAndDrop = Class.create(); + +Rico.DragAndDrop.prototype = { + + initialize: function() { + this.dropZones = new Array(); + this.draggables = new Array(); + this.currentDragObjects = new Array(); + this.dragElement = null; + this.lastSelectedDraggable = null; + this.currentDragObjectVisible = false; + this.interestedInMotionEvents = false; + }, + + registerDropZone: function(aDropZone) { + this.dropZones[ this.dropZones.length ] = aDropZone; + }, + + deregisterDropZone: function(aDropZone) { + var newDropZones = new Array(); + var j = 0; + for ( var i = 0 ; i < this.dropZones.length ; i++ ) { + if ( this.dropZones[i] != aDropZone ) + newDropZones[j++] = this.dropZones[i]; + } + + this.dropZones = newDropZones; + }, + + clearDropZones: function() { + this.dropZones = new Array(); + }, + + registerDraggable: function( aDraggable ) { + this.draggables[ this.draggables.length ] = aDraggable; + this._addMouseDownHandler( aDraggable ); + }, + + clearSelection: function() { + for ( var i = 0 ; i < this.currentDragObjects.length ; i++ ) + this.currentDragObjects[i].deselect(); + this.currentDragObjects = new Array(); + this.lastSelectedDraggable = null; + }, + + hasSelection: function() { + return this.currentDragObjects.length > 0; + }, + + setStartDragFromElement: function( e, mouseDownElement ) { + this.origPos = RicoUtil.toDocumentPosition(mouseDownElement); + this.startx = e.screenX - this.origPos.x + this.starty = e.screenY - this.origPos.y + //this.startComponentX = e.layerX ? e.layerX : e.offsetX; + //this.startComponentY = e.layerY ? e.layerY : e.offsetY; + //this.adjustedForDraggableSize = false; + + this.interestedInMotionEvents = this.hasSelection(); + this._terminateEvent(e); + }, + + updateSelection: function( draggable, extendSelection ) { + if ( ! extendSelection ) + this.clearSelection(); + + if ( draggable.isSelected() ) { + this.currentDragObjects.removeItem(draggable); + draggable.deselect(); + if ( draggable == this.lastSelectedDraggable ) + this.lastSelectedDraggable = null; + } + else { + this.currentDragObjects[ this.currentDragObjects.length ] = draggable; + draggable.select(); + this.lastSelectedDraggable = draggable; + } + }, + + _mouseDownHandler: function(e) { + if ( arguments.length == 0 ) + e = event; + + // if not button 1 ignore it... + var nsEvent = e.which != undefined; + if ( (nsEvent && e.which != 1) || (!nsEvent && e.button != 1)) + return; + + var eventTarget = e.target ? e.target : e.srcElement; + var draggableObject = eventTarget.draggable; + + var candidate = eventTarget; + while (draggableObject == null && candidate.parentNode) { + candidate = candidate.parentNode; + draggableObject = candidate.draggable; + } + + if ( draggableObject == null ) + return; + + this.updateSelection( draggableObject, e.ctrlKey ); + + // clear the drop zones postion cache... + if ( this.hasSelection() ) + for ( var i = 0 ; i < this.dropZones.length ; i++ ) + this.dropZones[i].clearPositionCache(); + + this.setStartDragFromElement( e, draggableObject.getMouseDownHTMLElement() ); + }, + + + _mouseMoveHandler: function(e) { + var nsEvent = e.which != undefined; + if ( !this.interestedInMotionEvents ) { + this._terminateEvent(e); + return; + } + + if ( ! this.hasSelection() ) + return; + + if ( ! this.currentDragObjectVisible ) + this._startDrag(e); + + if ( !this.activatedDropZones ) + this._activateRegisteredDropZones(); + + //if ( !this.adjustedForDraggableSize ) + // this._adjustForDraggableSize(e); + + this._updateDraggableLocation(e); + this._updateDropZonesHover(e); + + this._terminateEvent(e); + }, + + _makeDraggableObjectVisible: function(e) + { + if ( !this.hasSelection() ) + return; + + var dragElement; + if ( this.currentDragObjects.length > 1 ) + dragElement = this.currentDragObjects[0].getMultiObjectDragGUI(this.currentDragObjects); + else + dragElement = this.currentDragObjects[0].getSingleObjectDragGUI(); + + // go ahead and absolute position it... + if ( RicoUtil.getElementsComputedStyle(dragElement, "position") != "absolute" ) + dragElement.style.position = "absolute"; + + // need to parent him into the document... + if ( dragElement.parentNode == null || dragElement.parentNode.nodeType == 11 ) + document.body.appendChild(dragElement); + + this.dragElement = dragElement; + this._updateDraggableLocation(e); + + this.currentDragObjectVisible = true; + }, + + /** + _adjustForDraggableSize: function(e) { + var dragElementWidth = this.dragElement.offsetWidth; + var dragElementHeight = this.dragElement.offsetHeight; + if ( this.startComponentX > dragElementWidth ) + this.startx -= this.startComponentX - dragElementWidth + 2; + if ( e.offsetY ) { + if ( this.startComponentY > dragElementHeight ) + this.starty -= this.startComponentY - dragElementHeight + 2; + } + this.adjustedForDraggableSize = true; + }, + **/ + + _updateDraggableLocation: function(e) { + var dragObjectStyle = this.dragElement.style; + dragObjectStyle.left = (e.screenX - this.startx) + "px" + dragObjectStyle.top = (e.screenY - this.starty) + "px"; + }, + + _updateDropZonesHover: function(e) { + var n = this.dropZones.length; + for ( var i = 0 ; i < n ; i++ ) { + if ( ! this._mousePointInDropZone( e, this.dropZones[i] ) ) + this.dropZones[i].hideHover(); + } + + for ( var i = 0 ; i < n ; i++ ) { + if ( this._mousePointInDropZone( e, this.dropZones[i] ) ) { + if ( this.dropZones[i].canAccept(this.currentDragObjects) ) + this.dropZones[i].showHover(); + } + } + }, + + _startDrag: function(e) { + for ( var i = 0 ; i < this.currentDragObjects.length ; i++ ) + this.currentDragObjects[i].startDrag(); + + this._makeDraggableObjectVisible(e); + }, + + _mouseUpHandler: function(e) { + if ( ! this.hasSelection() ) + return; + + var nsEvent = e.which != undefined; + if ( (nsEvent && e.which != 1) || (!nsEvent && e.button != 1)) + return; + + this.interestedInMotionEvents = false; + + if ( this.dragElement == null ) { + this._terminateEvent(e); + return; + } + + if ( this._placeDraggableInDropZone(e) ) + this._completeDropOperation(e); + else { + this._terminateEvent(e); + new Effect.Position( this.dragElement, + this.origPos.x, + this.origPos.y, + 200, + 20, + { complete : this._doCancelDragProcessing.bind(this) } ); + } + }, + + _completeDropOperation: function(e) { + if ( this.dragElement != this.currentDragObjects[0].getMouseDownHTMLElement() ) { + if ( this.dragElement.parentNode != null ) + this.dragElement.parentNode.removeChild(this.dragElement); + } + + this._deactivateRegisteredDropZones(); + this._endDrag(); + this.clearSelection(); + this.dragElement = null; + this.currentDragObjectVisible = false; + this._terminateEvent(e); + }, + + _doCancelDragProcessing: function() { + this._cancelDrag(); + + if ( this.dragElement != this.currentDragObjects[0].getMouseDownHTMLElement() ) { + if ( this.dragElement.parentNode != null ) { + this.dragElement.parentNode.removeChild(this.dragElement); + } + } + + this._deactivateRegisteredDropZones(); + this.dragElement = null; + this.currentDragObjectVisible = false; + }, + + _placeDraggableInDropZone: function(e) { + var foundDropZone = false; + var n = this.dropZones.length; + for ( var i = 0 ; i < n ; i++ ) { + if ( this._mousePointInDropZone( e, this.dropZones[i] ) ) { + if ( this.dropZones[i].canAccept(this.currentDragObjects) ) { + this.dropZones[i].hideHover(); + this.dropZones[i].accept(this.currentDragObjects); + foundDropZone = true; + break; + } + } + } + + return foundDropZone; + }, + + _cancelDrag: function() { + for ( var i = 0 ; i < this.currentDragObjects.length ; i++ ) + this.currentDragObjects[i].cancelDrag(); + }, + + _endDrag: function() { + for ( var i = 0 ; i < this.currentDragObjects.length ; i++ ) + this.currentDragObjects[i].endDrag(); + }, + + _mousePointInDropZone: function( e, dropZone ) { + + var absoluteRect = dropZone.getAbsoluteRect(); + + return e.clientX > absoluteRect.left && + e.clientX < absoluteRect.right && + e.clientY > absoluteRect.top && + e.clientY < absoluteRect.bottom; + }, + + _addMouseDownHandler: function( aDraggable ) + { + var htmlElement = aDraggable.getMouseDownHTMLElement(); + if ( htmlElement != null ) { + htmlElement.draggable = aDraggable; + this._addMouseDownEvent( htmlElement ); + } + }, + + _activateRegisteredDropZones: function() { + var n = this.dropZones.length; + for ( var i = 0 ; i < n ; i++ ) { + var dropZone = this.dropZones[i]; + if ( dropZone.canAccept(this.currentDragObjects) ) + dropZone.activate(); + } + + this.activatedDropZones = true; + }, + + _deactivateRegisteredDropZones: function() { + var n = this.dropZones.length; + for ( var i = 0 ; i < n ; i++ ) + this.dropZones[i].deactivate(); + this.activatedDropZones = false; + }, + + _addMouseDownEvent: function( htmlElement ) { + if ( typeof document.implementation != "undefined" && + document.implementation.hasFeature("HTML", "1.0") && + document.implementation.hasFeature("Events", "2.0") && + document.implementation.hasFeature("CSS", "2.0") ) { + htmlElement.addEventListener("mousedown", this._mouseDownHandler.bindAsEventListener(this), false); + } + else { + htmlElement.attachEvent( "onmousedown", this._mouseDownHandler.bindAsEventListener(this) ); + } + }, + + _terminateEvent: function(e) { + if ( e.stopPropagation != undefined ) + e.stopPropagation(); + else if ( e.cancelBubble != undefined ) + e.cancelBubble = true; + + if ( e.preventDefault != undefined ) + e.preventDefault(); + else + e.returnValue = false; + }, + + initializeEventHandlers: function() { + if ( typeof document.implementation != "undefined" && + document.implementation.hasFeature("HTML", "1.0") && + document.implementation.hasFeature("Events", "2.0") && + document.implementation.hasFeature("CSS", "2.0") ) { + document.addEventListener("mouseup", this._mouseUpHandler.bindAsEventListener(this), false); + document.addEventListener("mousemove", this._mouseMoveHandler.bindAsEventListener(this), false); + } + else { + document.attachEvent( "onmouseup", this._mouseUpHandler.bindAsEventListener(this) ); + document.attachEvent( "onmousemove", this._mouseMoveHandler.bindAsEventListener(this) ); + } + } +} + +//var dndMgr = new Rico.DragAndDrop(); +//dndMgr.initializeEventHandlers(); + + +//-------------------- ricoDraggable.js +Rico.Draggable = Class.create(); + +Rico.Draggable.prototype = { + + initialize: function( type, htmlElement ) { + this.type = type; + this.htmlElement = $(htmlElement); + this.selected = false; + }, + + /** + * Returns the HTML element that should have a mouse down event + * added to it in order to initiate a drag operation + * + **/ + getMouseDownHTMLElement: function() { + return this.htmlElement; + }, + + select: function() { + this.selected = true; + + if ( this.showingSelected ) + return; + + var htmlElement = this.getMouseDownHTMLElement(); + + var color = Rico.Color.createColorFromBackground(htmlElement); + color.isBright() ? color.darken(0.033) : color.brighten(0.033); + + this.saveBackground = RicoUtil.getElementsComputedStyle(htmlElement, "backgroundColor", "background-color"); + htmlElement.style.backgroundColor = color.asHex(); + this.showingSelected = true; + }, + + deselect: function() { + this.selected = false; + if ( !this.showingSelected ) + return; + + var htmlElement = this.getMouseDownHTMLElement(); + + htmlElement.style.backgroundColor = this.saveBackground; + this.showingSelected = false; + }, + + isSelected: function() { + return this.selected; + }, + + startDrag: function() { + }, + + cancelDrag: function() { + }, + + endDrag: function() { + }, + + getSingleObjectDragGUI: function() { + return this.htmlElement; + }, + + getMultiObjectDragGUI: function( draggables ) { + return this.htmlElement; + }, + + getDroppedGUI: function() { + return this.htmlElement; + }, + + toString: function() { + return this.type + ":" + this.htmlElement + ":"; + } + +} + + +//-------------------- ricoDropzone.js +Rico.Dropzone = Class.create(); + +Rico.Dropzone.prototype = { + + initialize: function( htmlElement ) { + this.htmlElement = $(htmlElement); + this.absoluteRect = null; + }, + + getHTMLElement: function() { + return this.htmlElement; + }, + + clearPositionCache: function() { + this.absoluteRect = null; + }, + + getAbsoluteRect: function() { + if ( this.absoluteRect == null ) { + var htmlElement = this.getHTMLElement(); + var pos = RicoUtil.toViewportPosition(htmlElement); + + this.absoluteRect = { + top: pos.y, + left: pos.x, + bottom: pos.y + htmlElement.offsetHeight, + right: pos.x + htmlElement.offsetWidth + }; + } + return this.absoluteRect; + }, + + activate: function() { + var htmlElement = this.getHTMLElement(); + if (htmlElement == null || this.showingActive) + return; + + this.showingActive = true; + this.saveBackgroundColor = htmlElement.style.backgroundColor; + + var fallbackColor = "#ffea84"; + var currentColor = Rico.Color.createColorFromBackground(htmlElement); + if ( currentColor == null ) + htmlElement.style.backgroundColor = fallbackColor; + else { + currentColor.isBright() ? currentColor.darken(0.2) : currentColor.brighten(0.2); + htmlElement.style.backgroundColor = currentColor.asHex(); + } + }, + + deactivate: function() { + var htmlElement = this.getHTMLElement(); + if (htmlElement == null || !this.showingActive) + return; + + htmlElement.style.backgroundColor = this.saveBackgroundColor; + this.showingActive = false; + this.saveBackgroundColor = null; + }, + + showHover: function() { + var htmlElement = this.getHTMLElement(); + if ( htmlElement == null || this.showingHover ) + return; + + this.saveBorderWidth = htmlElement.style.borderWidth; + this.saveBorderStyle = htmlElement.style.borderStyle; + this.saveBorderColor = htmlElement.style.borderColor; + + this.showingHover = true; + htmlElement.style.borderWidth = "1px"; + htmlElement.style.borderStyle = "solid"; + //htmlElement.style.borderColor = "#ff9900"; + htmlElement.style.borderColor = "#ffff00"; + }, + + hideHover: function() { + var htmlElement = this.getHTMLElement(); + if ( htmlElement == null || !this.showingHover ) + return; + + htmlElement.style.borderWidth = this.saveBorderWidth; + htmlElement.style.borderStyle = this.saveBorderStyle; + htmlElement.style.borderColor = this.saveBorderColor; + this.showingHover = false; + }, + + canAccept: function(draggableObjects) { + return true; + }, + + accept: function(draggableObjects) { + var htmlElement = this.getHTMLElement(); + if ( htmlElement == null ) + return; + + n = draggableObjects.length; + for ( var i = 0 ; i < n ; i++ ) + { + var theGUI = draggableObjects[i].getDroppedGUI(); + if ( RicoUtil.getElementsComputedStyle( theGUI, "position" ) == "absolute" ) + { + theGUI.style.position = "static"; + theGUI.style.top = ""; + theGUI.style.top = ""; + } + htmlElement.appendChild(theGUI); + } + } +} + + +//-------------------- ricoEffects.js + +/** + * Use the Effect namespace for effects. If using scriptaculous effects + * this will already be defined, otherwise we'll just create an empty + * object for it... + **/ +if ( window.Effect == undefined ) + Effect = {}; + +Effect.SizeAndPosition = Class.create(); +Effect.SizeAndPosition.prototype = { + + initialize: function(element, x, y, w, h, duration, steps, options) { + this.element = $(element); + this.x = x; + this.y = y; + this.w = w; + this.h = h; + this.duration = duration; + this.steps = steps; + this.options = arguments[7] || {}; + + this.sizeAndPosition(); + }, + + sizeAndPosition: function() { + if (this.isFinished()) { + if(this.options.complete) this.options.complete(this); + return; + } + + if (this.timer) + clearTimeout(this.timer); + + var stepDuration = Math.round(this.duration/this.steps) ; + + // Get original values: x,y = top left corner; w,h = width height + var currentX = this.element.offsetLeft; + var currentY = this.element.offsetTop; + var currentW = this.element.offsetWidth; + var currentH = this.element.offsetHeight; + + // If values not set, or zero, we do not modify them, and take original as final as well + this.x = (this.x) ? this.x : currentX; + this.y = (this.y) ? this.y : currentY; + this.w = (this.w) ? this.w : currentW; + this.h = (this.h) ? this.h : currentH; + + // how much do we need to modify our values for each step? + var difX = this.steps > 0 ? (this.x - currentX)/this.steps : 0; + var difY = this.steps > 0 ? (this.y - currentY)/this.steps : 0; + var difW = this.steps > 0 ? (this.w - currentW)/this.steps : 0; + var difH = this.steps > 0 ? (this.h - currentH)/this.steps : 0; + + this.moveBy(difX, difY); + this.resizeBy(difW, difH); + + this.duration -= stepDuration; + this.steps--; + + this.timer = setTimeout(this.sizeAndPosition.bind(this), stepDuration); + }, + + isFinished: function() { + return this.steps <= 0; + }, + + moveBy: function( difX, difY ) { + var currentLeft = this.element.offsetLeft; + var currentTop = this.element.offsetTop; + var intDifX = parseInt(difX); + var intDifY = parseInt(difY); + + var style = this.element.style; + if ( intDifX != 0 ) + style.left = (currentLeft + intDifX) + "px"; + if ( intDifY != 0 ) + style.top = (currentTop + intDifY) + "px"; + }, + + resizeBy: function( difW, difH ) { + var currentWidth = this.element.offsetWidth; + var currentHeight = this.element.offsetHeight; + var intDifW = parseInt(difW); + var intDifH = parseInt(difH); + + var style = this.element.style; + if ( intDifW != 0 ) + style.width = (currentWidth + intDifW) + "px"; + if ( intDifH != 0 ) + style.height = (currentHeight + intDifH) + "px"; + } +} + +Effect.Size = Class.create(); +Effect.Size.prototype = { + + initialize: function(element, w, h, duration, steps, options) { + new Effect.SizeAndPosition(element, null, null, w, h, duration, steps, options); + } +} + +Effect.Position = Class.create(); +Effect.Position.prototype = { + + initialize: function(element, x, y, duration, steps, options) { + new Effect.SizeAndPosition(element, x, y, null, null, duration, steps, options); + } +} + +Effect.Round = Class.create(); +Effect.Round.prototype = { + + initialize: function(tagName, className, options) { + var elements = document.getElementsByTagAndClassName(tagName,className); + for ( var i = 0 ; i < elements.length ; i++ ) + Rico.Corner.round( elements[i], options ); + } +}; + +Effect.FadeTo = Class.create(); +Effect.FadeTo.prototype = { + + initialize: function( element, opacity, duration, steps, options) { + this.element = $(element); + this.opacity = opacity; + this.duration = duration; + this.steps = steps; + this.options = arguments[4] || {}; + this.fadeTo(); + }, + + fadeTo: function() { + if (this.isFinished()) { + if(this.options.complete) this.options.complete(this); + return; + } + + if (this.timer) + clearTimeout(this.timer); + + var stepDuration = Math.round(this.duration/this.steps) ; + var currentOpacity = this.getElementOpacity(); + var delta = this.steps > 0 ? (this.opacity - currentOpacity)/this.steps : 0; + + this.changeOpacityBy(delta); + this.duration -= stepDuration; + this.steps--; + + this.timer = setTimeout(this.fadeTo.bind(this), stepDuration); + }, + + changeOpacityBy: function(v) { + var currentOpacity = this.getElementOpacity(); + var newOpacity = Math.max(0, Math.min(currentOpacity+v, 1)); + this.element.ricoOpacity = newOpacity; + + this.element.style.filter = "alpha(opacity:"+Math.round(newOpacity*100)+")"; + this.element.style.opacity = newOpacity; /*//*/; + }, + + isFinished: function() { + return this.steps <= 0; + }, + + getElementOpacity: function() { + if ( this.element.ricoOpacity == undefined ) { + var opacity; + if ( this.element.currentStyle ) { + opacity = this.element.currentStyle.opacity; + } + else if ( document.defaultView.getComputedStyle != undefined ) { + var computedStyle = document.defaultView.getComputedStyle; + opacity = computedStyle(this.element, null).getPropertyValue('opacity'); + } + + this.element.ricoOpacity = opacity != undefined ? opacity : 1.0; + } + + return parseFloat(this.element.ricoOpacity); + } +} + +Effect.AccordionSize = Class.create(); + +Effect.AccordionSize.prototype = { + + initialize: function(e1, e2, start, end, duration, steps, options) { + this.e1 = $(e1); + this.e2 = $(e2); + this.start = start; + this.end = end; + this.duration = duration; + this.steps = steps; + this.options = arguments[6] || {}; + + this.accordionSize(); + }, + + accordionSize: function() { + + if (this.isFinished()) { + // just in case there are round errors or such... + this.e1.style.height = this.start + "px"; + this.e2.style.height = this.end + "px"; + + if(this.options.complete) + this.options.complete(this); + return; + } + + if (this.timer) + clearTimeout(this.timer); + + var stepDuration = Math.round(this.duration/this.steps) ; + + var diff = this.steps > 0 ? (parseInt(this.e1.offsetHeight) - this.start)/this.steps : 0; + this.resizeBy(diff); + + this.duration -= stepDuration; + this.steps--; + + this.timer = setTimeout(this.accordionSize.bind(this), stepDuration); + }, + + isFinished: function() { + return this.steps <= 0; + }, + + resizeBy: function(diff) { + var h1Height = this.e1.offsetHeight; + var h2Height = this.e2.offsetHeight; + var intDiff = parseInt(diff); + if ( diff != 0 ) { + this.e1.style.height = (h1Height - intDiff) + "px"; + this.e2.style.height = (h2Height + intDiff) + "px"; + } + } + +}; + + +//-------------------- ricoLiveGrid.js + +// Rico.LiveGridMetaData ----------------------------------------------------- + +Rico.LiveGridMetaData = Class.create(); + +Rico.LiveGridMetaData.prototype = { + + initialize: function( pageSize, totalRows, columnCount, options ) { + this.pageSize = pageSize; + this.totalRows = totalRows; + this.setOptions(options); + this.scrollArrowHeight = 16; + this.columnCount = columnCount; + }, + + setOptions: function(options) { + this.options = { + largeBufferSize : 7.0, // 7 pages + nearLimitFactor : 0.2 // 20% of buffer + }.extend(options || {}); + }, + + getPageSize: function() { + return this.pageSize; + }, + + getTotalRows: function() { + return this.totalRows; + }, + + setTotalRows: function(n) { + this.totalRows = n; + }, + + getLargeBufferSize: function() { + return parseInt(this.options.largeBufferSize * this.pageSize); + }, + + getLimitTolerance: function() { + return parseInt(this.getLargeBufferSize() * this.options.nearLimitFactor); + } +}; + +// Rico.LiveGridScroller ----------------------------------------------------- + +Rico.LiveGridScroller = Class.create(); + +Rico.LiveGridScroller.prototype = { + + initialize: function(liveGrid, viewPort) { + this.isIE = navigator.userAgent.toLowerCase().indexOf("msie") >= 0; + this.liveGrid = liveGrid; + this.metaData = liveGrid.metaData; + this.createScrollBar(); + this.scrollTimeout = null; + this.lastScrollPos = 0; + this.viewPort = viewPort; + this.rows = new Array(); + }, + + isUnPlugged: function() { + return this.scrollerDiv.onscroll == null; + }, + + plugin: function() { + this.scrollerDiv.onscroll = this.handleScroll.bindAsEventListener(this); + }, + + unplug: function() { + this.scrollerDiv.onscroll = null; + }, + + sizeIEHeaderHack: function() { + if ( !this.isIE ) return; + var headerTable = $(this.liveGrid.tableId + "_header"); + if ( headerTable ) + headerTable.rows[0].cells[0].style.width = + (headerTable.rows[0].cells[0].offsetWidth + 1) + "px"; + }, + + createScrollBar: function() { + var visibleHeight = this.liveGrid.viewPort.visibleHeight(); + // create the outer div... + this.scrollerDiv = document.createElement("div"); + var scrollerStyle = this.scrollerDiv.style; + scrollerStyle.borderRight = "1px solid #ababab"; // hard coded color!!! + scrollerStyle.position = "relative"; + scrollerStyle.left = this.isIE ? "-6px" : "-3px"; + scrollerStyle.width = "19px"; + scrollerStyle.height = visibleHeight + "px"; + scrollerStyle.overflow = "auto"; + + // create the inner div... + this.heightDiv = document.createElement("div"); + this.heightDiv.style.width = "1px"; + + this.heightDiv.style.height = parseInt(visibleHeight * + this.metaData.getTotalRows()/this.metaData.getPageSize()) + "px" ; + this.scrollerDiv.appendChild(this.heightDiv); + this.scrollerDiv.onscroll = this.handleScroll.bindAsEventListener(this); + + var table = this.liveGrid.table; + table.parentNode.parentNode.insertBefore( this.scrollerDiv, table.parentNode.nextSibling ); + }, + + updateSize: function() { + var table = this.liveGrid.table; + var visibleHeight = this.viewPort.visibleHeight(); + this.heightDiv.style.height = parseInt(visibleHeight * + this.metaData.getTotalRows()/this.metaData.getPageSize()) + "px"; + }, + + rowToPixel: function(rowOffset) { + return (rowOffset / this.metaData.getTotalRows()) * this.heightDiv.offsetHeight + }, + + moveScroll: function(rowOffset) { + this.scrollerDiv.scrollTop = this.rowToPixel(rowOffset); + if ( this.metaData.options.onscroll ) + this.metaData.options.onscroll( this.liveGrid, rowOffset ); + }, + + handleScroll: function() { + if ( this.scrollTimeout ) + clearTimeout( this.scrollTimeout ); + + var contentOffset = parseInt(this.scrollerDiv.scrollTop / this.viewPort.rowHeight); + this.liveGrid.requestContentRefresh(contentOffset); + this.viewPort.scrollTo(this.scrollerDiv.scrollTop); + + if ( this.metaData.options.onscroll ) + this.metaData.options.onscroll( this.liveGrid, contentOffset ); + + this.scrollTimeout = setTimeout( this.scrollIdle.bind(this), 1200 ); + }, + + scrollIdle: function() { + if ( this.metaData.options.onscrollidle ) + this.metaData.options.onscrollidle(); + } +}; + +// Rico.LiveGridBuffer ----------------------------------------------------- + +Rico.LiveGridBuffer = Class.create(); + +Rico.LiveGridBuffer.prototype = { + + initialize: function(metaData, viewPort) { + this.startPos = 0; + this.size = 0; + this.metaData = metaData; + this.rows = new Array(); + this.updateInProgress = false; + this.viewPort = viewPort; + this.maxBufferSize = metaData.getLargeBufferSize() * 2; + this.maxFetchSize = metaData.getLargeBufferSize(); + this.lastOffset = 0; + }, + + getBlankRow: function() { + if (!this.blankRow ) { + this.blankRow = new Array(); + for ( var i=0; i < this.metaData.columnCount ; i++ ) + this.blankRow[i] = " "; + } + return this.blankRow; + }, + + loadRows: function(ajaxResponse) { + var rowsElement = ajaxResponse.getElementsByTagName('rows')[0]; + this.updateUI = rowsElement.getAttribute("update_ui") == "true" + var newRows = new Array() + var trs = rowsElement.getElementsByTagName("tr"); + for ( var i=0 ; i < trs.length; i++ ) { + var row = newRows[i] = new Array(); + var cells = trs[i].getElementsByTagName("td"); + for ( var j=0; j < cells.length ; j++ ) { + var cell = cells[j]; + var convertSpaces = cell.getAttribute("convert_spaces") == "true"; + var cellContent = RicoUtil.getContentAsString(cell); + row[j] = convertSpaces ? this.convertSpaces(cellContent) : cellContent; + if (!row[j]) + row[j] = ' '; + } + } + return newRows; + }, + + update: function(ajaxResponse, start) { + var newRows = this.loadRows(ajaxResponse); + if (this.rows.length == 0) { // initial load + this.rows = newRows; + this.size = this.rows.length; + this.startPos = start; + return; + } + if (start > this.startPos) { //appending + if (this.startPos + this.rows.length < start) { + this.rows = newRows; + this.startPos = start;// + } else { + this.rows = this.rows.concat( newRows.slice(0, newRows.length)); + if (this.rows.length > this.maxBufferSize) { + var fullSize = this.rows.length; + this.rows = this.rows.slice(this.rows.length - this.maxBufferSize, this.rows.length) + this.startPos = this.startPos + (fullSize - this.rows.length); + } + } + } else { //prepending + if (start + newRows.length < this.startPos) { + this.rows = newRows; + } else { + this.rows = newRows.slice(0, this.startPos).concat(this.rows); + if (this.rows.length > this.maxBufferSize) + this.rows = this.rows.slice(0, this.maxBufferSize) + } + this.startPos = start; + } + this.size = this.rows.length; + }, + + clear: function() { + this.rows = new Array(); + this.startPos = 0; + this.size = 0; + }, + + isOverlapping: function(start, size) { + return ((start < this.endPos()) && (this.startPos < start + size)) || (this.endPos() == 0) + }, + + isInRange: function(position) { + return (position >= this.startPos) && (position + this.metaData.getPageSize() <= this.endPos()); + //&& this.size() != 0; + }, + + isNearingTopLimit: function(position) { + return position - this.startPos < this.metaData.getLimitTolerance(); + }, + + endPos: function() { + return this.startPos + this.rows.length; + }, + + isNearingBottomLimit: function(position) { + return this.endPos() - (position + this.metaData.getPageSize()) < this.metaData.getLimitTolerance(); + }, + + isAtTop: function() { + return this.startPos == 0; + }, + + isAtBottom: function() { + return this.endPos() == this.metaData.getTotalRows(); + }, + + isNearingLimit: function(position) { + return ( !this.isAtTop() && this.isNearingTopLimit(position)) || + ( !this.isAtBottom() && this.isNearingBottomLimit(position) ) + }, + + getFetchSize: function(offset) { + var adjustedOffset = this.getFetchOffset(offset); + var adjustedSize = 0; + if (adjustedOffset >= this.startPos) { //apending + var endFetchOffset = this.maxFetchSize + adjustedOffset; + if (endFetchOffset > this.metaData.totalRows) + endFetchOffset = this.metaData.totalRows; + adjustedSize = endFetchOffset - adjustedOffset; + } else {//prepending + var adjustedSize = this.startPos - adjustedOffset; + if (adjustedSize > this.maxFetchSize) + adjustedSize = this.maxFetchSize; + } + return adjustedSize; + }, + + getFetchOffset: function(offset) { + var adjustedOffset = offset; + if (offset > this.startPos) //apending + adjustedOffset = (offset > this.endPos()) ? offset : this.endPos(); + else { //prepending + if (offset + this.maxFetchSize >= this.startPos) { + var adjustedOffset = this.startPos - this.maxFetchSize; + if (adjustedOffset < 0) + adjustedOffset = 0; + } + } + this.lastOffset = adjustedOffset; + return adjustedOffset; + }, + + getRows: function(start, count) { + var begPos = start - this.startPos + var endPos = begPos + count + + // er? need more data... + if ( endPos > this.size ) + endPos = this.size + + var results = new Array() + var index = 0; + for ( var i=begPos ; i < endPos; i++ ) { + results[index++] = this.rows[i] + } + return results + }, + + convertSpaces: function(s) { + return s.split(" ").join(" "); + } + +}; + + +//Rico.GridViewPort -------------------------------------------------- +Rico.GridViewPort = Class.create(); + +Rico.GridViewPort.prototype = { + + initialize: function(table, rowHeight, visibleRows, buffer, liveGrid) { + this.lastDisplayedStartPos = 0; + this.div = table.parentNode; + this.table = table + this.rowHeight = rowHeight; + this.div.style.height = this.rowHeight * visibleRows; + this.div.style.overflow = "hidden"; + this.buffer = buffer; + this.liveGrid = liveGrid; + this.visibleRows = visibleRows + 1; + this.lastPixelOffset = 0; + this.startPos = 0; + }, + + populateRow: function(htmlRow, row) { + for (var j=0; j < row.length; j++) { + htmlRow.cells[j].innerHTML = row[j] + } + }, + + bufferChanged: function() { + this.refreshContents( parseInt(this.lastPixelOffset / this.rowHeight)); + }, + + clearRows: function() { + if (!this.isBlank) { + for (var i=0; i < this.visibleRows; i++) + this.populateRow(this.table.rows[i], this.buffer.getBlankRow()); + this.isBlank = true; + } + }, + + clearContents: function() { + this.clearRows(); + this.scrollTo(0); + this.startPos = 0; + this.lastStartPos = -1; + }, + + refreshContents: function(startPos) { + if (startPos == this.lastRowPos && !this.isPartialBlank && !this.isBlank) { + return; + } + if ((startPos + this.visibleRows < this.buffer.startPos) + || (this.buffer.startPos + this.buffer.size < startPos) + || (this.buffer.size == 0)) { + this.clearRows(); + return; + } + this.isBlank = false; + var viewPrecedesBuffer = this.buffer.startPos > startPos + var contentStartPos = viewPrecedesBuffer ? this.buffer.startPos: startPos; + + var contentEndPos = (this.buffer.startPos + this.buffer.size < startPos + this.visibleRows) + ? this.buffer.startPos + this.buffer.size + : startPos + this.visibleRows; + var rowSize = contentEndPos - contentStartPos; + var rows = this.buffer.getRows(contentStartPos, rowSize ); + var blankSize = this.visibleRows - rowSize; + var blankOffset = viewPrecedesBuffer ? 0: rowSize; + var contentOffset = viewPrecedesBuffer ? blankSize: 0; + + for (var i=0; i < rows.length; i++) {//initialize what we have + this.populateRow(this.table.rows[i + contentOffset], rows[i]); + } + for (var i=0; i < blankSize; i++) {// blank out the rest + this.populateRow(this.table.rows[i + blankOffset], this.buffer.getBlankRow()); + } + this.isPartialBlank = blankSize > 0; + this.lastRowPos = startPos; + }, + + scrollTo: function(pixelOffset) { + if (this.lastPixelOffset == pixelOffset) + return; + + this.refreshContents(parseInt(pixelOffset / this.rowHeight)) + this.div.scrollTop = pixelOffset % this.rowHeight + + this.lastPixelOffset = pixelOffset; + }, + + visibleHeight: function() { + return parseInt(this.div.style.height); + } + +}; + + +Rico.LiveGridRequest = Class.create(); +Rico.LiveGridRequest.prototype = { + initialize: function( requestOffset, options ) { + this.requestOffset = requestOffset; + } +}; + +// Rico.LiveGrid ----------------------------------------------------- + +Rico.LiveGrid = Class.create(); + +Rico.LiveGrid.prototype = { + + initialize: function( tableId, visibleRows, totalRows, url, options ) { + if ( options == null ) + options = {}; + + this.tableId = tableId; + this.table = $(tableId); + var columnCount = this.table.rows[0].cells.length + this.metaData = new Rico.LiveGridMetaData(visibleRows, totalRows, columnCount, options); + this.buffer = new Rico.LiveGridBuffer(this.metaData); + + var rowCount = this.table.rows.length; + this.viewPort = new Rico.GridViewPort(this.table, + this.table.offsetHeight/rowCount, + visibleRows, + this.buffer, this); + this.scroller = new Rico.LiveGridScroller(this,this.viewPort); + + this.additionalParms = options.requestParameters || []; + + options.sortHandler = this.sortHandler.bind(this); + + if ( $(tableId + '_header') ) + this.sort = new Rico.LiveGridSort(tableId + '_header', options) + + this.processingRequest = null; + this.unprocessedRequest = null; + + this.initAjax(url); + if ( options.prefetchBuffer || options.prefetchOffset > 0) { + var offset = 0; + if (options.offset ) { + offset = options.offset; + this.scroller.moveScroll(offset); + this.viewPort.scrollTo(this.scroller.rowToPixel(offset)); + } + if (options.sortCol) { + this.sortCol = options.sortCol; + this.sortDir = options.sortDir; + } + this.requestContentRefresh(offset); + } + }, + + resetContents: function() { + this.scroller.moveScroll(0); + this.buffer.clear(); + this.viewPort.clearContents(); + }, + + sortHandler: function(column) { + this.sortCol = column.name; + this.sortDir = column.currentSort; + + this.resetContents(); + this.requestContentRefresh(0) + }, + + setRequestParams: function() { + this.additionalParms = []; + for ( var i=0 ; i < arguments.length ; i++ ) + this.additionalParms[i] = arguments[i]; + }, + + setTotalRows: function( newTotalRows ) { + this.resetContents(); + this.metaData.setTotalRows(newTotalRows); + this.scroller.updateSize(); + }, + + initAjax: function(url) { + ajaxEngine.registerRequest( this.tableId + '_request', url ); + ajaxEngine.registerAjaxObject( this.tableId + '_updater', this ); + }, + + invokeAjax: function() { + }, + + handleTimedOut: function() { + //server did not respond in 4 seconds... assume that there could have been + //an error or something, and allow requests to be processed again... + this.processingRequest = null; + this.processQueuedRequest(); + }, + + fetchBuffer: function(offset) { + if ( this.buffer.isInRange(offset) && + !this.buffer.isNearingLimit(offset)) { + return; + } + if (this.processingRequest) { + this.unprocessedRequest = new Rico.LiveGridRequest(offset); + return; + } + var bufferStartPos = this.buffer.getFetchOffset(offset); + this.processingRequest = new Rico.LiveGridRequest(offset); + this.processingRequest.bufferOffset = bufferStartPos; + var fetchSize = this.buffer.getFetchSize(offset); + var partialLoaded = false; + var callParms = []; + callParms.push(this.tableId + '_request'); + callParms.push('id=' + this.tableId); + callParms.push('page_size=' + fetchSize); + callParms.push('offset=' + bufferStartPos); + if ( this.sortCol) { + callParms.push('sort_col=' + this.sortCol); + callParms.push('sort_dir=' + this.sortDir); + } + + for( var i=0 ; i < this.additionalParms.length ; i++ ) + callParms.push(this.additionalParms[i]); + ajaxEngine.sendRequest.apply( ajaxEngine, callParms ); + + this.timeoutHandler = setTimeout( this.handleTimedOut.bind(this), 20000 ); //todo: make as option + }, + + requestContentRefresh: function(contentOffset) { + this.fetchBuffer(contentOffset); + }, + + ajaxUpdate: function(ajaxResponse) { + try { + clearTimeout( this.timeoutHandler ); + this.buffer.update(ajaxResponse,this.processingRequest.bufferOffset); + this.viewPort.bufferChanged(); + } + catch(err) {} + finally {this.processingRequest = null; } + this.processQueuedRequest(); + }, + + processQueuedRequest: function() { + if (this.unprocessedRequest != null) { + this.requestContentRefresh(this.unprocessedRequest.requestOffset); + this.unprocessedRequest = null + } + } + +}; + + +//-------------------- ricoLiveGridSort.js +Rico.LiveGridSort = Class.create(); + +Rico.LiveGridSort.prototype = { + + initialize: function(headerTableId, options) { + this.headerTableId = headerTableId; + this.headerTable = $(headerTableId); + this.setOptions(options); + this.applySortBehavior(); + + if ( this.options.sortCol ) { + this.setSortUI( this.options.sortCol, this.options.sortDir ); + } + }, + + setSortUI: function( columnName, sortDirection ) { + var cols = this.options.columns; + for ( var i = 0 ; i < cols.length ; i++ ) { + if ( cols[i].name == columnName ) { + this.setColumnSort(i, sortDirection); + break; + } + } + }, + + setOptions: function(options) { + this.options = { + sortAscendImg: 'images/sort_asc.gif', + sortDescendImg: 'images/sort_desc.gif', + imageWidth: 9, + imageHeight: 5, + ajaxSortURLParms: [] + }.extend(options); + + // preload the images... + new Image().src = this.options.sortAscendImg; + new Image().src = this.options.sortDescendImg; + + this.sort = options.sortHandler; + if ( !this.options.columns ) + this.options.columns = this.introspectForColumnInfo(); + else { + // allow client to pass { columns: [ ["a", true], ["b", false] ] } + // and convert to an array of Rico.TableColumn objs... + this.options.columns = this.convertToTableColumns(this.options.columns); + } + }, + + applySortBehavior: function() { + var headerRow = this.headerTable.rows[0]; + var headerCells = headerRow.cells; + for ( var i = 0 ; i < headerCells.length ; i++ ) { + this.addSortBehaviorToColumn( i, headerCells[i] ); + } + }, + + addSortBehaviorToColumn: function( n, cell ) { + if ( this.options.columns[n].isSortable() ) { + cell.id = this.headerTableId + '_' + n; + cell.style.cursor = 'pointer'; + cell.onclick = this.headerCellClicked.bindAsEventListener(this); + cell.innerHTML = cell.innerHTML + '' + + '   '; + } + }, + + // event handler.... + headerCellClicked: function(evt) { + var eventTarget = evt.target ? evt.target : evt.srcElement; + var cellId = eventTarget.id; + var columnNumber = parseInt(cellId.substring( cellId.lastIndexOf('_') + 1 )); + var sortedColumnIndex = this.getSortedColumnIndex(); + if ( sortedColumnIndex != -1 ) { + if ( sortedColumnIndex != columnNumber ) { + this.removeColumnSort(sortedColumnIndex); + this.setColumnSort(columnNumber, Rico.TableColumn.SORT_ASC); + } + else + this.toggleColumnSort(sortedColumnIndex); + } + else + this.setColumnSort(columnNumber, Rico.TableColumn.SORT_ASC); + + if (this.options.sortHandler) { + this.options.sortHandler(this.options.columns[columnNumber]); + } + }, + + removeColumnSort: function(n) { + this.options.columns[n].setUnsorted(); + this.setSortImage(n); + }, + + setColumnSort: function(n, direction) { + this.options.columns[n].setSorted(direction); + this.setSortImage(n); + }, + + toggleColumnSort: function(n) { + this.options.columns[n].toggleSort(); + this.setSortImage(n); + }, + + setSortImage: function(n) { + var sortDirection = this.options.columns[n].getSortDirection(); + + var sortImageSpan = $( this.headerTableId + '_img_' + n ); + if ( sortDirection == Rico.TableColumn.UNSORTED ) + sortImageSpan.innerHTML = '  '; + else if ( sortDirection == Rico.TableColumn.SORT_ASC ) + sortImageSpan.innerHTML = '  '; + else if ( sortDirection == Rico.TableColumn.SORT_DESC ) + sortImageSpan.innerHTML = '  '; + }, + + getSortedColumnIndex: function() { + var cols = this.options.columns; + for ( var i = 0 ; i < cols.length ; i++ ) { + if ( cols[i].isSorted() ) + return i; + } + + return -1; + }, + + introspectForColumnInfo: function() { + var columns = new Array(); + var headerRow = this.headerTable.rows[0]; + var headerCells = headerRow.cells; + for ( var i = 0 ; i < headerCells.length ; i++ ) + columns.push( new Rico.TableColumn( this.deriveColumnNameFromCell(headerCells[i],i), true ) ); + return columns; + }, + + convertToTableColumns: function(cols) { + var columns = new Array(); + for ( var i = 0 ; i < cols.length ; i++ ) + columns.push( new Rico.TableColumn( cols[i][0], cols[i][1] ) ); + }, + + deriveColumnNameFromCell: function(cell,columnNumber) { + var cellContent = cell.innerText != undefined ? cell.innerText : cell.textContent; + return cellContent ? cellContent.toLowerCase().split(' ').join('_') : "col_" + columnNumber; + } +}; + +Rico.TableColumn = Class.create(); + +Rico.TableColumn.UNSORTED = 0; +Rico.TableColumn.SORT_ASC = "ASC"; +Rico.TableColumn.SORT_DESC = "DESC"; + +Rico.TableColumn.prototype = { + initialize: function(name, sortable) { + this.name = name; + this.sortable = sortable; + this.currentSort = Rico.TableColumn.UNSORTED; + }, + + isSortable: function() { + return this.sortable; + }, + + isSorted: function() { + return this.currentSort != Rico.TableColumn.UNSORTED; + }, + + getSortDirection: function() { + return this.currentSort; + }, + + toggleSort: function() { + if ( this.currentSort == Rico.TableColumn.UNSORTED || this.currentSort == Rico.TableColumn.SORT_DESC ) + this.currentSort = Rico.TableColumn.SORT_ASC; + else if ( this.currentSort == Rico.TableColumn.SORT_ASC ) + this.currentSort = Rico.TableColumn.SORT_DESC; + }, + + setUnsorted: function(direction) { + this.setSorted(Rico.TableColumn.UNSORTED); + }, + + setSorted: function(direction) { + // direction must by one of Rico.TableColumn.UNSORTED, .SORT_ASC, or .SET_DESC... + this.currentSort = direction; + } + +}; + + +//-------------------- ricoUtil.js + +var RicoUtil = { + + getElementsComputedStyle: function ( htmlElement, cssProperty, mozillaEquivalentCSS) { + if ( arguments.length == 2 ) + mozillaEquivalentCSS = cssProperty; + + var el = $(htmlElement); + if ( el.currentStyle ) + return el.currentStyle[cssProperty]; + else + return document.defaultView.getComputedStyle(el, null).getPropertyValue(mozillaEquivalentCSS); + }, + + createXmlDocument : function() { + if (document.implementation && document.implementation.createDocument) { + var doc = document.implementation.createDocument("", "", null); + + if (doc.readyState == null) { + doc.readyState = 1; + doc.addEventListener("load", function () { + doc.readyState = 4; + if (typeof doc.onreadystatechange == "function") + doc.onreadystatechange(); + }, false); + } + + return doc; + } + + if (window.ActiveXObject) + return Try.these( + function() { return new ActiveXObject('MSXML2.DomDocument') }, + function() { return new ActiveXObject('Microsoft.DomDocument')}, + function() { return new ActiveXObject('MSXML.DomDocument') }, + function() { return new ActiveXObject('MSXML3.DomDocument') } + ) || false; + + return null; + }, + + getContentAsString: function( parentNode ) { + return parentNode.xml != undefined ? + this._getContentAsStringIE(parentNode) : + this._getContentAsStringMozilla(parentNode); + }, + + _getContentAsStringIE: function(parentNode) { + var contentStr = ""; + for ( var i = 0 ; i < parentNode.childNodes.length ; i++ ) + contentStr += parentNode.childNodes[i].xml; + return contentStr; + }, + + _getContentAsStringMozilla: function(parentNode) { + var xmlSerializer = new XMLSerializer(); + var contentStr = ""; + for ( var i = 0 ; i < parentNode.childNodes.length ; i++ ) + contentStr += xmlSerializer.serializeToString(parentNode.childNodes[i]); + return contentStr; + }, + + toViewportPosition: function(element) { + return this._toAbsolute(element,true); + }, + + toDocumentPosition: function(element) { + return this._toAbsolute(element,false); + }, + + /** + * Compute the elements position in terms of the window viewport + * so that it can be compared to the position of the mouse (dnd) + * This is additions of all the offsetTop,offsetLeft values up the + * offsetParent hierarchy, ...taking into account any scrollTop, + * scrollLeft values along the way... + * + * IE has a bug reporting a correct offsetLeft of elements within a + * a relatively positioned parent!!! + **/ + _toAbsolute: function(element,accountForDocScroll) { + + if ( navigator.userAgent.toLowerCase().indexOf("msie") == -1 ) + return this._toAbsoluteMozilla(element,accountForDocScroll); + + var x = 0; + var y = 0; + var parent = element; + while ( parent ) { + + var borderXOffset = 0; + var borderYOffset = 0; + if ( parent != element ) { + var borderXOffset = parseInt(this.getElementsComputedStyle(parent, "borderLeftWidth" )); + var borderYOffset = parseInt(this.getElementsComputedStyle(parent, "borderTopWidth" )); + borderXOffset = isNaN(borderXOffset) ? 0 : borderXOffset; + borderYOffset = isNaN(borderYOffset) ? 0 : borderYOffset; + } + + x += parent.offsetLeft - parent.scrollLeft + borderXOffset; + y += parent.offsetTop - parent.scrollTop + borderYOffset; + parent = parent.offsetParent; + } + + if ( accountForDocScroll ) { + x -= this.docScrollLeft(); + y -= this.docScrollTop(); + } + + return { x:x, y:y }; + }, + + /** + * Mozilla did not report all of the parents up the hierarchy via the + * offsetParent property that IE did. So for the calculation of the + * offsets we use the offsetParent property, but for the calculation of + * the scrollTop/scrollLeft adjustments we navigate up via the parentNode + * property instead so as to get the scroll offsets... + * + **/ + _toAbsoluteMozilla: function(element,accountForDocScroll) { + var x = 0; + var y = 0; + var parent = element; + while ( parent ) { + x += parent.offsetLeft; + y += parent.offsetTop; + parent = parent.offsetParent; + } + + parent = element; + while ( parent && + parent != document.body && + parent != document.documentElement ) { + if ( parent.scrollLeft ) + x -= parent.scrollLeft; + if ( parent.scrollTop ) + y -= parent.scrollTop; + parent = parent.parentNode; + } + + if ( accountForDocScroll ) { + x -= this.docScrollLeft(); + y -= this.docScrollTop(); + } + + return { x:x, y:y }; + }, + + docScrollLeft: function() { + if ( window.pageXOffset ) + return window.pageXOffset; + else if ( document.documentElement && document.documentElement.scrollLeft ) + return document.documentElement.scrollLeft; + else if ( document.body ) + return document.body.scrollLeft; + else + return 0; + }, + + docScrollTop: function() { + if ( window.pageYOffset ) + return window.pageYOffset; + else if ( document.documentElement && document.documentElement.scrollTop ) + return document.documentElement.scrollTop; + else if ( document.body ) + return document.body.scrollTop; + else + return 0; + } + +}; diff --git a/web-app/js/prototype/scriptaculous.js b/web-app/js/prototype/scriptaculous.js new file mode 100644 index 0000000..6bf437a --- /dev/null +++ b/web-app/js/prototype/scriptaculous.js @@ -0,0 +1,68 @@ +// script.aculo.us scriptaculous.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 + +// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +// For details, see the script.aculo.us web site: http://script.aculo.us/ + +var Scriptaculous = { + Version: '1.8.3', + require: function(libraryName) { + try{ + // inserting via DOM fails in Safari 2.0, so brute force approach + document.write('