Revert "Remove Spring JavaScript library"
This reverts commit 4d59b21e49.
Issue: SWF-1693
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -26,4 +26,5 @@ out
|
||||
gradle-app.setting
|
||||
spring-binding/src/main/java/META-INF/
|
||||
spring-faces/src/main/java/META-INF/
|
||||
spring-js-resources/src/main/java/META-INF/
|
||||
spring-webflow/src/main/java/META-INF/
|
||||
|
||||
15
build.gradle
15
build.gradle
@@ -45,6 +45,10 @@ subprojects { subproject ->
|
||||
expand(copyright: new Date().format("yyyy"), version: project.version)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
configure(subprojects.findAll {
|
||||
it.name != "spring-build-src" && it.name != "spring-js-resources"}) { subproject ->
|
||||
|
||||
if (project.hasProperty('platformVersion')) {
|
||||
apply plugin: 'spring-io'
|
||||
@@ -131,7 +135,6 @@ subprojects { subproject ->
|
||||
|
||||
project("spring-binding") {
|
||||
description = "Spring Binding"
|
||||
|
||||
}
|
||||
|
||||
project("spring-webflow") {
|
||||
@@ -188,6 +191,16 @@ project("spring-faces") {
|
||||
}
|
||||
}
|
||||
|
||||
project("spring-js-resources") {
|
||||
description = "Spring JS Resources"
|
||||
|
||||
apply from: "spring-js-resources.gradle"
|
||||
|
||||
jar {
|
||||
dependsOn prepareResources
|
||||
}
|
||||
}
|
||||
|
||||
configure(rootProject) {
|
||||
description = "Spring Web Flow"
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
rootProject.name = 'webflow'
|
||||
|
||||
include 'spring-binding'
|
||||
include 'spring-faces'
|
||||
include 'spring-webflow'
|
||||
include 'spring-faces'
|
||||
include 'spring-js-resources'
|
||||
|
||||
3
spring-js-resources/dojo-build/README.txt
Normal file
3
spring-js-resources/dojo-build/README.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
|
||||
This directory contains the custom build of Dojo that distributed with Spring JavaScript.
|
||||
See ../scripts/dojo/README.txt for details.
|
||||
BIN
spring-js-resources/dojo-build/dojo-build.zip
Normal file
BIN
spring-js-resources/dojo-build/dojo-build.zip
Normal file
Binary file not shown.
15
spring-js-resources/scripts/dojo/README.txt
Normal file
15
spring-js-resources/scripts/dojo/README.txt
Normal file
@@ -0,0 +1,15 @@
|
||||
|
||||
Use the script in this directory to upgrade the version of Dojo bundled with spring-js.
|
||||
|
||||
Upgrade procedures:
|
||||
1) Open build.properties and modify the dojo.version property
|
||||
2) Run 'ant clean' from this directory
|
||||
3) Run 'ant'
|
||||
4) Commit changes in build-spring-js/dojo-build directory
|
||||
|
||||
Notes:
|
||||
Step 3) above creates a dojo-build.zip and copies it to build-spring-js/dojo-build.
|
||||
The file dojo-build.zip is then used during the spring-js build to bundle Dojo.
|
||||
|
||||
|
||||
|
||||
4
spring-js-resources/scripts/dojo/build.properties
Normal file
4
spring-js-resources/scripts/dojo/build.properties
Normal file
@@ -0,0 +1,4 @@
|
||||
|
||||
dojo.version=1.5.0
|
||||
dojo.download.url=http://download.dojotoolkit.org/release-${dojo.version}/dojo-release-${dojo.version}-src.zip
|
||||
dojo.profile=standard.profile.js
|
||||
51
spring-js-resources/scripts/dojo/build.xml
Normal file
51
spring-js-resources/scripts/dojo/build.xml
Normal file
@@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project name="dojo-build" default="build-and-copy">
|
||||
|
||||
<target name="init">
|
||||
<property file="build.properties"/>
|
||||
<property name="target.dir" value="${basedir}/target"/>
|
||||
<property name="source.dir" value="${target.dir}/dojo-release-${dojo.version}-src"/>
|
||||
<property name="buildscripts.dir" value="${source.dir}/util/buildscripts"/>
|
||||
<property name="build.dir" value="${target.dir}/dojo-build"/>
|
||||
</target>
|
||||
|
||||
<target name="clean" depends="init">
|
||||
<delete dir="${target.dir}"/>
|
||||
</target>
|
||||
|
||||
<target name="download" depends="init" description="Download and unzip the Dojo Toolkit">
|
||||
|
||||
<mkdir dir="${target.dir}"/>
|
||||
|
||||
<get src="${dojo.download.url}" usetimestamp="true"
|
||||
dest="${target.dir}/dojo-release-${dojo.version}-src.zip" />
|
||||
|
||||
<unzip src="${target.dir}/dojo-release-${dojo.version}-src.zip" dest="${source.dir}">
|
||||
<mapper type="glob" from="dojo-release-${dojo.version}-src/*" to="*"/>
|
||||
</unzip>
|
||||
|
||||
</target>
|
||||
|
||||
<target name="build-and-copy" depends="download" description="Prepare Dojo build optimized for use with spring-js">
|
||||
|
||||
<chmod file="${buildscripts.dir}/build.sh" perm="ugo+rx"/>
|
||||
|
||||
<exec executable="${buildscripts.dir}/build.sh" dir="${buildscripts.dir}/">
|
||||
<arg line="releaseDir=${build.dir}"/>
|
||||
<arg line="profileFile=${basedir}/${dojo.profile}"/>
|
||||
<arg line="releaseName="/>
|
||||
<arg line="copyTests=false"/>
|
||||
<arg line="action=release"/>
|
||||
<arg line="optimize=shrinksafe.keepLines"/>
|
||||
<arg line="cssOptimize=comments.keepLines"/>
|
||||
<arg line="cssImportIgnore=../dijit.css"/>
|
||||
</exec>
|
||||
|
||||
<zip destfile="${target.dir}/dojo-build.zip" basedir="${build.dir}"/>
|
||||
|
||||
<copy file="${target.dir}/dojo-build.zip"
|
||||
toFile="${basedir}/../../../spring-js/dojo-build/dojo-build.zip" />
|
||||
|
||||
</target>
|
||||
|
||||
</project>
|
||||
77
spring-js-resources/scripts/dojo/standard.profile.js
Normal file
77
spring-js-resources/scripts/dojo/standard.profile.js
Normal file
@@ -0,0 +1,77 @@
|
||||
dependencies ={
|
||||
//Strip all console.* calls except console.warn and console.error. This is basically a work-around
|
||||
//for trac issue: http://bugs.dojotoolkit.org/ticket/6849 where Safari 3's console.debug seems
|
||||
//to be flaky to set up (apparently fixed in a webkit nightly).
|
||||
//But in general for a build, console.warn/error should be the only things to survive anyway.
|
||||
stripConsole: "normal",
|
||||
|
||||
layers: [
|
||||
{
|
||||
name: "dojo.js",
|
||||
dependencies: [
|
||||
"dijit.Dialog",
|
||||
"dijit.form.CurrencyTextBox",
|
||||
"dijit.form.DateTextBox"
|
||||
]
|
||||
},
|
||||
|
||||
// Now add layers from Dojo's standard.profile.js:
|
||||
// http://svn.dojotoolkit.org/src/util/trunk/buildscripts/profiles/standard.profile.js
|
||||
|
||||
{
|
||||
name: "../dijit/dijit.js",
|
||||
dependencies: [
|
||||
"dijit.dijit"
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "../dijit/dijit-all.js",
|
||||
layerDependencies: [
|
||||
"../dijit/dijit.js"
|
||||
],
|
||||
dependencies: [
|
||||
"dijit.dijit-all"
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "../dojox/grid/DataGrid.js",
|
||||
dependencies: [
|
||||
"dojox.grid.DataGrid"
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "../dojox/gfx.js",
|
||||
dependencies: [
|
||||
"dojox.gfx"
|
||||
]
|
||||
},
|
||||
// FIXME:
|
||||
// we probably need a better structure for this layer and need to
|
||||
// add some of the most common themes
|
||||
{
|
||||
name: "../dojox/charting/widget/Chart2D.js",
|
||||
dependencies: [
|
||||
"dojox.charting.widget.Chart2D",
|
||||
"dojox.charting.widget.Sparkline",
|
||||
"dojox.charting.widget.Legend"
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "../dojox/dtl.js",
|
||||
dependencies: [
|
||||
"dojox.dtl",
|
||||
"dojox.dtl.Context",
|
||||
"dojox.dtl.tag.logic",
|
||||
"dojox.dtl.tag.loop",
|
||||
"dojox.dtl.tag.date",
|
||||
"dojox.dtl.tag.loader",
|
||||
"dojox.dtl.tag.misc",
|
||||
"dojox.dtl.ext-dojo.NodeList"
|
||||
]
|
||||
}
|
||||
],
|
||||
prefixes: [
|
||||
[ "dijit", "../dijit" ],
|
||||
[ "dojox", "../dojox" ]
|
||||
]
|
||||
};
|
||||
42
spring-js-resources/spring-js-resources.gradle
Normal file
42
spring-js-resources/spring-js-resources.gradle
Normal file
@@ -0,0 +1,42 @@
|
||||
configurations {
|
||||
shrinksafe
|
||||
}
|
||||
|
||||
dependencies {
|
||||
shrinksafe "org.dojotoolkit:dojo-shrinksafe:1.7.2"
|
||||
}
|
||||
|
||||
task prepareResources(type: Jar) { jar ->
|
||||
doLast() {
|
||||
minify("Spring.js")
|
||||
minify("Spring-Dojo.js")
|
||||
ant.unzip(src: "${projectDir}/dojo-build/dojo-build.zip",
|
||||
dest: "${buildDir}/resources/main/META-INF/web-resources")
|
||||
}
|
||||
}
|
||||
|
||||
void minify(fileName) {
|
||||
|
||||
project.ant {
|
||||
def sourceDir = "${basedir}/src/main/resources/META-INF/web-resources/spring/"
|
||||
def outputDir = "${buildDir}/resources/main/META-INF/web-resources/spring/"
|
||||
|
||||
copy(file: "${outputDir}/${fileName}", tofile: "${outputDir}/${fileName}.uncompressed.js")
|
||||
|
||||
java(classname: "org.dojotoolkit.shrinksafe.Main",
|
||||
classpath: configurations.shrinksafe.asPath, fork: true,
|
||||
output: "${outputDir}/${fileName}.TMP.js") {
|
||||
arg(value: "${sourceDir}/${fileName}")
|
||||
}
|
||||
|
||||
move(file: "${outputDir}/${fileName}.TMP.js", toFile: "${outputDir}/${fileName}") {
|
||||
filterchain {
|
||||
filterreader(classname: "org.apache.tools.ant.filters.StripLineBreaks")
|
||||
}
|
||||
filterchain {
|
||||
concatfilter(prepend: "${basedir}/../src/dist/javascript-copyright.txt")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
0
spring-js-resources/src/main/java/.gitignore
vendored
Normal file
0
spring-js-resources/src/main/java/.gitignore
vendored
Normal file
@@ -0,0 +1,134 @@
|
||||
/*
|
||||
A CSS Framework by Mike Stenhouse of Content with Style
|
||||
-------------------------------------------------------
|
||||
|
||||
Copyright (c) 2005, Mike Stenhouse of Content with Style
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/* FORM ELEMENTS */
|
||||
form {
|
||||
margin:0;
|
||||
padding:0;
|
||||
}
|
||||
form div,
|
||||
form p {
|
||||
margin: 0 0 1em 0;
|
||||
padding: 0;
|
||||
|
||||
font-size: 1em;
|
||||
}
|
||||
label {
|
||||
font-weight: bold;
|
||||
}
|
||||
fieldset {
|
||||
padding: 5px 10px;
|
||||
margin: 0 0 1.5em 0;
|
||||
|
||||
border: 1px solid #eee;
|
||||
}
|
||||
fieldset legend {
|
||||
margin: 0 0 0 0px;
|
||||
padding: 0;
|
||||
|
||||
font-size: 1.1em;
|
||||
font-weight: bold;
|
||||
|
||||
color: #666;
|
||||
background-color: white;
|
||||
}
|
||||
* html fieldset legend {
|
||||
margin: 0 0 10px -10px;
|
||||
}
|
||||
fieldset ul {
|
||||
margin: 0 0 1.5em 0;
|
||||
padding: 0;
|
||||
|
||||
list-style: none;
|
||||
}
|
||||
fieldset ul li {
|
||||
margin: 0 0 0.5em 0;
|
||||
padding: 0;
|
||||
|
||||
list-style: none;
|
||||
}
|
||||
input, select, textarea {
|
||||
margin: 0;
|
||||
padding: 2px;
|
||||
|
||||
font-size: 1em;
|
||||
font-family: arial, helvetica, verdana, sans-serif;
|
||||
}
|
||||
|
||||
input, select {
|
||||
vertical-align: middle;
|
||||
}
|
||||
textarea {
|
||||
width: 200px;
|
||||
height: 8em;
|
||||
}
|
||||
|
||||
input.check {
|
||||
width: auto;
|
||||
height: auto;
|
||||
|
||||
margin: 0;
|
||||
|
||||
border: none;
|
||||
}
|
||||
input.radio {
|
||||
width: auto;
|
||||
|
||||
height: auto;
|
||||
margin: 0;
|
||||
|
||||
border: none;
|
||||
}
|
||||
input.file {
|
||||
width: 250px;
|
||||
height: auto;
|
||||
}
|
||||
input.readonly {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
}
|
||||
input.button {
|
||||
width: 10em;
|
||||
|
||||
background-color: #ddd;
|
||||
border: 1px solid black;
|
||||
}
|
||||
input.image {
|
||||
width: auto;
|
||||
height: auto;
|
||||
|
||||
border: none;
|
||||
}
|
||||
|
||||
form div.submit {
|
||||
margin: 1em 0;
|
||||
}
|
||||
form div.submit input {
|
||||
width: 15em;
|
||||
height: 2em;
|
||||
}
|
||||
/* END FORM ELEMENTS */
|
||||
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
A CSS Framework by Mike Stenhouse of Content with Style
|
||||
-------------------------------------------------------
|
||||
|
||||
Copyright (c) 2005, Mike Stenhouse of Content with Style
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
@import url("nav-horizontal.css");
|
||||
|
||||
/* NAV BAR AT THE TOP AND ONE COLUMN OF CONTENT */
|
||||
div#content {
|
||||
position: relative;
|
||||
width: 701px;
|
||||
|
||||
margin: 0 auto 20px auto;
|
||||
padding: 0;
|
||||
|
||||
text-align: left;
|
||||
}
|
||||
div#main {
|
||||
width: 100%;
|
||||
}
|
||||
div#local {
|
||||
display: none;
|
||||
}
|
||||
div#sub {
|
||||
display: none;
|
||||
}
|
||||
div#nav {
|
||||
display: none;
|
||||
}
|
||||
/* END CONTENT */
|
||||
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
A CSS Framework by Mike Stenhouse of Content with Style
|
||||
-------------------------------------------------------
|
||||
|
||||
Copyright (c) 2005, Mike Stenhouse of Content with Style
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
@import url("nav-vertical.css");
|
||||
|
||||
/* NAV BAR ON THE LEFT AND ONE COLUMN OF CONTENT */
|
||||
div#content {
|
||||
position: relative;
|
||||
width: 780px;
|
||||
|
||||
margin: 0 auto 20px auto;
|
||||
padding: 0;
|
||||
|
||||
text-align: left;
|
||||
}
|
||||
div#main {
|
||||
float: right;
|
||||
width: 560px;
|
||||
display: inline;
|
||||
}
|
||||
div#local {
|
||||
display: none;
|
||||
}
|
||||
div#sub {
|
||||
display: none;
|
||||
}
|
||||
div#nav {
|
||||
float: left;
|
||||
width: 200px;
|
||||
display: inline;
|
||||
}
|
||||
/* END CONTENT */
|
||||
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
A CSS Framework by Mike Stenhouse of Content with Style
|
||||
-------------------------------------------------------
|
||||
|
||||
Copyright (c) 2005, Mike Stenhouse of Content with Style
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
@import url("nav-vertical.css");
|
||||
|
||||
/* NAV BAR ON THE LEFT AND TWO COLUMNS OF CONTENT */
|
||||
div#content {
|
||||
position: relative;
|
||||
width: 780px;
|
||||
|
||||
margin: 0 auto 20px auto;
|
||||
padding: 0;
|
||||
|
||||
text-align: left;
|
||||
}
|
||||
div#main {
|
||||
float: right;
|
||||
width: 340px;
|
||||
display: inline;
|
||||
|
||||
margin-right: 220px;
|
||||
margin-left: -220px;
|
||||
}
|
||||
div#local {
|
||||
display: none;
|
||||
}
|
||||
div#sub {
|
||||
float: right;
|
||||
width: 200px;
|
||||
display: inline;
|
||||
|
||||
margin-right: -340px;
|
||||
margin-left: 200px;
|
||||
}
|
||||
div#nav {
|
||||
float: left;
|
||||
width: 200px;
|
||||
display: inline;
|
||||
}
|
||||
/* END CONTENT */
|
||||
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
A CSS Framework by Mike Stenhouse of Content with Style
|
||||
-------------------------------------------------------
|
||||
|
||||
Copyright (c) 2005, Mike Stenhouse of Content with Style
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
@import url("nav-horizontal.css");
|
||||
|
||||
/* NAV BAR AT THE TOP AND ONE COLUMN OF CONTENT */
|
||||
div#content {
|
||||
position: relative;
|
||||
width: 701px;
|
||||
|
||||
margin: 0 auto 20px auto;
|
||||
padding: 0;
|
||||
|
||||
text-align: left;
|
||||
}
|
||||
div#main {
|
||||
width: 100%;
|
||||
}
|
||||
div#local {
|
||||
width: 100%;
|
||||
}
|
||||
div#sub {
|
||||
width: 100%;
|
||||
}
|
||||
div#nav {
|
||||
position: absolute;
|
||||
top: -15px;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
|
||||
text-align: left;
|
||||
}
|
||||
/* END CONTENT */
|
||||
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
A CSS Framework by Mike Stenhouse of Content with Style
|
||||
-------------------------------------------------------
|
||||
|
||||
Copyright (c) 2005, Mike Stenhouse of Content with Style
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
@import url("nav-horizontal.css");
|
||||
|
||||
/* NAV BAR AT THE TOP, LOCAL NAV ON THE LEFT AND TWO COLUMNS OF CONTENT */
|
||||
div#content {
|
||||
position: relative;
|
||||
width: 701px;
|
||||
|
||||
margin: 0 auto 20px auto;
|
||||
padding: 0;
|
||||
|
||||
text-align: left;
|
||||
}
|
||||
div#main {
|
||||
float: left;
|
||||
width: 300px;
|
||||
display: inline;
|
||||
|
||||
margin-right: -200px;
|
||||
margin-left: 200px;
|
||||
}
|
||||
div#sub {
|
||||
float: right;
|
||||
width: 180px;
|
||||
display: inline;
|
||||
}
|
||||
div#local {
|
||||
float: left;
|
||||
width: 180px;
|
||||
display: inline;
|
||||
|
||||
margin-left: -300px;
|
||||
}
|
||||
div#nav {
|
||||
position: absolute;
|
||||
top: -15px;
|
||||
left: 0;
|
||||
width: 701px;
|
||||
|
||||
text-align: left;
|
||||
}
|
||||
/* END CONTENT */
|
||||
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
A CSS Framework by Mike Stenhouse of Content with Style
|
||||
-------------------------------------------------------
|
||||
|
||||
Copyright (c) 2005, Mike Stenhouse of Content with Style
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
@import url("nav-horizontal.css");
|
||||
|
||||
/* NAV BAR AT THE TOP, LOCAL NAVIGATION ON THE LEFT AND ONE COLUMN OF CONTENT */
|
||||
div#content {
|
||||
position: relative;
|
||||
width: 701px;
|
||||
|
||||
margin: 0 auto 20px auto;
|
||||
padding: 0;
|
||||
|
||||
text-align: left;
|
||||
}
|
||||
div#main {
|
||||
float: right;
|
||||
width: 500px;
|
||||
display: inline;
|
||||
}
|
||||
div#local {
|
||||
float: left;
|
||||
width: 200px;
|
||||
display: inline;
|
||||
}
|
||||
div#sub {
|
||||
display: none;
|
||||
}
|
||||
div#nav {
|
||||
position: absolute;
|
||||
top: -15px;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
|
||||
text-align: left;
|
||||
}
|
||||
/* END CONTENT */
|
||||
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
A CSS Framework by Mike Stenhouse of Content with Style
|
||||
-------------------------------------------------------
|
||||
|
||||
Copyright (c) 2005, Mike Stenhouse of Content with Style
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
@import url("nav-horizontal.css");
|
||||
|
||||
/* NAV BAR AT THE TOP AND TWO COLUMNS OF CONTENT */
|
||||
div#content {
|
||||
position: relative;
|
||||
width: 701px;
|
||||
|
||||
margin: 0 auto 20px auto;
|
||||
padding: 0;
|
||||
|
||||
text-align: left;
|
||||
}
|
||||
div#main {
|
||||
float: left;
|
||||
width: 480px;
|
||||
display: inline;
|
||||
}
|
||||
div#sub {
|
||||
float: right;
|
||||
width: 200px;
|
||||
display: inline;
|
||||
}
|
||||
div#local {
|
||||
display: none;
|
||||
}
|
||||
div#nav {
|
||||
position: absolute;
|
||||
top: -15px;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
|
||||
text-align: left;
|
||||
}
|
||||
/* END CONTENT */
|
||||
@@ -0,0 +1,152 @@
|
||||
/*
|
||||
A CSS Framework by Mike Stenhouse of Content with Style
|
||||
-------------------------------------------------------
|
||||
|
||||
Copyright (c) 2005, Mike Stenhouse of Content with Style
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/* SITE SPECIFIC LAYOUT */
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
||||
text-align: center;
|
||||
|
||||
background: white;
|
||||
}
|
||||
div#page {
|
||||
width: 780px;
|
||||
|
||||
margin: 0 auto;
|
||||
padding: 0;
|
||||
|
||||
text-align: center;
|
||||
|
||||
background: white;
|
||||
}
|
||||
|
||||
/* HEADER */
|
||||
div#header {
|
||||
margin: 0 0 5em 0;
|
||||
padding: 40px 20px;
|
||||
|
||||
color: white;
|
||||
background: black;
|
||||
|
||||
text-align: left;
|
||||
}
|
||||
div#branding {
|
||||
float: left;
|
||||
width: 40%;
|
||||
|
||||
margin: 0;
|
||||
padding: 10px 0 10px 20px;
|
||||
|
||||
text-align: left;
|
||||
}
|
||||
div#search {
|
||||
float: right;
|
||||
width: 49%;
|
||||
|
||||
margin: 0;
|
||||
padding: 16px 20px 0 0;
|
||||
|
||||
text-align: right;
|
||||
}
|
||||
/* END HEADER */
|
||||
|
||||
|
||||
/* CONTENT */
|
||||
div#content {
|
||||
|
||||
}
|
||||
|
||||
/* MAIN */
|
||||
div#main {
|
||||
|
||||
}
|
||||
/* END MAIN */
|
||||
|
||||
/* SUB */
|
||||
div#sub {
|
||||
|
||||
}
|
||||
/* END SUB */
|
||||
|
||||
/* END CONTENT */
|
||||
|
||||
|
||||
/* FOOTER */
|
||||
div#footer {
|
||||
color: white;
|
||||
background-color: black;
|
||||
}
|
||||
div#footer p {
|
||||
margin: 0;
|
||||
padding: 15px;
|
||||
|
||||
font-size: 0.8em;
|
||||
}
|
||||
/* END FOOTER */
|
||||
/* END LAYOUT */
|
||||
|
||||
|
||||
/* UL.SUBNAV */
|
||||
ul.subnav {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
||||
font-size: 0.8em;
|
||||
list-style: none;
|
||||
}
|
||||
ul.subnav li {
|
||||
margin: 0 0 1em 0;
|
||||
padding: 0;
|
||||
|
||||
list-style: none;
|
||||
}
|
||||
ul.subnav li a,
|
||||
ul.subnav li a:link,
|
||||
ul.subnav li a:visited,
|
||||
ul.subnav li a:active {
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
|
||||
color: black;
|
||||
}
|
||||
ul.subnav li a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
ul.subnav li strong {
|
||||
padding: 0 0 0 12px;
|
||||
|
||||
background: url("../i/subnav-highlight.gif") left top no-repeat transparent;
|
||||
}
|
||||
ul.subnav li strong a,
|
||||
ul.subnav li strong a:link,
|
||||
ul.subnav li strong a:visited,
|
||||
ul.subnav li strong a:active {
|
||||
color: white;
|
||||
background-color: black;
|
||||
}
|
||||
/* END UL.SUBNAV */
|
||||
@@ -0,0 +1,105 @@
|
||||
/*
|
||||
A CSS Framework by Mike Stenhouse of Content with Style
|
||||
-------------------------------------------------------
|
||||
|
||||
Copyright (c) 2005, Mike Stenhouse of Content with Style
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/* NAV */
|
||||
div#nav {
|
||||
font-size: 0.8em;
|
||||
}
|
||||
* html div#nav {
|
||||
/* hide ie/mac \*/
|
||||
height: 1%;
|
||||
/* end hide */
|
||||
}
|
||||
div#nav div.wrapper {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
}
|
||||
div#nav ul {
|
||||
width: 100%;
|
||||
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
||||
line-height: 1em;
|
||||
list-style: none;
|
||||
}
|
||||
div#nav li {
|
||||
float: left;
|
||||
display: inline;
|
||||
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
||||
list-style: none;
|
||||
|
||||
line-height: 1em;
|
||||
border-right: 1px solid #aaa;
|
||||
}
|
||||
div#nav li.last {
|
||||
border-right: none;
|
||||
}
|
||||
div#nav a,
|
||||
div#nav a:link,
|
||||
div#nav a:active,
|
||||
div#nav a:visited {
|
||||
display: inline-block;
|
||||
/* hide from ie/mac \*/
|
||||
display: block;
|
||||
/* end hide */
|
||||
|
||||
margin: 0;
|
||||
padding: 5px 38px 5px 38px;
|
||||
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
|
||||
color: black;
|
||||
background: #ddd;
|
||||
}
|
||||
div#nav a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
div#nav strong {
|
||||
display: inline-block;
|
||||
/* hide from ie/mac \*/
|
||||
display: block;
|
||||
/* end hide */
|
||||
|
||||
color: white;
|
||||
background: black;
|
||||
}
|
||||
div#nav strong a,
|
||||
div#nav strong a:link,
|
||||
div#nav strong a:active,
|
||||
div#nav strong a:visited,
|
||||
div#nav strong a:hover {
|
||||
color: white;
|
||||
background-color: black;
|
||||
}
|
||||
/* END NAV */
|
||||
@@ -0,0 +1,104 @@
|
||||
/*
|
||||
A CSS Framework by Mike Stenhouse of Content with Style
|
||||
-------------------------------------------------------
|
||||
|
||||
Copyright (c) 2005, Mike Stenhouse of Content with Style
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/* NAV */
|
||||
div#nav {
|
||||
font-size: 0.8em;
|
||||
}
|
||||
* html div#nav {
|
||||
/* hide ie/mac \*/
|
||||
height: 1%;
|
||||
/* end hide */
|
||||
}
|
||||
div#nav div.wrapper {
|
||||
width: 100%;
|
||||
|
||||
background: #ddd;
|
||||
}
|
||||
div#nav ul {
|
||||
width: 100%;
|
||||
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
||||
line-height: 1em;
|
||||
list-style: none;
|
||||
}
|
||||
div#nav li {
|
||||
display: block;
|
||||
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
||||
list-style: none;
|
||||
|
||||
line-height: 1em;
|
||||
}
|
||||
* html div#nav li {
|
||||
/* hide ie/mac \*/
|
||||
height: 1%;
|
||||
/* end hide */
|
||||
}
|
||||
div#nav li.last {
|
||||
|
||||
}
|
||||
div#nav a,
|
||||
div#nav a:link,
|
||||
div#nav a:active,
|
||||
div#nav a:visited {
|
||||
display: block;
|
||||
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
|
||||
margin: 0;
|
||||
padding: 5px 10px 5px 10px;
|
||||
|
||||
color: black;
|
||||
background: white;
|
||||
}
|
||||
div#nav a:hover {
|
||||
text-decoration: underline;
|
||||
|
||||
color: white;
|
||||
background: black;
|
||||
}
|
||||
div#nav strong {
|
||||
display: block;
|
||||
|
||||
color: white;
|
||||
background: black;
|
||||
}
|
||||
div#nav strong a,
|
||||
div#nav strong a:link,
|
||||
div#nav strong a:active,
|
||||
div#nav strong a:visited,
|
||||
div#nav strong a:hover {
|
||||
color: white;
|
||||
background-color: black;
|
||||
}
|
||||
/* END NAV */
|
||||
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
A CSS Framework by Mike Stenhouse of Content with Style
|
||||
-------------------------------------------------------
|
||||
|
||||
Copyright (c) 2005, Mike Stenhouse of Content with Style
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/* clearing */
|
||||
.stretch,
|
||||
.clear {
|
||||
clear: both;
|
||||
height: 1px;
|
||||
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
||||
font-size: 15px;
|
||||
line-height: 1px;
|
||||
}
|
||||
.clearfix:after {
|
||||
clear: both;
|
||||
height: 0;
|
||||
|
||||
display: block;
|
||||
visibility: hidden;
|
||||
|
||||
content: ".";
|
||||
}
|
||||
.clearfix {display:inline-block;}
|
||||
/* Hide from IE Mac \*/
|
||||
.clearfix {display:block;}
|
||||
/* End hide from IE Mac */
|
||||
/* end clearing */
|
||||
|
||||
/* accessibility */
|
||||
span.accesskey {
|
||||
text-decoration: none;
|
||||
}
|
||||
.accessibility {
|
||||
position: absolute;
|
||||
top: -999em;
|
||||
left: -999em;
|
||||
}
|
||||
/* end accessibility */
|
||||
@@ -0,0 +1,228 @@
|
||||
/*
|
||||
A CSS Framework by Mike Stenhouse of Content with Style
|
||||
-------------------------------------------------------
|
||||
|
||||
Copyright (c) 2005, Mike Stenhouse of Content with Style
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of CSS Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/* TYPOGRAPHY */
|
||||
body {
|
||||
text-align: left;
|
||||
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
|
||||
font-size: 76%;
|
||||
line-height: 1em;
|
||||
|
||||
color: #333;
|
||||
}
|
||||
div {
|
||||
font-size: 1em;
|
||||
}
|
||||
img {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
/* LINKS */
|
||||
a,
|
||||
a:link,
|
||||
a:active {
|
||||
text-decoration: underline;
|
||||
|
||||
color: blue;
|
||||
background-color: white;
|
||||
}
|
||||
a:visited {
|
||||
color: purple;
|
||||
background-color: transparent;
|
||||
}
|
||||
a:hover {
|
||||
text-decoration: none;
|
||||
|
||||
color: white;
|
||||
background-color: black;
|
||||
}
|
||||
/* END LINKS */
|
||||
|
||||
/* HEADINGS */
|
||||
h1 {
|
||||
margin: 0 0 0.5em 0;
|
||||
padding: 0;
|
||||
|
||||
font-size: 2em;
|
||||
line-height: 1.5em;
|
||||
|
||||
color: black;
|
||||
}
|
||||
h2 {
|
||||
margin: 0 0 0.5em 0;
|
||||
padding: 0;
|
||||
|
||||
font-size: 1.5em;
|
||||
line-height: 1.5em;
|
||||
|
||||
color: black;
|
||||
}
|
||||
h3 {
|
||||
margin: 0 0 0.5em 0;
|
||||
padding:0;
|
||||
|
||||
font-size: 1.3em;
|
||||
line-height: 1.3em;
|
||||
|
||||
color: black;
|
||||
}
|
||||
h4 {
|
||||
margin: 0 0 0.25em 0;
|
||||
padding: 0;
|
||||
|
||||
font-size: 1.2em;
|
||||
line-height: 1.3em;
|
||||
|
||||
color: black;
|
||||
}
|
||||
h5 {
|
||||
margin: 0 0 0.25em 0;
|
||||
padding: 0;
|
||||
|
||||
font-size: 1.1em;
|
||||
line-height: 1.3em;
|
||||
|
||||
color: black;
|
||||
}
|
||||
h6 {
|
||||
margin: 0 0 0.25em 0;
|
||||
padding: 0;
|
||||
|
||||
font-size: 1em;
|
||||
line-height: 1.3em;
|
||||
|
||||
color: black;
|
||||
}
|
||||
/* END HEADINGS */
|
||||
|
||||
/* TEXT */
|
||||
p {
|
||||
margin: 0 0 1.5em 0;
|
||||
padding: 0;
|
||||
|
||||
font-size: 1em;
|
||||
line-height:1.4em;
|
||||
}
|
||||
blockquote {
|
||||
margin-left: 10px;
|
||||
|
||||
border-left: 10px solid #ddd;
|
||||
}
|
||||
pre {
|
||||
font-family: monospace;
|
||||
font-size: 1.0em;
|
||||
}
|
||||
strong, b {
|
||||
font-weight: bold;
|
||||
}
|
||||
em, i {
|
||||
font-style:italic;
|
||||
}
|
||||
code {
|
||||
font-family: "Courier New", Courier, monospace;
|
||||
font-size: 1em;
|
||||
white-space: pre;
|
||||
}
|
||||
/* END TEXT */
|
||||
|
||||
/* LISTS */
|
||||
ul {
|
||||
margin: 0 0 1.5em 0;
|
||||
padding: 0;
|
||||
|
||||
line-height:1.4em;
|
||||
}
|
||||
ul li {
|
||||
margin: 0 0 0.25em 30px;
|
||||
padding: 0;
|
||||
}
|
||||
ol {
|
||||
margin: 0 0 1.5em 0;
|
||||
padding: 0;
|
||||
|
||||
font-size: 1.0em;
|
||||
line-height: 1.4em;
|
||||
}
|
||||
ol li {
|
||||
margin: 0 0 0.25em 30px;
|
||||
padding: 0;
|
||||
|
||||
font-size: 1.0em;
|
||||
}
|
||||
dl {
|
||||
margin: 0 0 1.5em 0;
|
||||
padding: 0;
|
||||
|
||||
line-height: 1.4em;
|
||||
}
|
||||
dl dt {
|
||||
margin: 0.25em 0 0.25em 0;
|
||||
padding: 0;
|
||||
|
||||
font-weight: bold;
|
||||
}
|
||||
dl dd {
|
||||
margin: 0 0 0 30px;
|
||||
padding: 0;
|
||||
}
|
||||
/* END LISTS */
|
||||
|
||||
|
||||
/* TABLE */
|
||||
table {
|
||||
margin: 0 0 1.5em 0;
|
||||
padding: 0;
|
||||
|
||||
font-size: 1em;
|
||||
}
|
||||
table caption {
|
||||
margin: 0;
|
||||
padding: 0 0 1.5em 0;
|
||||
|
||||
font-weight: bold;
|
||||
}
|
||||
th {
|
||||
font-weight: bold;
|
||||
text-align: left;
|
||||
}
|
||||
td {
|
||||
font-size: 1em;
|
||||
}
|
||||
/* END TABLE */
|
||||
|
||||
hr {
|
||||
display: none;
|
||||
}
|
||||
div.hr {
|
||||
height: 1px;
|
||||
|
||||
margin: 1.5em 10px;
|
||||
|
||||
border-bottom: 1px dotted black;
|
||||
}
|
||||
|
||||
/* END TYPOGRAPHY */
|
||||
@@ -0,0 +1,452 @@
|
||||
/*
|
||||
* Copyright 2004-2008 the original author or authors.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
dojo.declare("Spring.DefaultEquals", null, {
|
||||
equals : function(/*Object*/other){
|
||||
if (other.declaredClass && other.declaredClass == this.declaredClass) {
|
||||
return true;
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
dojo.declare("Spring.ElementDecoration", [Spring.AbstractElementDecoration, Spring.DefaultEquals], {
|
||||
constructor : function(config) {
|
||||
this.widgetAttrs = {};
|
||||
this.copyFields = new Array('name', 'value', 'type', 'checked', 'selected', 'readOnly', 'disabled', 'alt', 'maxLength', 'class', 'title');
|
||||
dojo.mixin(this, config);
|
||||
this.element = dojo.byId(this.elementId);
|
||||
this.elementId = dojo.isString(this.elementId) ? this.elementId : this.elementId.id;
|
||||
if(this.widgetModule == "") {
|
||||
this.widgetModule = this.widgetType;
|
||||
}
|
||||
dojo.require(this.widgetModule);
|
||||
},
|
||||
|
||||
apply : function(){
|
||||
if (dijit.byId(this.elementId)) {
|
||||
dijit.byId(this.elementId).destroyRecursive(false);
|
||||
}
|
||||
|
||||
if (!this.element) {
|
||||
console.error("Could not apply " + this.widgetType + " decoration. Element with id '" + this.elementId + "' not found in the DOM.");
|
||||
}
|
||||
else {
|
||||
/*
|
||||
* dijit.form.DateTextBox uses locale information when displaying a date and a
|
||||
* fixed date format when parsing or serializing date values coming from the
|
||||
* server-side. There is no way configure it to use a single date pattern,
|
||||
* which is the reason for the code below.
|
||||
*/
|
||||
var datePattern = this.widgetAttrs['datePattern'];
|
||||
if (datePattern && this.widgetType == 'dijit.form.DateTextBox') {
|
||||
if (!this.widgetAttrs['value']) {
|
||||
// Help dijit.form.DateTextBox parse the server side date value.
|
||||
this.widgetAttrs['value'] = dojo.date.locale.parse(this.element.value, {selector : "date", datePattern : datePattern});
|
||||
}
|
||||
if (!this.widgetAttrs['serialize']) {
|
||||
// Help dijit.form.DateTextBox format the date to send to the server side.
|
||||
this.widgetAttrs['serialize'] = function(d, options){
|
||||
return dojo.date.locale.format(d, {selector : "date", datePattern : datePattern});
|
||||
}
|
||||
}
|
||||
// Add a constraint that specifies the date pattern to use when displaying a date
|
||||
// but don't interfere with any constraints that may have been specified.
|
||||
if (!this.widgetAttrs['constraints']) {
|
||||
this.widgetAttrs['constraints'] = {};
|
||||
}
|
||||
if (!this.widgetAttrs['constraints'].datePattern) {
|
||||
this.widgetAttrs['constraints'].datePattern = datePattern;
|
||||
}
|
||||
}
|
||||
for (var copyField in this.copyFields) {
|
||||
copyField = this.copyFields[copyField];
|
||||
if (!this.widgetAttrs[copyField] && this.element[copyField] &&
|
||||
(typeof this.element[copyField] != 'number' ||
|
||||
(typeof this.element[copyField] == 'number' && this.element[copyField] >= 0))) {
|
||||
this.widgetAttrs[copyField] = this.element[copyField];
|
||||
}
|
||||
}
|
||||
if(this.element['style'] && this.element['style'].cssText){
|
||||
this.widgetAttrs['style'] = this.element['style'].cssText;
|
||||
}
|
||||
var widgetConstructor = dojo.eval(this.widgetType);
|
||||
this.widget = new widgetConstructor(this.widgetAttrs, this.element);
|
||||
this.widget.startup();
|
||||
}
|
||||
//return this to support method chaining
|
||||
return this;
|
||||
},
|
||||
|
||||
validate : function(){
|
||||
if (!this.widget.isValid) {
|
||||
// some widgets cannot be validated
|
||||
return true;
|
||||
}
|
||||
var isValid = this.widget.isValid(false);
|
||||
if (!isValid) {
|
||||
this.widget.state = "Error";
|
||||
this.widget._setStateClass();
|
||||
}
|
||||
return isValid;
|
||||
}
|
||||
});
|
||||
|
||||
dojo.declare("Spring.ValidateAllDecoration", [Spring.AbstractValidateAllDecoration, Spring.DefaultEquals], {
|
||||
constructor : function(config) {
|
||||
this.originalHandler = null;
|
||||
this.connection = null;
|
||||
dojo.mixin(this, config);
|
||||
},
|
||||
|
||||
apply : function() {
|
||||
var element = dojo.byId(this.elementId);
|
||||
if (!element) {
|
||||
console.error("Could not apply ValidateAll decoration. Element with id '" + this.elementId + "' not found in the DOM.");
|
||||
} else {
|
||||
this.originalHandler = element[this.event];
|
||||
var context = this;
|
||||
element[this.event] = function(event){
|
||||
context.handleEvent(event, context);
|
||||
};
|
||||
}
|
||||
return this;
|
||||
},
|
||||
|
||||
cleanup : function(){
|
||||
dojo.disconnect(this.connection);
|
||||
},
|
||||
|
||||
handleEvent : function(event, context){
|
||||
if (!Spring.validateAll()) {
|
||||
dojo.publish(this.elementId+"/validation", [false]);
|
||||
dojo.stopEvent(event);
|
||||
} else {
|
||||
dojo.publish(this.elementId+"/validation", [true]);
|
||||
if(dojo.isFunction(context.originalHandler)) {
|
||||
var result = context.originalHandler(event);
|
||||
if (result == false) {
|
||||
dojo.stopEvent(event);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
dojo.declare("Spring.AjaxEventDecoration", [Spring.AbstractAjaxEventDecoration, Spring.DefaultEquals], {
|
||||
constructor : function(config){
|
||||
this.validationSubscription = null;
|
||||
this.connection = null;
|
||||
this.allowed = true;
|
||||
dojo.mixin(this, config);
|
||||
},
|
||||
|
||||
apply : function() {
|
||||
|
||||
var element = dijit.byId(this.elementId) ? dijit.byId(this.elementId) : dojo.byId(this.elementId);
|
||||
if (!element) {
|
||||
console.error("Could not apply AjaxEvent decoration. Element with id '" + this.elementId + "' not found in the DOM.");
|
||||
} else {
|
||||
this.validationSubscription = dojo.subscribe(this.elementId+"/validation", this, "_handleValidation");
|
||||
this.connection = dojo.connect(element, this.event, this, "submit");
|
||||
}
|
||||
return this;
|
||||
},
|
||||
|
||||
cleanup : function(){
|
||||
dojo.unsubscribe(this.validationSubscription);
|
||||
dojo.disconnect(this.connection);
|
||||
},
|
||||
|
||||
submit : function(event){
|
||||
if (this.sourceId == ""){
|
||||
this.sourceId = this.elementId;
|
||||
}
|
||||
if(this.formId == ""){
|
||||
Spring.remoting.getLinkedResource(this.sourceId, this.params, this.popup);
|
||||
} else {
|
||||
if (this.allowed){
|
||||
Spring.remoting.submitForm(this.sourceId, this.formId, this.params);
|
||||
}
|
||||
}
|
||||
dojo.stopEvent(event);
|
||||
},
|
||||
|
||||
_handleValidation : function(success){
|
||||
if (!success) {
|
||||
this.allowed=false;
|
||||
} else {
|
||||
this.allowed=true;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
dojo.declare("Spring.RemotingHandler", Spring.AbstractRemotingHandler, {
|
||||
constructor : function(){},
|
||||
|
||||
submitForm : function(/*String */ sourceId, /*String*/formId, /*Object*/ params) {
|
||||
var content = new Object();
|
||||
for (var key in params) {
|
||||
content[key] = params[key];
|
||||
}
|
||||
|
||||
var sourceComponent = dojo.byId(sourceId);
|
||||
|
||||
if (sourceComponent != null){
|
||||
if(sourceComponent.value != undefined && sourceComponent.type && ("button,submit,reset").indexOf(sourceComponent.type) < 0) {
|
||||
content[sourceId] = sourceComponent.value;
|
||||
}
|
||||
else if(sourceComponent.name != undefined) {
|
||||
content[sourceComponent.name] = sourceComponent.name;
|
||||
} else {
|
||||
content[sourceId] = sourceId;
|
||||
}
|
||||
}
|
||||
|
||||
if (!content['ajaxSource']) {
|
||||
content['ajaxSource'] = sourceId;
|
||||
}
|
||||
|
||||
var formNode = dojo.byId(formId);
|
||||
var formMethod = dojo.string.trim(formNode.method);
|
||||
formMethod = formMethod.length > 0 ? formMethod.toUpperCase() : "GET";
|
||||
|
||||
dojo.xhr(formMethod, {
|
||||
|
||||
content: content,
|
||||
|
||||
form: formId,
|
||||
|
||||
handleAs: "text",
|
||||
|
||||
headers: {"Accept" : "text/html;type=ajax"},
|
||||
|
||||
// The LOAD function will be called on a successful response.
|
||||
load: this.handleResponse,
|
||||
|
||||
// The ERROR function will be called in an error case.
|
||||
error: this.handleError
|
||||
}, formMethod == "POST" ? true : false);
|
||||
|
||||
},
|
||||
|
||||
getLinkedResource: function(/*String */ linkId, /*Object*/params, /*boolean*/ modal) {
|
||||
this.getResource(dojo.byId(linkId).href, params, modal);
|
||||
},
|
||||
|
||||
getResource: function(/*String */ resourceUri, /*Object*/params, /*boolean*/ modal) {
|
||||
|
||||
dojo.xhrGet({
|
||||
|
||||
url: resourceUri,
|
||||
|
||||
content: params,
|
||||
|
||||
handleAs: "text",
|
||||
|
||||
headers: {"Accept" : "text/html;type=ajax"},
|
||||
|
||||
load: this.handleResponse,
|
||||
|
||||
error: this.handleError,
|
||||
|
||||
modal: modal
|
||||
});
|
||||
},
|
||||
|
||||
handleResponse: function(response, ioArgs) {
|
||||
|
||||
//First check if this response should redirect
|
||||
var redirectURL = ioArgs.xhr.getResponseHeader('Spring-Redirect-URL');
|
||||
var modalViewHeader = ioArgs.xhr.getResponseHeader('Spring-Modal-View');
|
||||
var modalView = ((dojo.isString(modalViewHeader) && modalViewHeader.length > 0) || ioArgs.args.modal);
|
||||
|
||||
if (dojo.isString(redirectURL) && redirectURL.length > 0) {
|
||||
if (modalView) {
|
||||
//render a popup with the new URL
|
||||
Spring.remoting._renderURLToModalDialog(redirectURL);
|
||||
return response;
|
||||
}
|
||||
else {
|
||||
if (redirectURL.indexOf("/") >= 0) {
|
||||
window.location = window.location.protocol + "//" + window.location.host + redirectURL;
|
||||
} else {
|
||||
var location = window.location.protocol + "//" + window.location.host + window.location.pathname;
|
||||
var appendIndex = location.lastIndexOf("/");
|
||||
location = location.substr(0,appendIndex+1) + redirectURL;
|
||||
if (location == window.location) {
|
||||
Spring.remoting.getResource(location, ioArgs.args.content, false);
|
||||
}
|
||||
else {
|
||||
window.location = location;
|
||||
}
|
||||
}
|
||||
return response;
|
||||
}
|
||||
} else if ((dojo.string.trim(response).length == 0) && (ioArgs.xhr.status != 204) && (ioArgs.xhr.status != 205)) {
|
||||
if (Spring.debug) {
|
||||
Spring.remoting.showError('Received empty response with no Spring redirect headers. If this is intentional set the response status code to 204 or 205.');
|
||||
}
|
||||
}
|
||||
|
||||
//Extract and store all <script> elements from the response
|
||||
var scriptPattern = '(?:<script(.|[\n|\r])*?>)((\n|\r|.)*?)(?:<\/script>)';
|
||||
var extractedScriptNodes = [];
|
||||
var matchAll = new RegExp(scriptPattern, 'img');
|
||||
var matchOne = new RegExp(scriptPattern, 'im');
|
||||
|
||||
var scriptNodes = response.match(matchAll);
|
||||
if (scriptNodes != null)
|
||||
{
|
||||
for (var i=0; i<scriptNodes.length; i++)
|
||||
{
|
||||
var script = (scriptNodes[i].match(matchOne) || ['','',''])[2];
|
||||
script = script.replace(/<!--/mg,'').replace(/\/\/-->/mg,'').replace(/<!\[CDATA\[(\/\/>)*/mg,'').replace(/(<!)*\]\]>/mg,'');
|
||||
extractedScriptNodes.push(script);
|
||||
}
|
||||
}
|
||||
// Remove scripts but don't remove scripts entirely (see SWF-1358)
|
||||
response = response.replace(matchAll, '<script> // Original script removed to avoid re-execution </script>');
|
||||
|
||||
if (modalView) {
|
||||
//For a modal view, just dump the response into a modal dialog
|
||||
Spring.remoting._renderResponseToModalDialog(response);
|
||||
} else {
|
||||
//Extract the new DOM nodes from the response
|
||||
var tempSpan = dojo.doc.createElement("span");
|
||||
tempSpan.id="ajaxResponse";
|
||||
tempSpan.style.display= "none";
|
||||
document.body.appendChild(tempSpan);
|
||||
tempSpan.innerHTML=response;
|
||||
var tempContainer = new dojo.NodeList(tempSpan);
|
||||
var newNodes = tempContainer.query(">").orphan();
|
||||
tempContainer.orphan();
|
||||
|
||||
//Insert the new DOM nodes and update the Form's action URL
|
||||
newNodes.forEach(function(item){
|
||||
if (item.id != null && item.id != "") {
|
||||
var target = dijit.byId(item.id) ? dijit.byId(item.id).domNode : dojo.byId(item.id);
|
||||
if (!target) {
|
||||
console.error("An existing DOM elment with id '" + item.id + "' could not be found for replacement.");
|
||||
} else {
|
||||
target.parentNode.replaceChild(item, target);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//Evaluate any script code
|
||||
dojo.forEach(extractedScriptNodes, function(script){
|
||||
dojo.eval(script);
|
||||
});
|
||||
|
||||
return response;
|
||||
},
|
||||
|
||||
handleError: function(response, ioArgs) {
|
||||
dojo.require("dijit.Dialog");
|
||||
|
||||
console.error("HTTP status code: ", ioArgs.xhr.status);
|
||||
|
||||
if (Spring.debug && ioArgs.xhr.status != 200) {
|
||||
var dialog = new dijit.Dialog({ title: 'Ajax Request Error' });
|
||||
dojo.connect(dialog, "hide", dialog, function(){
|
||||
this.destroyRecursive(false);
|
||||
});
|
||||
dialog.domNode.style.overflow = "auto";
|
||||
dialog.setContent(ioArgs.xhr.responseText);
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
return response;
|
||||
},
|
||||
|
||||
showError: function(message) {
|
||||
dojo.require("dijit.Dialog");
|
||||
|
||||
var dialog = new dijit.Dialog({ title: 'Error Message' });
|
||||
dojo.connect(dialog, "hide", dialog, function(){
|
||||
this.destroyRecursive(false);
|
||||
});
|
||||
dialog.domNode.style.width = "500px";
|
||||
dialog.setContent(message);
|
||||
dialog.show();
|
||||
},
|
||||
|
||||
_renderURLToModalDialog: function(url) {
|
||||
Spring.remoting.getResource(url, {}, true);
|
||||
},
|
||||
|
||||
_renderResponseToModalDialog: function(response) {
|
||||
dojo.require("dijit.Dialog");
|
||||
|
||||
var dialog = new dijit.Dialog({});
|
||||
dialog.setContent(response);
|
||||
dojo.connect(dialog, "hide", dialog, function(){
|
||||
this.destroyRecursive(false);
|
||||
});
|
||||
dialog.show();
|
||||
}
|
||||
});
|
||||
|
||||
dojo.declare("Spring.CommandLinkDecoration", [Spring.AbstractCommandLinkDecoration, Spring.DefaultEquals], {
|
||||
constructor : function(config){
|
||||
dojo.mixin(this, config);
|
||||
},
|
||||
|
||||
apply : function(){
|
||||
var advisedNode = dojo.byId(this.elementId);
|
||||
if (!dojo.hasClass(advisedNode, "progressiveLink")) {
|
||||
//Node must be replaced
|
||||
var nodeToReplace = new dojo.NodeList(advisedNode);
|
||||
nodeToReplace.addContent(this.linkHtml, "after").orphan("*");
|
||||
//Get the new node
|
||||
advisedNode = dojo.byId(this.elementId);
|
||||
}
|
||||
advisedNode.submitFormFromLink = this.submitFormFromLink;
|
||||
//return this to support method chaining
|
||||
return this;
|
||||
},
|
||||
|
||||
submitFormFromLink : function(/*String*/ formId, /*String*/ sourceId, /*Array of name,value params*/ params){
|
||||
var addedNodes = [];
|
||||
var formNode = dojo.byId(formId);
|
||||
var linkNode = document.createElement("input");
|
||||
linkNode.name = sourceId;
|
||||
linkNode.value = "submitted";
|
||||
addedNodes.push(linkNode);
|
||||
|
||||
dojo.forEach(params, function(param){
|
||||
var paramNode = document.createElement("input");
|
||||
paramNode.name=param.name;
|
||||
paramNode.value=param.value;
|
||||
addedNodes.push(paramNode);
|
||||
});
|
||||
|
||||
dojo.forEach(addedNodes, function(nodeToAdd){
|
||||
dojo.addClass(nodeToAdd, "SpringLinkInput");
|
||||
dojo.place(nodeToAdd, formNode, "last");
|
||||
});
|
||||
|
||||
if ((formNode.onsubmit ? !formNode.onsubmit() : false) || !formNode.submit()) {
|
||||
dojo.forEach(addedNodes, function(hiddenNode){
|
||||
hiddenNode.parentNode.removeChild(hiddenNode);
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
dojo.addOnLoad(Spring.initialize);
|
||||
@@ -0,0 +1,176 @@
|
||||
/*
|
||||
* Copyright 2004-2008 the original author or authors.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
Spring = {};
|
||||
|
||||
Spring.debug = true;
|
||||
|
||||
Spring.decorations = {};
|
||||
|
||||
Spring.decorations.applied = false;
|
||||
|
||||
Spring.initialize = function(){
|
||||
Spring.applyDecorations();
|
||||
Spring.remoting = new Spring.RemotingHandler();
|
||||
};
|
||||
|
||||
Spring.addDecoration = function(/*Object*/decoration){
|
||||
//Spring.decorations.push(decoration);
|
||||
|
||||
if (!Spring.decorations[decoration.elementId]) {
|
||||
Spring.decorations[decoration.elementId] = [];
|
||||
Spring.decorations[decoration.elementId].push(decoration);
|
||||
} else {
|
||||
var replaced = false;
|
||||
for(var i = 0; i<Spring.decorations[decoration.elementId].length; i++) {
|
||||
var existingDecoration = Spring.decorations[decoration.elementId][i];
|
||||
if(existingDecoration.equals(decoration)) {
|
||||
if (existingDecoration.cleanup != undefined) {
|
||||
existingDecoration.cleanup();
|
||||
}
|
||||
Spring.decorations[decoration.elementId][i] = decoration;
|
||||
replaced=true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!replaced) {
|
||||
Spring.decorations[decoration.elementId].push(decoration);
|
||||
}
|
||||
}
|
||||
|
||||
if(Spring.decorations.applied) {
|
||||
decoration.apply();
|
||||
}
|
||||
};
|
||||
|
||||
Spring.applyDecorations = function(){
|
||||
if (!Spring.decorations.applied) {
|
||||
for (var elementId in Spring.decorations) {
|
||||
for (var x = 0; x < Spring.decorations[elementId].length; x++) {
|
||||
Spring.decorations[elementId][x].apply();
|
||||
}
|
||||
}
|
||||
Spring.decorations.applied = true;
|
||||
}
|
||||
};
|
||||
|
||||
Spring.validateAll = function(){
|
||||
var valid = true;
|
||||
for (var elementId in Spring.decorations) {
|
||||
for (var x = 0; x < Spring.decorations[elementId].length; x++) {
|
||||
if (Spring.decorations[elementId][x].widget && !Spring.decorations[elementId][x].validate()) {
|
||||
valid = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return valid;
|
||||
};
|
||||
|
||||
Spring.validateRequired = function(){
|
||||
var valid = true;
|
||||
for (var elementId in Spring.decorations) {
|
||||
for (var x = 0; x < Spring.decorations[elementId].length; x++) {
|
||||
if (Spring.decorations[elementId][x].widget && Spring.decorations[elementId][x].isRequired() &&
|
||||
!Spring.decorations[elementId][x].validate()) {
|
||||
valid = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return valid;
|
||||
};
|
||||
|
||||
Spring.AbstractElementDecoration = function(){};
|
||||
|
||||
Spring.AbstractElementDecoration.prototype = {
|
||||
|
||||
elementId : "",
|
||||
widgetType : "",
|
||||
widgetModule : "",
|
||||
widget : null,
|
||||
widgetAttrs : {},
|
||||
|
||||
apply : function(){},
|
||||
|
||||
validate : function(){},
|
||||
|
||||
isRequired : function(){},
|
||||
|
||||
equals : function(/*Object*/other){}
|
||||
};
|
||||
|
||||
Spring.AbstractValidateAllDecoration = function(){};
|
||||
|
||||
Spring.AbstractValidateAllDecoration.prototype = {
|
||||
|
||||
event : "",
|
||||
elementId : "",
|
||||
|
||||
apply : function() {},
|
||||
|
||||
cleanup : function(){},
|
||||
|
||||
handleEvent : function(event){},
|
||||
|
||||
equals : function(/*Object*/other){}
|
||||
};
|
||||
|
||||
Spring.AbstractCommandLinkDecoration = function(){};
|
||||
|
||||
Spring.AbstractCommandLinkDecoration.prototype = {
|
||||
|
||||
elementId : "",
|
||||
linkHtml : "",
|
||||
|
||||
apply : function(){},
|
||||
|
||||
submitFormFromLink : function(/*String*/ formId, /*String*/ sourceId, /*Array of name,value params*/ params){},
|
||||
|
||||
equals : function(/*Object*/other){}
|
||||
};
|
||||
|
||||
Spring.AbstractAjaxEventDecoration = function(){};
|
||||
|
||||
Spring.AbstractAjaxEventDecoration.prototype = {
|
||||
|
||||
event : "",
|
||||
elementId : "",
|
||||
sourceId : "",
|
||||
formId : "",
|
||||
popup : false,
|
||||
params : {},
|
||||
|
||||
apply : function(){},
|
||||
|
||||
cleanup : function(){},
|
||||
|
||||
submit : function(event){},
|
||||
|
||||
equals : function(/*Object*/other){}
|
||||
};
|
||||
|
||||
Spring.AbstractRemotingHandler = function(){};
|
||||
|
||||
Spring.AbstractRemotingHandler.prototype = {
|
||||
|
||||
submitForm : function(/*String */ sourceId, /*String*/formId, /*Object*/ params){},
|
||||
|
||||
getLinkedResource: function(/*String */ linkId, /*Object*/params, /*boolean*/ modal) {},
|
||||
|
||||
getResource : function(/*String */ resourceUri, /*Object*/params, /*boolean*/ modal) {},
|
||||
|
||||
handleResponse : function() {},
|
||||
|
||||
handleError : function() {}
|
||||
};
|
||||
0
spring-js-resources/src/test/java/.gitignore
vendored
Normal file
0
spring-js-resources/src/test/java/.gitignore
vendored
Normal file
0
spring-js-resources/src/test/resources/.gitignore
vendored
Normal file
0
spring-js-resources/src/test/resources/.gitignore
vendored
Normal file
@@ -7,14 +7,228 @@
|
||||
xsi:schemaLocation="
|
||||
http://docbook.org/ns/docbook http://www.docbook.org/xml/5.0/xsd/docbook.xsd
|
||||
http://www.w3.org/1999/xlink http://www.docbook.org/xml/5.0/xsd/xlink.xsd">
|
||||
<title>Handling Ajax Requests</title>
|
||||
<title>Spring JavaScript Quick Reference</title>
|
||||
<sect1 xml:id="spring-js-introduction">
|
||||
<title>Introduction</title>
|
||||
<para>
|
||||
Spring Javascript (spring-js) is a lightweight abstraction over common JavaScript toolkits such as Dojo.
|
||||
It aims to provide a common client-side programming model for progressively enhancing a web page with rich widget behavior and Ajax remoting.
|
||||
</para>
|
||||
<para>
|
||||
Use of the Spring JS API is demonstrated in the the Spring MVC + Web Flow version of the Spring Travel reference application.
|
||||
</para>
|
||||
</sect1>
|
||||
<sect1 xml:id="spring-js-resource-servlet">
|
||||
<title>Serving Javascript Resources</title>
|
||||
<para>
|
||||
Spring JS provides a generic <code>ResourceServlet</code> to serve web resources such as JavaScript and CSS files from jar files,
|
||||
as well as the webapp root directory.
|
||||
This servlet provides a convenient way to serve Spring.js files to your pages.
|
||||
To deploy this servlet, declare the following in <code>web.xml</code>:
|
||||
</para>
|
||||
<programlisting language="xml"><![CDATA[
|
||||
<!-- Serves static resource content from .jar files such as spring-js.jar -->
|
||||
<servlet>
|
||||
<servlet-name>Resource Servlet</servlet-name>
|
||||
<servlet-class>org.springframework.js.resource.ResourceServlet</servlet-class>
|
||||
</servlet>
|
||||
|
||||
<!-- Map all /resources requests to the Resource Servlet for handling -->
|
||||
<servlet-mapping>
|
||||
<servlet-name>Resource Servlet</servlet-name>
|
||||
<url-pattern>/resources/*</url-pattern>
|
||||
</servlet-mapping>]]>
|
||||
</programlisting>
|
||||
<para>
|
||||
Note that starting with version 3.0.4, the Spring Framework includes
|
||||
a replacement for the <code>ResourceServlet</code> (see the
|
||||
<link xl:href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-static-resources">Spring Framework documentation</link>).
|
||||
With the new <mvc:resources> element resource requests (.js, .css) are handled by the
|
||||
<code>DispatcherSevlet</code> without the need for a separate <code>ResourceServlet</code>.
|
||||
Here is the relevant portion of the Spring MVC configuration in
|
||||
the mvc-booking sample:
|
||||
</para>
|
||||
<programlisting language="xml"><![CDATA[
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:mvc="http://www.springframework.org/schema/mvc"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
|
||||
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
|
||||
|
||||
<mvc:annotation-driven/>
|
||||
|
||||
<mvc:resources mapping="/resources/**" location="/, classpath:/META-INF/web-resources/" />
|
||||
|
||||
...
|
||||
|
||||
</beans>
|
||||
]]>
|
||||
</programlisting>
|
||||
<para>
|
||||
This incoming maps requests for <code>/resources</code> to resources found under
|
||||
<code>/META-INF/web-resources</code> on the classpath. That's where Spring JavaScript resources
|
||||
are bundled. However, you can modify the location attribute in the above configuration in order
|
||||
to serve resources from any classpath or web application relative location.
|
||||
</para>
|
||||
<para>
|
||||
Note that the full resource URL depends on how your DispatcherServlet is mapped.
|
||||
In the mvc-booking sample we've chosen to map it with the default servlet mapping '/':
|
||||
</para>
|
||||
<programlisting language="xml"><![CDATA[
|
||||
<servlet>
|
||||
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
|
||||
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
|
||||
</servlet>
|
||||
|
||||
<servlet-mapping>
|
||||
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
|
||||
<url-pattern>/</url-pattern>
|
||||
</servlet-mapping>
|
||||
]]>
|
||||
</programlisting>
|
||||
<para>
|
||||
That means the full URL to load <code>Spring.js</code> is <code>/myapp/resources/spring/Spring.js</code>.
|
||||
If your <code>DispatcherServlet</code> was instead mapped to <code>/main/*</code> then the full
|
||||
URL would be <code>/myapp/main/resources/spring/Spring.js</code>.
|
||||
</para>
|
||||
<para>
|
||||
When using of the default servlet mapping it is also recommended to add this to your Spring MVC
|
||||
configuration, which ensures that any resource requests not handled by your Spring MVC mappings
|
||||
will be delegated back to the Servlet container.
|
||||
</para>
|
||||
<programlisting language="xml"><![CDATA[
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:mvc="http://www.springframework.org/schema/mvc"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
|
||||
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
|
||||
|
||||
...
|
||||
|
||||
<mvc:default-servlet-handler />
|
||||
|
||||
</beans>
|
||||
]]>
|
||||
</programlisting>
|
||||
</sect1>
|
||||
<sect1 xml:id="spring-js-includes">
|
||||
<title>Including Spring Javascript in a Page</title>
|
||||
<para>
|
||||
Spring JS is designed such that an implementation of its API can be built for any of the popular Javascript toolkits.
|
||||
The initial implementation of Spring.js builds on the Dojo toolkit.
|
||||
</para>
|
||||
<para>
|
||||
Using Spring Javascript in a page requires including the underlying toolkit as normal,
|
||||
the <code>Spring.js</code> base interface file, and the <code>Spring-(library implementation).js</code> file for the underlying toolkit.
|
||||
As an example, the following includes obtain the Dojo implementation of Spring.js using the <code>ResourceServlet</code>:
|
||||
</para>
|
||||
<programlisting language="xml"><![CDATA[
|
||||
<script type="text/javascript" src="<c:url value="/resources/dojo/dojo.js" />"> </script>
|
||||
<script type="text/javascript" src="<c:url value="/resources/spring/Spring.js" />"> </script>
|
||||
<script type="text/javascript" src="<c:url value="/resources/spring/Spring-Dojo.js" />"> </script>]]>
|
||||
</programlisting>
|
||||
<para>
|
||||
When using the widget system of an underlying library, typically you must also include some CSS resources to obtain the desired look and feel.
|
||||
For the booking-mvc reference application, Dojo's <code>tundra.css</code> is included:
|
||||
</para>
|
||||
<programlisting language="xml"><![CDATA[
|
||||
<link type="text/css" rel="stylesheet" href="<c:url value="/resources/dijit/themes/tundra/tundra.css" />" />]]>
|
||||
</programlisting>
|
||||
</sect1>
|
||||
<sect1 xml:id="spring-js-decorations">
|
||||
<title>Spring Javascript Decorations</title>
|
||||
<para>
|
||||
A central concept in Spring Javascript is the notion of applying decorations to existing DOM nodes.
|
||||
This technique is used to progressively enhance a web page such that the page will still be functional in a less capable browser.
|
||||
The <code>addDecoration</code> method is used to apply decorations.
|
||||
</para>
|
||||
<para>
|
||||
The following example illustrates enhancing a Spring MVC <code><form:input></code> tag with rich suggestion behavior:
|
||||
</para>
|
||||
<programlisting language="xml"><![CDATA[
|
||||
<form:input id="searchString" path="searchString"/>
|
||||
<script type="text/javascript">
|
||||
Spring.addDecoration(new Spring.ElementDecoration({
|
||||
elementId: "searchString",
|
||||
widgetType: "dijit.form.ValidationTextBox",
|
||||
widgetAttrs: { promptMessage : "Search hotels by name, address, city, or zip." }}));
|
||||
</script>]]>
|
||||
</programlisting>
|
||||
<para>
|
||||
The <code>ElementDecoration</code> is used to apply rich widget behavior to an existing DOM node.
|
||||
This decoration type does not aim to completely hide the underlying toolkit, so the toolkit's native widget type and attributes are used directly.
|
||||
This approach allows you to use a common decoration model to integrate any widget from the underlying toolkit in a consistent manner.
|
||||
See the <code>booking-mvc</code> reference application for more examples of applying decorations to do things from suggestions to client-side validation.
|
||||
</para>
|
||||
<para>
|
||||
When using the <code>ElementDecoration</code> to apply widgets that have rich validation behavior, a common need is to prevent the form from being submitted to the server until validation passes.
|
||||
This can be done with the <code>ValidateAllDecoration</code>:
|
||||
</para>
|
||||
<programlisting language="xml"><![CDATA[
|
||||
<input type="submit" id="proceed" name="_eventId_proceed" value="Proceed" />
|
||||
<script type="text/javascript">
|
||||
Spring.addDecoration(new Spring.ValidateAllDecoration({ elementId:'proceed', event:'onclick' }));
|
||||
</script>]]>
|
||||
</programlisting>
|
||||
<para>
|
||||
This decorates the "Proceed" button with a special onclick event handler that fires the client side validators and does not allow the form to submit until they pass successfully.
|
||||
</para>
|
||||
<para>
|
||||
An <code>AjaxEventDecoration</code> applies a client-side event listener that fires a remote Ajax request to the server. It also auto-registers a callback function to link in the response:
|
||||
</para>
|
||||
<programlisting language="xml"><![CDATA[
|
||||
<a id="prevLink" href="search?searchString=${criteria.searchString}&page=${criteria.page - 1}">Previous</a>
|
||||
<script type="text/javascript">
|
||||
Spring.addDecoration(new Spring.AjaxEventDecoration({
|
||||
elementId: "prevLink",
|
||||
event: "onclick",
|
||||
params: { fragments: "body" }
|
||||
}));
|
||||
</script>]]>
|
||||
</programlisting>
|
||||
<para>
|
||||
This decorates the onclick event of the "Previous Results" link with an Ajax call, passing along a special parameter that specifies the fragment to be re-rendered in the response.
|
||||
Note that this link would still be fully functional if Javascript was unavailable in the client.
|
||||
(See <xref linkend="spring-js-ajax"/> for details on how this request is handled on the server.)
|
||||
</para>
|
||||
<para>
|
||||
It is also possible to apply more than one decoration to an element.
|
||||
The following example shows a button being decorated with Ajax and validate-all submit suppression:
|
||||
</para>
|
||||
<programlisting language="xml"><![CDATA[
|
||||
<input type="submit" id="proceed" name="_eventId_proceed" value="Proceed" />
|
||||
<script type="text/javascript">
|
||||
Spring.addDecoration(new Spring.ValidateAllDecoration({elementId:'proceed', event:'onclick'}));
|
||||
Spring.addDecoration(new Spring.AjaxEventDecoration({elementId:'proceed', event:'onclick',formId:'booking', params:{fragments:'messages'}}));
|
||||
</script>]]>
|
||||
</programlisting>
|
||||
<para>
|
||||
It is also possible to apply a decoration to multiple elements in a single statement using Dojo's query API.
|
||||
The following example decorates a set of checkbox elements as Dojo Checkbox widgets:
|
||||
</para>
|
||||
<programlisting language="xml"><![CDATA[
|
||||
<div id="amenities">
|
||||
<form:checkbox path="amenities" value="OCEAN_VIEW" label="Ocean View" /></li>
|
||||
<form:checkbox path="amenities" value="LATE_CHECKOUT" label="Late Checkout" /></li>
|
||||
<form:checkbox path="amenities" value="MINIBAR" label="Minibar" /></li>
|
||||
<script type="text/javascript">
|
||||
dojo.query("#amenities input[type='checkbox']").forEach(function(element) {
|
||||
Spring.addDecoration(new Spring.ElementDecoration({
|
||||
elementId: element.id,
|
||||
widgetType : "dijit.form.CheckBox",
|
||||
widgetAttrs : { checked : element.checked }
|
||||
}));
|
||||
});
|
||||
</script>
|
||||
</div>]]>
|
||||
</programlisting>
|
||||
</sect1>
|
||||
<sect1 xml:id="spring-js-ajax">
|
||||
<title>Handling Ajax Requests</title>
|
||||
<para>
|
||||
TODO
|
||||
</para>
|
||||
<para>
|
||||
Spring Web Flow's Ajax response handling is built upon the notion of receiving "fragments" back from the server.
|
||||
Spring Javascript's client-side Ajax response handling is built upon the notion of receiving "fragments" back from the server.
|
||||
These fragments are just standard HTML that is meant to replace portions of the existing page.
|
||||
The key piece needed on the server is a way to determine which pieces of a full response need to be pulled out for partial rendering.
|
||||
</para>
|
||||
@@ -22,11 +236,11 @@
|
||||
In order to be able to render partial fragments of a full response, the full response must be built using a
|
||||
templating technology that allows the use of composition for constructing the response, and for the member
|
||||
parts of the composition to be referenced and rendered individually.
|
||||
Spring Web Flow provides some simple Spring MVC extensions that make use of Tiles to achieve this.
|
||||
Spring Javascript provides some simple Spring MVC extensions that make use of Tiles to achieve this.
|
||||
The same technique could theoretically be used with any templating system supporting composition.
|
||||
</para>
|
||||
<para>
|
||||
Spring Web Flow's Ajax remoting functionality is built upon the notion that the core handling code for an
|
||||
Spring Javascript's Ajax remoting functionality is built upon the notion that the core handling code for an
|
||||
Ajax request should not differ from a standard browser request, thus no special knowledge of an Ajax request
|
||||
is needed directly in the code and the same hanlder can be used for both styles of request.
|
||||
</para>
|
||||
|
||||
@@ -101,4 +101,204 @@
|
||||
</para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
<sect1 xml:id="whatsnew-swf-230">
|
||||
<title>Spring Web Flow 2.3</title>
|
||||
<sect2 xml:id="whatsnew-swf-embedded-flow">
|
||||
<title>Embedding A Flow On A Page</title>
|
||||
<para>
|
||||
By default Web Flow does a client-side redirect upon entering every view state.
|
||||
That makes it impossible to embed a flow on a page or within a modal dialog and execute more than one view state without causing a full-page refresh.
|
||||
Web Flow now supports launching a flow in "embedded" mode.
|
||||
In this mode a flow can transition to other view states without a client-side redirect during Ajax requests.
|
||||
See <xref linkend="spring-mvc-embedded-flow"/> and <xref linkend="spring-faces-embedded-mode"/>.
|
||||
</para>
|
||||
</sect2>
|
||||
<sect2 xml:id="whatsnew-jsr303">
|
||||
<title>Support For JSR-303 Bean Validation</title>
|
||||
<para>
|
||||
Support for the JSR-303 Bean Validation API is now available building on equivalent support available in Spring MVC.
|
||||
See <xref linkend="view-validate"/> for more details.
|
||||
</para>
|
||||
</sect2>
|
||||
<sect2 xml:id="whatsnew-pc-propagation">
|
||||
<title>Flow-Managed Persistence Context Propagation</title>
|
||||
<para>
|
||||
Starting with Web Flow 2.3 a flow managed <code>PersistenceContext</code> is automatically extended (propagated) to sub-flows assuming the subflow also has the feature enabled as well.
|
||||
See <xref linkend="flow-managed-persistence-propagation"/>.
|
||||
</para>
|
||||
</sect2>
|
||||
<sect2 xml:id="whatsnew-portlet-resource-requests">
|
||||
<title>Portlet 2.0 Resource Requests</title>
|
||||
<para>
|
||||
Support for Portlet 2.0 resource requests has now been added enabling Ajax requests with partial rendering.
|
||||
URLs for such requests can be prepared with the <code><portlet:resourceURL></code> tag in JSP pages.
|
||||
Server-side processing is similar to a combined an action and a render requests but combined in a single request.
|
||||
Unlike a render request, the response from a resource request includes content from the target portlet only.
|
||||
</para>
|
||||
</sect2>
|
||||
<sect2 xml:id="whatsnew-conversation-manager">
|
||||
<title>Custom ConversationManager</title>
|
||||
<para>
|
||||
The <code><flow-execution-repository></code> element now provides a conversation-manager attribute accepting a reference to a ConversationManager instance.
|
||||
</para>
|
||||
</sect2>
|
||||
<sect2 xml:id="whatsnew-redirect-in-same-state">
|
||||
<title>Redirect In Same State</title>
|
||||
<para>
|
||||
By default Web Flow does a client-side redirect when remaining in the same view state as long as the current request is not an Ajax request.
|
||||
This is useful after form validation failure.
|
||||
Hitting Refresh or Back won't result in browser warnings.
|
||||
Hence this behavior is usually desirable.
|
||||
However a new flow execution attribute makes it possible to disable it and that may also be necessary in some cases specific to JSF applications.
|
||||
See <xref linkend="spring-faces-redirect-in-same-state"/>.
|
||||
</para>
|
||||
</sect2>
|
||||
<sect2 xml:id="whatsnew-samples">
|
||||
<title>Samples</title>
|
||||
<para>
|
||||
The process for building the samples included with the distribution has been simplified.
|
||||
Maven can be used to build all samples in one step.
|
||||
Eclipse settings include source code references to simplify debugging.
|
||||
</para>
|
||||
<para>
|
||||
Additional samples can be accessed as follows:
|
||||
<programlisting language="xml">mkdir spring-samples
|
||||
cd spring-samples
|
||||
svn co https://src.springframework.org/svn/spring-samples/webflow-primefaces-showcase
|
||||
cd webflow-primefaces-showcase
|
||||
mvn package
|
||||
# import into Eclipse
|
||||
</programlisting>
|
||||
|
||||
<programlisting language="xml">mkdir spring-samples
|
||||
cd spring-samples
|
||||
svn co https://src.springframework.org/svn/spring-samples/webflow-showcase
|
||||
cd webflow-showcase
|
||||
mvn package
|
||||
# import into Eclipse
|
||||
</programlisting>
|
||||
</para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
<sect1 xml:id="whatsnew-swf-220">
|
||||
<title>Spring Web Flow 2.2</title>
|
||||
<sect2 xml:id="whatsnew-jsf2">
|
||||
<title>JSF 2 Support</title>
|
||||
<sect3>
|
||||
<title>Comprehensive JSF 2 Support</title>
|
||||
<para>
|
||||
Building on 2.1, Spring Web Flow version 2.2 adds support for core JSF 2 features
|
||||
The following features that were not supported in 2.1 are now available:
|
||||
partial state saving, JSF 2 resource request, handling, and JSF 2 Ajax requests.
|
||||
At this point support for JSF 2 is considered
|
||||
comprehensive although not covering every JSF 2 feature --
|
||||
excluded are mostly features that overlap with the core value Web Flow provides
|
||||
such as those relating to navigation and state management.
|
||||
</para>
|
||||
<para>
|
||||
See <xref linkend="spring-faces-webflow-config"/> for important configuration changes.
|
||||
Note that partial state saving is only supported with Sun Mojarra 2.0.3 or later.
|
||||
It is not yet supported with Apache MyFaces. This is due to the
|
||||
fact MyFaces was not as easy to customize with regards to how component state is stored.
|
||||
We will work with Apache MyFaces to provide this support. In the mean time you will need to use
|
||||
the <code>javax.faces.PARTIAL_STATE_SAVING</code> context parameter in <code>web.xml</code>
|
||||
to disable partial state saving with Apache MyFaces.
|
||||
</para>
|
||||
</sect3>
|
||||
<sect3>
|
||||
<title>Travel Sample With the PrimeFaces Components</title>
|
||||
<para>
|
||||
The main Spring Travel sample demonstrating Spring Web Flow and JSF support
|
||||
is now built on JSF 2 and components from the PrimeFaces component library.
|
||||
Please check out the booking-faces sample in the distribution.
|
||||
</para>
|
||||
<para>
|
||||
Additional samples can be found at the Spring Web Flow - Prime Faces
|
||||
<link xl:href="https://src.springframework.org/svn/spring-samples/webflow-primefaces-showcase">
|
||||
Showcase</link>, an SVN repository within the
|
||||
<link xl:href="https://src.springframework.org/svn/spring-samples">spring-samples</link>
|
||||
repository. Use these commands to check out and build:
|
||||
</para>
|
||||
<programlisting><![CDATA[svn co https://src.springframework.org/svn/spring-samples/webflow-primefaces-showcase
|
||||
cd webflow-primefaces-showcase
|
||||
mvn package
|
||||
]]></programlisting>
|
||||
|
||||
</sect3>
|
||||
</sect2>
|
||||
<sect2 xml:id="whatsnew-sec">
|
||||
<title>Spring Security Facelets Tag Library</title>
|
||||
<para>
|
||||
A new Spring Security tag library is available for use with with JSF 2.0 or with JSF 1.2 Facelets views.
|
||||
It provides an <authorize> tag as well as several EL functions.
|
||||
See <xref linkend="spring-faces-security-taglib"/> for more details.
|
||||
</para>
|
||||
</sect2>
|
||||
<sect2 xml:id="whatsnew-versions">
|
||||
<title>Spring JavaScript Updates</title>
|
||||
<sect3>
|
||||
<title>Deprecated ResourcesServlet</title>
|
||||
<para>
|
||||
Starting with Spring 3.0.4, the Spring Framework includes
|
||||
a replacement for the ResourcesServlet. Please see
|
||||
the Spring Framework documentation for details on the custom mvc namespace,
|
||||
specifically the new
|
||||
<link xl:href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-static-resources">"resources"</link>
|
||||
element.
|
||||
</para>
|
||||
</sect3>
|
||||
<sect3>
|
||||
<title>Dojo 1.5 and dojox</title>
|
||||
<para>
|
||||
The bundled custom Dojo build is upgraded to version 1.5. It now includes dojox.
|
||||
</para>
|
||||
<para>
|
||||
Note that applications are generally encouraged to prepare their own custom
|
||||
Dojo build for optimized performance depending on what parts of Dojo are
|
||||
commonly used together. For examples see the
|
||||
<link xl:href="https://src.springframework.org/svn/spring-webflow/branches/spring-webflow-2.2-maintenance/spring-js-resources/scripts/dojo">scripts</link>
|
||||
used by Spring Web Flow to prepare its own custom Dojo build.
|
||||
</para>
|
||||
</sect3>
|
||||
<sect3>
|
||||
<title>Two Spring JS artifacts</title>
|
||||
<para>
|
||||
The <code>spring-js</code> artifact has been split in two -- the new artifact
|
||||
(<code>spring-js-resources</code>) contains client side resource (.js, .css, etc.) while
|
||||
the existing artifact (<code>spring-js</code>) contains server-side Java code only.
|
||||
</para>
|
||||
<para>
|
||||
Applications preparing their own custom Dojo build have an option now to
|
||||
avoid including <code>spring-js-resources</code> and put <code>Spring.js</code> and
|
||||
<code>Spring-Dojo.js</code> directly under the root of their web application.
|
||||
</para>
|
||||
</sect3>
|
||||
<sect3>
|
||||
<title>Client resources moved into META-INF/web-resources</title>
|
||||
<para>
|
||||
Bundled client resources (.js, .css, etc.)
|
||||
have been moved to <code>META-INF/web-resources</code> from their previous location
|
||||
under <code>META-INF</code>. This change is transparent for applications but will result
|
||||
in simpler and safer configuration when using the new resource handling
|
||||
mechanism available in Spring 3.0.4.
|
||||
</para>
|
||||
</sect3>
|
||||
</sect2>
|
||||
<sect2 xml:id="whatsnew-jsf-portlet">
|
||||
<title>JSF Portlet Support</title>
|
||||
<sect3>
|
||||
<title>Portlet API 2.0 and JSF 1.2 support</title>
|
||||
<para>
|
||||
In previous versions of Spring Web Flow support for JSF Portlets relied on
|
||||
a Portlet Bridge for JSF implementation and was considered experimental.
|
||||
Spring Web Flow 2.2 adds support for JSF Portlets based on its own internal
|
||||
Portlet integration targeting Portlet API 2.0 and JSF 1.2 environments.
|
||||
See <xref linkend="portlet-jsf"/> for more details.
|
||||
The Spring Web Flow Travel JSF Portlets sample has been successfully
|
||||
tested on the Apache Pluto portal container.
|
||||
</para>
|
||||
</sect3>
|
||||
</sect2>
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
||||
Reference in New Issue
Block a user