Roughly merges trunk HEAD in order to later merge in jackrabbit20120501 branch

git-svn-id: https://svn.apache.org/repos/asf/ofbiz/branches/jackrabbit20100709@1553090 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/.classpath b/.classpath
index e93cb8e..9e90421 100644
--- a/.classpath
+++ b/.classpath
@@ -1,36 +1,42 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
+    <classpathentry kind="con" path="GROOVY_SUPPORT" exported="true"/>
     <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-    <classpathentry kind="lib" path="applications/content/lib/fontbox-1.7.1.jar"/>
-    <classpathentry kind="lib" path="applications/content/lib/jempbox-1.7.1.jar"/>
-    <classpathentry kind="lib" path="applications/content/lib/pdfbox-1.7.1.jar"/>
+    <classpathentry kind="lib" path="applications/content/lib/fontbox-1.4.0.jar"/>
+    <classpathentry kind="lib" path="applications/content/lib/jempbox-1.4.0.jar"/>
+    <classpathentry kind="lib" path="applications/content/lib/lucene-core-3.5.0.jar"/>
+    <classpathentry kind="lib" path="applications/content/lib/pdfbox-1.4.0.jar"/>
     <classpathentry kind="lib" path="applications/content/lib/dom4j-1.6.1.jar"/>
-    <classpathentry kind="lib" path="applications/content/lib/poi-3.9-20121203.jar"/>
+    <classpathentry kind="lib" path="applications/content/lib/poi-3.8-beta5-20111217.jar"/>
+    <classpathentry kind="lib" path="applications/content/lib/poi-ooxml-3.8-beta5-20111217.jar"/>
+    <classpathentry kind="lib" path="applications/content/lib/poi-ooxml-schemas-3.8-beta5-20111217.jar"/>
+    <classpathentry kind="lib" path="applications/content/lib/poi-scratchpad-3.8-beta5-20111217.jar"/>
     <classpathentry kind="lib" path="applications/content/lib/tika-core-1.0.jar"/>
     <classpathentry kind="lib" path="applications/content/lib/tika-parsers-1.0.jar"/>
     <classpathentry kind="lib" path="applications/product/lib/watermarker-0.0.4.jar"/>
     <classpathentry kind="lib" path="applications/product/lib/dozer-4.2.1.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/ant-1.9.0-ant.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/ant-1.9.0-ant-junit.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/ant-1.9.0-ant-launcher.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/ant/ant-1.9.0-ant-apache-bsf.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/ant-1.8.2.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/ant-junit-1.8.2.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/ant-launcher-1.8.2.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/ant-trax-1.8.0.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/ant/ant-apache-bsf-1.8.2.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/ant/ant-nodeps-1.8.1.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/antisamy-bin.1.2.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/avalon-framework-4.2.0.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/avalon-util-exception-1.0.0.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/barcode4j-2.1-barcode4j-fop-ext-complete.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/barcode4j-fop-ext-complete-2.0.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/batik-all-1.7.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/clhm-release-1.0-lru.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/hamcrest-all-1.2.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/fop-1.1.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/freemarker-2.3.19-null-wildcards.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/httpclient-4.2.1.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/httpclient-cache-4.2.1.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/httpcore-4.2.1.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/httpmime-4.2.1.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/httpunit-1.7.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/fop-1.0.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/freemarker-2.3.10.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/httpclient-4.1.1.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/httpclient-cache-4.1.1.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/httpcore-4.1.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/httpmime-4.1.1.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/httpunit.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/ical4j-1.0-rc2.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/icu4j-49_1.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/icu4j-4_4.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/ivy-2.2.0.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/javolution-5.4.3.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/jcip-annotations-1.0.jar"/>
@@ -38,55 +44,57 @@
     <classpathentry kind="lib" path="framework/base/lib/jdom-1.1.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/jpim-0.1.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/juel-2.2.1.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/junit-dep-4.10.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/log4j-1.2.17.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/mail-1.4.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/junit.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/junitperf.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/log4j-1.2.15.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/mail.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/mx4j-3.0.1.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/mx4j-remote-3.0.1.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/nekohtml-1.9.16.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/owasp-esapi-full-java-1.4-patched-by-OFBIZ-3135.jar"/>    
+    <classpathentry kind="lib" path="framework/base/lib/nekohtml.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/owasp-esapi-full-java-1.4.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/resolver-2.9.1.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/serializer-2.9.1.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/slf4j-api-1.6.4.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/Tidy.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/xercesImpl-2.9.1.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/ws-commons-java5-1.0.1.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/ws-commons-util-1.0.2.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/xml-apis-2.9.1.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/xml-apis-ext-1.3.04.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/xmlgraphics-commons-1.5.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/xmlgraphics-commons-1.4.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/xmlrpc-client-3.1.2.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/xmlrpc-common-3.1.2.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/xmlrpc-server-3.1.2.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/xstream-1.3.1.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/xpp3_min-1.1.4c.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/commons/commons-beanutils-core-1.8.3.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/commons/commons-cli-1.2.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/commons/commons-codec-1.6.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/commons/commons-collections-3.2.1.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/commons/commons-compress-1.4.1.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/commons/commons-digester3-3.2.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/commons/commons-beanutils-1.7.0.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/commons/commons-cli-1.0.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/commons/commons-codec-1.4.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/commons/commons-collections-3.2.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/commons/commons-digester-1.8.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/commons/commons-discovery-0.4.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/commons/commons-el-1.0.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/commons/commons-fileupload-1.2.2.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/commons/commons-io-2.4.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/commons/commons-lang-2.6.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/commons/commons-logging-1.1.2.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/commons/commons-modeler-2.0.1.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/commons/commons-net-3.1.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/commons/commons-io-1.4.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/commons/commons-lang-2.4.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/commons/commons-logging-1.1.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/commons/commons-modeler-2.0.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/commons/commons-net-1.4.1.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/commons/commons-pool-1.3.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/commons/commons-primitives-1.0.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/commons/commons-validator-1.4.0.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/commons/commons-csv-1.0.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/commons/commons-validator-1.3.1.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/commons/commons-vfs-20070730.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/j2eespecs/geronimo-activation_1.0.2_spec-1.0.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/j2eespecs/geronimo-j2ee-connector_1.5_spec-1.0.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/j2eespecs/geronimo-jaxr_1.0_spec-1.0.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/j2eespecs/geronimo-jaxrpc_1.1_spec-1.0.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/j2eespecs/geronimo-jms_1.1_spec-1.0.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/j2eespecs/geronimo-jta_1.1_spec-1.1.1.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/j2eespecs/geronimo-qname_1.1_spec-1.0.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/j2eespecs/geronimo-saaj_1.1_spec-1.0.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/j2eespecs/annotations-api-3.0.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/j2eespecs/jsp-api-2.2.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/j2eespecs/servlet-api-3.0.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/j2eespecs/tomcat-7.0.23.annotations-api.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/j2eespecs/tomcat-7.0.23.el-api.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/j2eespecs/tomcat-7.0.23.jsp-api.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/j2eespecs/tomcat-7.0.23.servlet-api.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/scripting/antlr-2.7.6.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/scripting/asm-3.2.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/scripting/asm-analysis-3.2.jar"/>
@@ -94,38 +102,67 @@
     <classpathentry kind="lib" path="framework/base/lib/scripting/asm-util-3.2.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/scripting/bsf-2.4.0.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/scripting/bsh-2.0b4.jar"/>
-    <classpathentry kind="lib" path="framework/base/lib/scripting/groovy-all-2.1.9.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/scripting/groovy-all-1.7.7.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/scripting/jakarta-oro-2.0.8.jar"/>
     <classpathentry kind="lib" path="framework/base/lib/scripting/jython-nooro.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/birt/lib/org.eclipse.birt.runtime_3.7.2.v20120214-1408.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/birt/lib/viewservlets.jar"/>
-    <classpathentry kind="lib" path="framework/catalina/lib/ecj-4.2.2.jar"/>
-    <classpathentry kind="lib" path="framework/catalina/lib/tomcat-7.0.47-catalina-ha.jar"/>
-    <classpathentry kind="lib" path="framework/catalina/lib/tomcat-7.0.47-catalina-tribes.jar"/>
-    <classpathentry kind="lib" path="framework/catalina/lib/tomcat-7.0.47-tomcat-embed-core.jar"/>
-    <classpathentry kind="lib" path="framework/catalina/lib/tomcat-7.0.47-tomcat-embed-jasper.jar"/>
-    <classpathentry kind="lib" path="framework/catalina/lib/tomcat-7.0.47-tomcat-embed-logging-log4j.jar"/>
-    <classpathentry kind="lib" path="framework/entity/lib/commons-dbcp-1.4.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/scripting/jansi-1.2.1.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/scripting/jline-0.9.94.jar"/>
+    <classpathentry kind="lib" path="framework/birt/lib/chartengineapi.jar"/>
+    <classpathentry kind="lib" path="framework/birt/lib/chartitemapi.jar"/>
+    <classpathentry kind="lib" path="framework/birt/lib/coreapi.jar"/>
+    <classpathentry kind="lib" path="framework/birt/lib/crosstabcoreapi.jar"/>
+    <classpathentry kind="lib" path="framework/birt/lib/dataadapterapi.jar"/>
+    <classpathentry kind="lib" path="framework/birt/lib/dataaggregationapi.jar"/>
+    <classpathentry kind="lib" path="framework/birt/lib/dataextraction.jar"/>
+    <classpathentry kind="lib" path="framework/birt/lib/dteapi.jar"/>
+    <classpathentry kind="lib" path="framework/birt/lib/emitterconfig.jar"/>
+    <classpathentry kind="lib" path="framework/birt/lib/engineapi.jar"/>
+    <classpathentry kind="lib" path="framework/birt/lib/jaxrpc.jar"/>
+    <classpathentry kind="lib" path="framework/birt/lib/modelapi.jar"/>
+    <classpathentry kind="lib" path="framework/birt/lib/modelodaapi.jar"/>
+    <classpathentry kind="lib" path="framework/birt/lib/odadesignapi.jar"/>
+    <classpathentry kind="lib" path="framework/birt/lib/saaj.jar"/>
+    <classpathentry kind="lib" path="framework/birt/lib/scriptapi.jar"/>
+    <classpathentry kind="lib" path="framework/birt/lib/viewservlets.jar"/>
+    <classpathentry kind="lib" path="framework/catalina/lib/ecj-3.7.jar"/>
+    <classpathentry kind="lib" path="framework/catalina/lib/tomcat-7.0.23.tomcat-juli-adapters.jar"/>
+    <classpathentry kind="lib" path="framework/catalina/lib/tomcat-7.0.23.tomcat-juli.jar"/>
+    <classpathentry kind="lib" path="framework/catalina/lib/tomcat-7.0.23.catalina-ant.jar"/>
+    <classpathentry kind="lib" path="framework/catalina/lib/tomcat-7.0.23.catalina-ha.jar"/>
+    <classpathentry kind="lib" path="framework/catalina/lib/tomcat-7.0.23.catalina-tribes.jar"/>
+    <classpathentry kind="lib" path="framework/catalina/lib/tomcat-7.0.23.catalina.jar"/>
+    <classpathentry kind="lib" path="framework/catalina/lib/tomcat-7.0.23.jasper-el.jar"/>
+    <classpathentry kind="lib" path="framework/catalina/lib/tomcat-7.0.23.jasper.jar"/>
+    <classpathentry kind="lib" path="framework/catalina/lib/tomcat-7.0.23.tomcat-coyote.jar"/>
+    <classpathentry kind="lib" path="framework/catalina/lib/tomcat-7.0.23.tomcat-dbcp.jar"/>
+    <classpathentry kind="lib" path="framework/catalina/lib/tomcat-7.0.23.tomcat-api.jar"/>
+    <classpathentry kind="lib" path="framework/catalina/lib/tomcat-7.0.23.tomcat-util.jar"/>
+    <classpathentry kind="lib" path="framework/entity/lib/commons-dbcp-1.3-20091113-r835956.jar"/>
+    <classpathentry kind="lib" path="framework/entity/lib/ofbiz-minerva.jar"/>
     <classpathentry kind="lib" path="framework/geronimo/lib/geronimo-connector-2.1.1.jar"/>
     <classpathentry kind="lib" path="framework/geronimo/lib/geronimo-transaction-2.1.1.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/jetty/lib/com.sun.el-2.2.0.v201108011116.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/jetty/lib/javax.servlet.jsp.jstl-1.2.0.v201105211821.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/jetty/lib/jetty-ajp-8.1.2.v20120308.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/jetty/lib/jetty-continuation-8.1.2.v20120308.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/jetty/lib/jetty-http-8.1.2.v20120308.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/jetty/lib/jetty-io-8.1.2.v20120308.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/jetty/lib/jetty-security-8.1.2.v20120308.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/jetty/lib/jetty-server-8.1.2.v20120308.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/jetty/lib/jetty-servlet-8.1.2.v20120308.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/jetty/lib/jetty-util-8.1.2.v20120308.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/jetty/lib/jetty-webapp-8.1.2.v20120308.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/jetty/lib/jetty-xml-8.1.2.v20120308.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/jetty/lib/org.apache.jasper.glassfish-2.2.2.v201112011158.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/jetty/lib/org.apache.taglibs.standard.glassfish-1.2.0.v201112081803.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/jetty/lib/org.eclipse.jdt.core-3.7.1.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/birt/lib/axis-1.4.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/birt/lib/axis-ant-1.4.jar"/>
-    <classpathentry kind="lib" path="framework/service/lib/wsdl4j-1.6.2.jar"/>
+    <classpathentry kind="lib" path="framework/guiapp/lib/XuiCoreSwing-v3.2rc2b.jar"/>
+    <classpathentry kind="lib" path="framework/guiapp/lib/XuiOptional-v3.2rc2b.jar"/>
+    <classpathentry kind="lib" path="framework/jcr/lib/concurrent-1.3.4.jar"/>
+    <classpathentry kind="lib" path="framework/jcr/lib/jackrabbit-api-2.3.3.jar"/>
+    <classpathentry kind="lib" path="framework/jcr/lib/jackrabbit-core-2.3.3.jar"/>
+    <classpathentry kind="lib" path="framework/jcr/lib/jackrabbit-jca-2.3.3.jar"/>
+    <classpathentry kind="lib" path="framework/jcr/lib/jackrabbit-jcr-commons-2.3.3.jar"/>
+    <classpathentry kind="lib" path="framework/jcr/lib/jackrabbit-spi-2.3.3.jar"/>
+    <classpathentry kind="lib" path="framework/jcr/lib/jackrabbit-spi-commons-2.3.3.jar"/>
+    <classpathentry kind="lib" path="framework/jcr/lib/jackrabbit-ocm-2.0.jar" sourcepath="/ocm"/>
+    <classpathentry kind="lib" path="framework/jcr/lib/jcr-2.0.jar"/>
+    <classpathentry kind="lib" path="framework/jcr/lib/tika-core-0.10.jar"/>
+    <classpathentry kind="lib" path="framework/jcr/lib/tika-parsers-0.10.jar"/>
+    <classpathentry kind="lib" path="framework/jetty/lib/jasper-compiler-5.5.15.jar"/>
+    <classpathentry kind="lib" path="framework/jetty/lib/jasper-runtime-5.5.15.jar"/>
+    <classpathentry kind="lib" path="framework/jetty/lib/jetty-6.1.11.jar"/>
+    <classpathentry kind="lib" path="framework/jetty/lib/jetty-ajp-6.1.11.jar"/>
+    <classpathentry kind="lib" path="framework/jetty/lib/jetty-sslengine-6.1.11.jar"/>
+    <classpathentry kind="lib" path="framework/jetty/lib/jetty-util-6.1.11.jar"/>
+    <classpathentry kind="lib" path="framework/service/lib/axis.jar"/>
+    <classpathentry kind="lib" path="framework/service/lib/axis-ant.jar"/>
+    <classpathentry kind="lib" path="framework/service/lib/wsdl4j.jar"/>
     <classpathentry kind="lib" path="framework/service/lib/axiom-api-1.2.9.jar"/>
     <classpathentry kind="lib" path="framework/service/lib/axiom-impl-1.2.9.jar"/>
     <classpathentry kind="lib" path="framework/service/lib/axis2-kernel-1.5.2.jar"/>
@@ -134,6 +171,7 @@
     <classpathentry kind="lib" path="framework/service/lib/commons-httpclient-3.1.jar"/>
     <classpathentry kind="lib" path="framework/service/lib/neethi-2.0.4.jar"/>
     <classpathentry kind="lib" path="framework/service/lib/XmlSchema-1.4.3.jar"/>
+    <classpathentry kind="lib" path="framework/testtools/lib/selenium-java-client-driver.jar"/>
     <classpathentry kind="lib" path="framework/testtools/lib/org.springframework.test-3.1.0.M2.jar"/>
     <classpathentry kind="lib" path="framework/testtools/lib/org.springframework.web-3.1.0.M2.jar"/>
     <classpathentry kind="lib" path="framework/testtools/lib/org.springframework.core-3.1.0.M2.jar"/>
@@ -143,57 +181,93 @@
     <classpathentry kind="lib" path="framework/webapp/lib/json-lib-2.2.3-jdk15.jar"/>
     <classpathentry kind="lib" path="framework/webapp/lib/rome-0.9.jar"/>
     <classpathentry kind="lib" path="framework/webapp/lib/velocity-1.6.1.jar"/>
+    <classpathentry kind="lib" path="framework/base/lib/webslinger-base-invoker-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-base-cache-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-base-collections-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-base-collections-arrays-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-base-concurrent-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-base-html-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-base-io-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-base-javacc-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-base-junit-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-base-lang-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-base-logging-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-base-resolver-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-base-util-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-base-xml-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-catalina-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-cgi-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-embryo-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-extension-beanshell-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-extension-bsf-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-extension-code-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-extension-commonsvfs-object-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-extension-directory-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-extension-freemarker-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-extension-groovy-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-extension-image-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-extension-janino-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-extension-jruby-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-extension-jython-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-extension-nutch-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-extension-plan9-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-extension-quercus-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-extension-rhino-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-extension-servlet-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-extension-template-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-extension-velocity-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-extension-wiki-20091211-3897-7ab22baea4b6.jar"/>
+    <classpathentry kind="lib" path="framework/webslinger/lib/webslinger-launcher-20091211-3897-7ab22baea4b6.jar"/>
     <classpathentry kind="lib" path="specialpurpose/googlecheckout/lib/checkout-sdk-0.8.8.jar"/>
     <classpathentry kind="lib" path="specialpurpose/ldap/lib/cas-server-core-3.3.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/pos/lib/XuiCoreSwing-v3.2rc2b.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/pos/lib/XuiOptional-v3.2rc2b.jar"/>
     <classpathentry kind="lib" path="specialpurpose/pos/lib/jcl.jar"/>
     <classpathentry kind="lib" path="specialpurpose/pos/lib/jpos18-controls.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/pos/lib/looks-2.0.2.jar"/>    
+    <classpathentry kind="lib" path="specialpurpose/pos/lib/looks-2.0.2.jar"/>
     <classpathentry kind="lib" path="specialpurpose/ebaystore/lib/attributes.jar"/>
     <classpathentry kind="lib" path="specialpurpose/ebaystore/lib/ebaycalls.jar"/>
     <classpathentry kind="lib" path="specialpurpose/ebaystore/lib/ebaysdkcore.jar"/>
     <classpathentry kind="lib" path="specialpurpose/ebaystore/lib/helper.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/lucene/lib/lucene-analyzers-common-4.5.1.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/lucene/lib/lucene-core-4.5.1.jar"/>
-    <classpathentry kind="lib" path="specialpurpose/lucene/lib/lucene-queryparser-4.5.1.jar"/>
-    <classpathentry excluding="org/ofbiz/accounting/thirdparty/cybersource/**|org/ofbiz/accounting/thirdparty/verisign/**|org/ofbiz/accounting/thirdparty/worldpay/**|org/ofbiz/accounting/thirdparty/paypal/PayPalServices.java|org/ofbiz/accounting/thirdparty/orbital/**|org/ofbiz/accounting/thirdparty/securepay/**|org/ofbiz/accounting/thirdparty/ideal/**" kind="src" path="applications/accounting/src"/>
-    <classpathentry excluding="org/ofbiz/content/openoffice/|org/ofbiz/content/report/" kind="src" path="applications/content/src"/>
+    <classpathentry kind="src" path="applications/accounting/src" excluding="org/ofbiz/accounting/thirdparty/cybersource/**|org/ofbiz/accounting/thirdparty/verisign/**|org/ofbiz/accounting/thirdparty/worldpay/**|org/ofbiz/accounting/thirdparty/paypal/PayPalServices.java|org/ofbiz/accounting/thirdparty/orbital/**|org/ofbiz/accounting/thirdparty/securepay/**|org/ofbiz/accounting/thirdparty/ideal/**"/>
+    <classpathentry kind="src" path="applications/content/src" excluding="org/ofbiz/content/openoffice/|org/ofbiz/content/report/"/>
     <classpathentry kind="src" path="applications/manufacturing/src"/>
     <classpathentry kind="src" path="applications/marketing/src"/>
-    <classpathentry excluding="org/ofbiz/order/thirdparty/taxware/**" kind="src" path="applications/order/src"/>
+    <classpathentry kind="src" path="applications/order/src" excluding="org/ofbiz/order/thirdparty/taxware/**"/>
     <classpathentry kind="src" path="applications/party/src"/>
-    <classpathentry excluding="ShipmentScaleApplet.java" kind="src" path="applications/product/src"/>
-    <classpathentry excluding="org/ofbiz/securityext/thirdparty/truition/TruitionCoReg.java" kind="src" path="applications/securityext/src"/>
+    <classpathentry kind="src" path="applications/product/src" excluding="ShipmentScaleApplet.java"/>
+    <classpathentry kind="src" path="applications/securityext/src" excluding="org/ofbiz/securityext/thirdparty/truition/TruitionCoReg.java"/>
     <classpathentry kind="src" path="applications/humanres/src"/>
     <classpathentry kind="src" path="applications/workeffort/src"/>
-    <classpathentry kind="src" path="specialpurpose/appserver/src"/>
+    <classpathentry kind="src" path="framework/appserver/src"/>
     <classpathentry kind="src" path="framework/base/build/gen-src/javacc"/>
-    <classpathentry excluding="org/ofbiz/base/config/CoberturaInstrumenter.java" kind="src" path="framework/base/src"/>
+    <classpathentry kind="src" path="framework/base/src" excluding="org/ofbiz/base/config/CoberturaInstrumenter.java"/>
     <classpathentry kind="src" path="framework/bi/src"/>
-    <classpathentry kind="src" path="specialpurpose/birt/src"/>
+    <classpathentry kind="src" path="framework/birt/src"/>
     <classpathentry kind="src" path="framework/catalina/src"/>
     <classpathentry kind="src" path="framework/common/src"/>
     <classpathentry kind="src" path="framework/datafile/src"/>
-    <classpathentry kind="src" path="framework/entity/src"/>
+    <classpathentry kind="src" path="framework/entity/src" excluding="org/ofbiz/entity/connection/XaPoolConnectionFactory.java"/>
     <classpathentry kind="src" path="framework/entityext/src"/>
+    <classpathentry kind="src" path="framework/example/src"/>
     <classpathentry kind="src" path="framework/geronimo/src"/>
-    <classpathentry kind="src" path="specialpurpose/jetty/src"/>
+    <classpathentry kind="src" path="framework/guiapp/src"/>
+    <classpathentry kind="src" path="framework/jcr/src"/>
+    <classpathentry kind="src" path="framework/jetty/src"/>
     <classpathentry kind="src" path="framework/minilang/src"/>
     <classpathentry kind="src" path="framework/security/src"/>
     <classpathentry kind="src" path="framework/service/src"/>
     <classpathentry kind="src" path="framework/sql/src"/>
     <classpathentry kind="src" path="framework/sql/build/gen-src/javacc"/>
     <classpathentry kind="src" path="framework/start/src"/>
-    <classpathentry kind="src" path="framework/testtools/src"/>
-    <classpathentry excluding="org/ofbiz/webapp/ftl/FreeMarkerViewRenderer.java|org/ofbiz/webapp/ftl/JpCacheIncludeTransform.java|org/ofbiz/webapp/view/FopPdfViewHandler.java|org/ofbiz/webapp/view/GenericViewRenderer.java|org/ofbiz/webapp/view/JPublishViewHandler.java|org/ofbiz/webapp/view/JPublishWrapper.java|org/ofbiz/webapp/view/JasperReportsPdfViewHandler.java|org/ofbiz/webapp/view/JasperReportsXmlViewHandler.java|org/ofbiz/webapp/view/JasperReportsJXlsViewHandler.java|org/ofbiz/webapp/view/JasperReportsPoiXlsViewHandler.java" kind="src" path="framework/webapp/src"/>
+    <classpathentry kind="src" path="framework/testtools/src" excluding="org/ofbiz/testtools/seleniumxml/**"/>
+    <classpathentry kind="src" path="framework/webapp/src" excluding="org/ofbiz/webapp/ftl/FreeMarkerViewRenderer.java|org/ofbiz/webapp/ftl/JpCacheIncludeTransform.java|org/ofbiz/webapp/view/FopPdfViewHandler.java|org/ofbiz/webapp/view/GenericViewRenderer.java|org/ofbiz/webapp/view/JPublishViewHandler.java|org/ofbiz/webapp/view/JPublishWrapper.java|org/ofbiz/webapp/view/JasperReportsPdfViewHandler.java|org/ofbiz/webapp/view/JasperReportsXmlViewHandler.java|org/ofbiz/webapp/view/JasperReportsJXlsViewHandler.java|org/ofbiz/webapp/view/JasperReportsPoiXlsViewHandler.java"/>
+    <classpathentry kind="src" path="framework/webslinger/src"/>
     <classpathentry kind="src" path="framework/webtools/src"/>
     <classpathentry kind="src" path="framework/widget/src"/>
     <classpathentry kind="src" path="specialpurpose/assetmaint/src"/>
     <classpathentry kind="src" path="specialpurpose/ebay/src"/>
     <classpathentry kind="src" path="specialpurpose/ebaystore/src"/>
     <classpathentry kind="src" path="specialpurpose/ecommerce/src"/>
-    <classpathentry kind="src" path="specialpurpose/example/src"/>
     <classpathentry kind="src" path="specialpurpose/googlebase/src"/>
     <classpathentry kind="src" path="specialpurpose/googlecheckout/src"/>
     <classpathentry kind="src" path="specialpurpose/hhfacility/src"/>
@@ -201,9 +275,8 @@
     <classpathentry kind="src" path="specialpurpose/oagis/src"/>
     <classpathentry kind="src" path="specialpurpose/pos/src"/>
     <classpathentry kind="src" path="specialpurpose/projectmgr/src"/>
+    <classpathentry kind="src" path="specialpurpose/shark/src" excluding="org/enhydra/|org/ofbiz/"/>
     <classpathentry kind="src" path="specialpurpose/webpos/src"/>
-    <classpathentry kind="src" path="specialpurpose/lucene/src"/>
-    <classpathentry exported="true" kind="con" path="GROOVY_SUPPORT"/>
-    <classpathentry exported="true" kind="con" path="GROOVY_DSL_SUPPORT"/>
+    <classpathentry kind="src" path="specialpurpose/workflow/src"/>
     <classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/.gitignore b/.gitignore
index e961319..084e381 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,16 +1,60 @@
-applications/*/build
-framework/*/build
-framework/base/lib/cobertura-*.jar
-framework/base/lib/asm*.jar
-framework/base/lib/oro*.jar
-framework/entity/lib/jdbc/postgresql-*.jar
-hot-deploy/*/build
-specialpurpose/*/build
+tools/build
+applications/accounting/build/
+applications/content/build/
 applications/content/index/
+applications/humanres/build/
+applications/manufacturing/build/
+applications/marketing/build/
+applications/order/build/
+applications/party/build/
+applications/product/build/
+applications/securityext/build/
+applications/workeffort/build/
 bin/
+framework/appserver/build/
+framework/base/build/
+framework/base/lib/cobertura-*.jar
+framework/bi/build/
+framework/birt/build/
+framework/catalina/build/
+framework/common/build/
+framework/datafile/build/
+framework/entity/build/
+framework/entity/lib/jdbc/postgresql-*.jar
+framework/entityext/build/
+framework/example/build/
+framework/geronimo/build/
+framework/guiapp/build/
+framework/jackrabbit/build/
+framework/jetty/build/
+framework/minilang/build/
+framework/security/build/
+framework/service/build/
+framework/sql/build/
+framework/start/build/
+framework/testtools/build/
+framework/webapp/build/
+framework/webslinger/build/
+framework/webslinger/websites/webslinger/Var/
+framework/webtools/build/
+framework/widget/build/
+specialpurpose/assetmaint/build/
+specialpurpose/crowd/build/
+specialpurpose/ebay/build/
+specialpurpose/ebaystore/build/
+specialpurpose/ecommerce/build/
+specialpurpose/googlebase/build/
+specialpurpose/googlecheckout/build/
+specialpurpose/hhfacility/build/
+specialpurpose/ldap/build/
+specialpurpose/oagis/build/
+specialpurpose/pos/build/
+specialpurpose/projectmgr/build/
+specialpurpose/webpos/build/
+specialpurpose/scrum/build/
+specialpurpose/shark/build/
 ofbiz.jar
 changelog
-runtime/git-rebase/*
 runtime/svninfo.ftl
 runtime/test-list-build.xml
 runtime/logs/access_log.*
@@ -23,17 +67,25 @@
 runtime/data/derby/*
 runtime/data/utilcache.*
 runtime/catalina/work/*
-runtime/jetty
 runtime/tempfiles/*
-themes/flatgrey/webapp/flatgrey/javascript-min.css
-themes/flatgrey/webapp/flatgrey/js/application-min.js
-themes/flatgrey/webapp/flatgrey/maincss-min.css
-themes/flatgrey/webapp/flatgrey/mainrtl-min.css
+debian/EncryptPassword.class
+debian/copyright
+debian/files
+debian/ofbiz-applications.debhelper.log
+debian/ofbiz-applications.substvars
+debian/ofbiz-applications/
+debian/ofbiz-framework.debhelper.log
+debian/ofbiz-framework.postinst.debhelper
+debian/ofbiz-framework.postrm.debhelper
+debian/ofbiz-framework.substvars
+debian/ofbiz-framework/
+debian/ofbiz-specialpurpose.debhelper.log
+debian/ofbiz-specialpurpose.substvars
+debian/ofbiz-specialpurpose/
+debian/ofbiz.debhelper.log
+debian/ofbiz.substvars
+debian/ofbiz/
+debian/stamps/
+debian/orig-work
 .pc
 .DS_Store
-.idea
-*.iml
-*~
-*#
-.*.swp
-.*.swo
diff --git a/NOTICE b/NOTICE
index b78fc7f..7f1bfe3 100644
--- a/NOTICE
+++ b/NOTICE
@@ -95,6 +95,19 @@
 (C) Copyright 2004, 2005 International Business Machines Corporation.  All rights reserved.
 
 =========================================================================
+==  Apache Jackrabbit Notice                                           ==
+=========================================================================
+
+Apache Jackrabbit
+Copyright 2010 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+Based on source code originally developed by
+Day Software (http://www.day.com/).
+
+=========================================================================
 ==  Apache Log4J Notice                                                ==
 =========================================================================
 
diff --git a/applications/content/build.xml b/applications/content/build.xml
index adf12e1..4f593f1 100644
--- a/applications/content/build.xml
+++ b/applications/content/build.xml
@@ -47,6 +47,7 @@
         <fileset dir="../../framework/webapp/build/lib" includes="*.jar"/>
         <fileset dir="../../framework/widget/build/lib" includes="*.jar"/>
         <fileset dir="../../framework/common/build/lib" includes="*.jar"/>
+        <fileset dir="../../framework/jcr/lib" includes="*.jar"/>
     </path>
 
     <patternset id="src.exc.set">
diff --git a/applications/content/data/ContentTypeData.xml b/applications/content/data/ContentTypeData.xml
index 426ad57..afb24b2 100644
--- a/applications/content/data/ContentTypeData.xml
+++ b/applications/content/data/ContentTypeData.xml
@@ -39,6 +39,7 @@
     <ContentAssocType contentAssocTypeId="SUB_CONTENT" description="Sub-Content"/>
     <ContentAssocType contentAssocTypeId="TOPIC" description="Topic"/>
     <ContentAssocType contentAssocTypeId="DESCRIPTION" description="Description"/>
+    <ContentAssocType contentAssocTypeId="REPOSITORY" description="Repository Assoc"/>
 
     <ContentAssocType contentAssocTypeId="SUBSITE" description="SubSite"/>
     <ContentAssocType contentAssocTypeId="DEPARTMENT" description="Department"/>
@@ -68,6 +69,7 @@
     <MetaDataPredicate metaDataPredicateId="event-person-name" description="The name of a person involved in the subject event."/>
 
     <ContentType contentTypeId="DOCUMENT" description="Document" hasTable="N" parentTypeId=""/>
+    <ContentType contentTypeId="REPOSITORY" description="Content Repository Data" hasTable="N" parentTypeId=""/>
     <ContentType contentTypeId="TEMPLATE" description="Template or Form" hasTable="N" parentTypeId=""/>
     <ContentType contentTypeId="DECORATOR" description="Decorator" hasTable="N" parentTypeId="TEMPLATE"/>
     <ContentType contentTypeId="ANNOTATION" description="Annotation" hasTable="N" parentTypeId=""/>
diff --git a/applications/content/entitydef/entitymodel.xml b/applications/content/entitydef/entitymodel.xml
index 316c42f..bf71ae6 100644
--- a/applications/content/entitydef/entitymodel.xml
+++ b/applications/content/entitydef/entitymodel.xml
@@ -157,6 +157,7 @@
       <field name="dataResourceId" type="id"></field>
       <field name="templateDataResourceId" type="id"></field>
       <field name="dataSourceId" type="id"></field>
+      <field name="repositoryNode" type="long-varchar"></field>
       <field name="statusId" type="id"></field>
       <field name="privilegeEnumId" type="id"></field>
       <field name="serviceName" type="long-varchar">
diff --git a/applications/product/config/ProductErrorUiLabels.xml b/applications/product/config/ProductErrorUiLabels.xml
index d175030..aa3ae06 100644
--- a/applications/product/config/ProductErrorUiLabels.xml
+++ b/applications/product/config/ProductErrorUiLabels.xml
@@ -98,6 +98,9 @@
         <value xml:lang="zh">无法缩放原始图像</value>
         <value xml:lang="zh_TW">無法縮放原始圖像</value>
     </property>
+    <property key="ImageManagementErrorMessageResizeImage">
+        <value xml:lang="en">Cannot resize image format not jpg.</value>
+    </property>
     <property key="ProductCreateCommunicationEventProductPermissionError">
         <value xml:lang="en">Create Communication Event Product Permission Error</value>
         <value xml:lang="it">Errore di permesso durante la creazione evento comunicazione prodotto</value>
diff --git a/framework/appserver/README b/framework/appserver/README
new file mode 100644
index 0000000..0b435dd
--- /dev/null
+++ b/framework/appserver/README
@@ -0,0 +1,8 @@
+For Websphere community edition or Geronimo refer to the Guidelines in the OFBiz documentation : http://docs.ofbiz.org/x/Ah
+Else to generate configuration files from the templates in a sub-directory of the templates directory just run something like (from the ofbiz.home directory):
+
+java -jar ofbiz.jar -setup test
+
+All template files in the given sub-directory, in case "test", will be processed and put in a corresponding sub-directory of ${ofbiz.home}/setup.
+
+
diff --git a/framework/appserver/build.xml b/framework/appserver/build.xml
new file mode 100644
index 0000000..72230c2
--- /dev/null
+++ b/framework/appserver/build.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<project name="OFBiz - AppServers" default="jar" basedir=".">
+    <import file="../../common.xml"/>
+
+    <!-- ================================================================== -->
+    <!-- Initialization of all property settings                            -->
+    <!-- ================================================================== -->
+
+    <property name="desc" value="AppServers Component"/>
+    <property name="name" value="ofbiz-appsvrs"/>
+    <property name="ofbiz.home.dir" value="../.."/>
+
+    <path id="local.class.path">
+        <fileset dir="../base/lib" includes="*.jar"/>
+        <fileset dir="../start/build/lib" includes="*.jar"/>
+        <fileset dir="../base/build/lib" includes="*.jar"/>
+        <fileset dir="../webapp/lib" includes="*.jar"/>
+        <fileset dir="../webapp/build/lib" includes="*.jar"/>
+    </path>
+</project>
diff --git a/framework/appserver/config/appserver.properties b/framework/appserver/config/appserver.properties
new file mode 100644
index 0000000..02f14c6
--- /dev/null
+++ b/framework/appserver/config/appserver.properties
@@ -0,0 +1,58 @@
+#####################################################################
+# Copyright 2001-2009 The Apache Software Foundation
+#
+# 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.
+#####################################################################
+
+####
+# OFBiz Setup properties File
+####
+
+######## Default WASCE/Geronimo Settings. Refer to the Guidelines in the OFBiz documentation : http://cwiki.apache.org/confluence/x/IYBr ########
+### Path to geronimo home (in other words, application server location).
+# You may also use a GERONIMO_HOME env var, in such case let commented out here
+### Linux
+#geronimoHome=/home/jacques/IBM/WebSphere/AppServerCommunityEdition
+#geronimoHome=/home/jacques/Apache Software Foundation/geronimo-tomcat6-jee5-2.0.3
+### Windows
+#*** Note that under Windows you must use / here in place of \ (or put \\)
+#*** Beware for geronimo-2.0.3 snapshot, under Windows some files have a path longer than 256 chars. Hence I put it directly under c:
+#*** Beware also if you use RMI you can't have spaces in path
+#geronimoHome=C:/wasce
+#geronimoHome=C:/geronimo-tomcat6-jee5-2.0.3
+
+### user login
+user=system
+# password
+password=manager
+
+### Server is offline or not. Should be offline the 1st time you deploy since you need to copy after lines from META-INF/REAME hence by default true
+offline=false
+
+### Pause in deployment script ?
+pauseInGeronimoScript=false
+
+### Undeploy/Deploy (useful when offline) or Redeploy (implies that the server is running)
+redeploy=false
+
+### The number (instancesNumber) given here is in origin 0. Hence 0 means one instance.
+# In other word you give the n-1 number of instances (n being the number of instances).
+# For instance 2 means 3 instances deployed. # This to allow the default instance which is not numbered
+instancesNumber=0
+
+### host
+#host=192.168.2.7
+#geronimoHostHome=C/Program Files/IBM/WebSphere/AppServerCommunityEdition
+
+### port
+#port=31099
diff --git a/framework/appserver/config/ofbiz-containers.xml b/framework/appserver/config/ofbiz-containers.xml
new file mode 100644
index 0000000..32c2209
--- /dev/null
+++ b/framework/appserver/config/ofbiz-containers.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<ofbiz-containers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/ofbiz-containers.xsd">
+    <container name="component-container" class="org.ofbiz.base.container.ComponentContainer"/>
+    <container name="generate-container" class="org.ofbiz.appservers.GenerateContainer"/>
+</ofbiz-containers>
diff --git a/framework/appserver/ofbiz-component.xml b/framework/appserver/ofbiz-component.xml
new file mode 100644
index 0000000..6c61ab0
--- /dev/null
+++ b/framework/appserver/ofbiz-component.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<ofbiz-component name="appservers"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/ofbiz-component.xsd">
+    <resource-loader name="main" type="component"/>
+    <classpath type="jar" location="build/lib/*"/>
+    <classpath type="dir" location="config"/>
+</ofbiz-component>
diff --git a/framework/appserver/src/org/ofbiz/appservers/GenerateContainer.java b/framework/appserver/src/org/ofbiz/appservers/GenerateContainer.java
new file mode 100644
index 0000000..58a12a9
--- /dev/null
+++ b/framework/appserver/src/org/ofbiz/appservers/GenerateContainer.java
@@ -0,0 +1,520 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ *******************************************************************************/
+
+package org.ofbiz.appservers;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.Writer;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import javolution.util.FastList;
+import javolution.util.FastMap;
+
+import org.ofbiz.base.component.ComponentConfig;
+import org.ofbiz.base.container.Container;
+import org.ofbiz.base.container.ContainerException;
+import org.ofbiz.base.start.Classpath;
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.UtilProperties;
+import org.ofbiz.base.util.UtilURL;
+import org.ofbiz.base.util.UtilValidate;
+import org.ofbiz.base.util.template.FreeMarkerWorker;
+import org.w3c.dom.Document;
+
+/**
+ * GenerateContainer - Generates Configuration Files For Application Servers
+ * ** This container requires StartInfoLoader to be loaded at startup.
+ * ** This container requires the ComponentContainer to be loaded first.
+ *
+ */
+public class GenerateContainer implements Container {
+
+    public static final String module = GenerateContainer.class.getName();
+    public static final String source = "/framework/appserver/templates/";
+    public static String target = "/setup/";
+
+    protected String configFile = null;
+    protected String ofbizHome = null;
+    protected String args[] = null;
+
+    private boolean isGeronimo = false;
+    private String geronimoHome = null;
+
+    /**
+     * @see org.ofbiz.base.container.Container#init(java.lang.String[], java.lang.String)
+     */
+    public void init(String[] args, String configFile) {
+        ofbizHome = System.getProperty("ofbiz.home");
+        this.configFile = configFile;
+        this.args = args;
+        isGeronimo = args[0].toLowerCase().contains("geronimo") || args[0].toLowerCase().contains("wasce");
+        if (isGeronimo) {
+            target="/META-INF/";
+            geronimoHome = System.getenv("GERONIMO_HOME");
+            if (geronimoHome == null) {
+                geronimoHome = UtilProperties.getPropertyValue("appserver", "geronimoHome", null);
+            }
+        }
+    }
+
+    /**
+     * @see org.ofbiz.base.container.Container#start()
+     */
+    public boolean start() throws ContainerException {
+        generateFiles();
+        System.exit(1);
+        return true;
+    }
+
+    /**
+     * Stop the container
+     *
+     * @throws org.ofbiz.base.container.ContainerException
+     *
+     */
+    public void stop() throws ContainerException {
+    }
+
+    private void generateFiles() throws ContainerException {
+        if (isGeronimo) {
+            if (geronimoHome == null) {
+                Debug.logFatal("*** 'GERONIMO_HOME' was not found in your environment. Please set the location of Geronimo into a GERONIMO_HOME env var or as a geronimoHome property in appserver.properties file.", module);
+                throw new ContainerException("Error in Geronimo deployment, please check the log");
+            }
+        }
+        File files[] = getTemplates();
+        Map<String, Object> dataMap = buildDataMap();
+
+        String user = UtilProperties.getPropertyValue("appserver", "user", "system");
+        String password = UtilProperties.getPropertyValue("appserver", "password", "manager");
+
+        boolean offline = UtilProperties.propertyValueEqualsIgnoreCase("appserver", "offline", "true");
+        boolean redeploy = UtilProperties.propertyValueEqualsIgnoreCase("appserver", "redeploy", "true");
+
+        String geronimoHostHome = UtilProperties.getPropertyValue("appserver", "geronimoHostHome", null);
+        String host = UtilProperties.getPropertyValue("appserver", "host", "");
+        String port = UtilProperties.getPropertyValue("appserver", "port", "");
+        boolean pauseInGeronimoScript = UtilProperties.propertyValueEqualsIgnoreCase("appserver", "pauseInGeronimoScript", "true");
+
+        int instancesNumber = (int) UtilProperties.getPropertyNumber("appserver", "instancesNumber");
+        String instanceNumber = "";
+
+        if (isGeronimo) {
+            File geronimoHomeDir = new File (geronimoHome);
+            if (!(geronimoHomeDir.isDirectory())) {
+                Debug.logFatal("*** " + geronimoHome + " does not exist or is not a directoy. Please set the location of Geronimo into a GERONIMO_HOME env var or as a geronimoHome property in appserver.properties file.", module);
+                throw new ContainerException("Error in Geronimo deployment, please check the log");
+            }
+
+            if (UtilValidate.isNotEmpty(host) && UtilValidate.isNotEmpty(geronimoHostHome)) {
+                geronimoHomeDir = new File ("//" + host + "/" + geronimoHostHome);
+                if (!(geronimoHomeDir.isDirectory())) {
+                    Debug.logFatal("*** " + geronimoHostHome + " does not exist or is not a directoy. Please set the location of Geronimo on host as a geronimoHostHome property in appserver.properties file.", module);
+                    throw new ContainerException("Error in Geronimo deployment, please check the log");
+                }
+            } else {
+                geronimoHostHome = geronimoHome;
+            }
+
+            if (redeploy && offline) {
+                Debug.logFatal("*** You can't use redeploy with a server offline.", module);
+                    throw new ContainerException("Error in Geronimo deployment, please check the log");
+                }
+
+            for(int inst = 0; inst <= instancesNumber; inst++) {
+                instanceNumber = (inst == 0 ? "" : inst).toString();
+                GenerateGeronimoDeployment geronimoDeployment = new GenerateGeronimoDeployment();
+                List<String> classpathJars = geronimoDeployment.generate(args[0], geronimoHostHome, instanceNumber);
+                if (classpathJars == null) {
+                    throw new ContainerException("Error in Geronimo deployment, please check the log");
+                }
+                dataMap.put("classpathJars", classpathJars);
+                dataMap.put("pathSeparatorChar", File.pathSeparatorChar);
+                dataMap.put("instanceNumber", instanceNumber);
+                //                if (UtilValidate.isNotEmpty(instanceNumber)) {
+                //                    List webApps = (List) dataMap.get("webApps");
+                //                    for (Object webAppObject: webApps) {
+                //                        WebappInfo webAppInfo = (ComponentConfig.WebappInfo) webAppObject;
+                //                        String webAppLocation = webAppInfo.getLocation();
+                //                        String webXmlLocation = webAppLocation + "/WEB-INF/web.xml";
+                //                        if (isFileExistsAndCanWrite(webXmlLocation)) {
+                //                            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+                //                            DocumentBuilder docBuilder = null;
+                //                            try {
+                //                                docBuilder = docFactory.newDocumentBuilder();
+                //                            } catch (ParserConfigurationException e) {
+                //                                throw new ContainerException(e);
+                //                            }
+                //                            Document doc = null;
+                //                            try {
+                //                                doc = docBuilder.parse(webXmlLocation);
+                //                            } catch (SAXException e) {
+                //                                throw new ContainerException(e);
+                //                            } catch (IOException e) {
+                //                                throw new ContainerException(e);
+                //                            }
+                //                            Node webApp = doc.getFirstChild();
+                //                            Node contextParam = doc.createElement("context-param");
+                //                            NamedNodeMap contextParamAttributes = contextParam.getAttributes();
+                //
+                //                            Attr paramName = doc.createAttribute("param-name");
+                //                            paramName.setValue("instanceNumber");
+                //                            contextParamAttributes.setNamedItem(paramName);
+                //
+                //                            Attr paramValue = doc.createAttribute("param-value");
+                //                            paramValue.setValue(instanceNumber);
+                //                            contextParamAttributes.setNamedItem(paramValue);
+                //        //                    Node nodeToAppend = doc.importNode(contextParam, true); this should not be needed
+                //        //                    webApp.appendChild(nodeToAppend);
+                //
+                //        //                    webApp.appendChild(contextParam); this is the line needed but commented for now
+                //
+                //                            Transformer transformer;
+                //                            try {
+                //                                transformer = TransformerFactory.newInstance().newTransformer();
+                //                            } catch (TransformerConfigurationException e) {
+                //                                throw new ContainerException(e);
+                //                            } catch (TransformerFactoryConfigurationError e) {
+                //                                throw new ContainerException(e);
+                //                            }
+                //                            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+                //
+                //                            StreamResult result = new StreamResult(new StringWriter());
+                //                            DOMSource source = new DOMSource(doc);
+                //                            try {
+                //                                transformer.transform(source, result);
+                //                            } catch (TransformerException e) {
+                //                                throw new ContainerException(e);
+                //                            }
+                //                            String xmlString = result.getWriter().toString();
+                //                            System.out.println(xmlString); //TODO write to file using writeToXmlFile
+                //                            break; // Only the 1st web.xml file need to be modified
+                //                        } else {
+                //                            Debug.logInfo("Unable to change the deployment descriptor : " + webXmlLocation + ". Maybe it does not exist, or is in read only mode ?", module);
+                //                        }
+                //                    }
+                //                }
+
+                //Debug.log("Using Data : " + dataMap, module);
+                for (int i = 0; i < files.length; i++) {
+                    if (!(files[i].isDirectory() || files[i].isHidden() || files[i].getName().equalsIgnoreCase("geronimo-web.xml"))) {
+                        parseTemplate(files[i], dataMap);
+                    }
+                }
+
+                String ofbizName = "ofbiz" + instanceNumber;
+                String separator = File.separator;
+                File workingDir = new File(geronimoHome + separator + "bin");
+                ProcessBuilder processBuilder = null;
+                Process process = null;
+                String command = null;
+                String commandCommonPart = null;
+                if ("\\".equals(separator)) {   //Windows
+                    commandCommonPart = "deploy --user " + user +  " --password " +  password;
+                } else {                        // Linux
+                    commandCommonPart = workingDir + "/deploy.sh --user " + user +  " --password " +  password;
+                }
+                if (UtilValidate.isNotEmpty(host)) {
+                    commandCommonPart += " --host " + host + (UtilValidate.isNotEmpty(port) ? " --port " + port : "");
+                }
+
+                if (!redeploy) {
+                if ("\\".equals(separator)) { //Windows
+                    if (offline) {
+                        command = commandCommonPart + " --offline undeploy " + ofbizName;
+                    } else {
+                        command = commandCommonPart + " undeploy " + ofbizName;
+                    }
+                        processBuilder = new ProcessBuilder("cmd.exe", "/c", command);
+                } else {                        // Linux
+                    if (offline) {
+                        command = commandCommonPart + " --offline undeploy " + ofbizName;
+                    } else {
+                        command = commandCommonPart + " undeploy " + ofbizName;
+                    }
+                        processBuilder = new ProcessBuilder("sh", "-c", command);
+                }
+
+                if (pauseInGeronimoScript) {
+                        Map<String, String> env = processBuilder.environment();
+                    env.put("GERONIMO_BATCH_PAUSE", "on");
+                }
+                    processBuilder.directory(workingDir);
+
+                try {
+                    System.out.println("Currently undeploying " + ofbizName + ", using : <<" + command + ">>, please wait ...");
+                        processBuilder.redirectErrorStream(true);
+                        process = processBuilder.start();
+                        java.io.InputStream is = process.getInputStream();
+                    byte[] buf = new byte[2024];
+                    int readLen = 0;
+                    while ((readLen = is.read(buf,0,buf.length)) != -1) {
+                        if ("\\".equals(separator)) {   //Windows
+                            System.out.print(new String(buf,0,readLen));
+                        } else {
+                            System.out.println(new String(buf,0,readLen));
+                        }
+                    }
+                    is.close();
+                        process.waitFor();
+    //                    System.out.println(process.waitFor());
+    //                    System.out.println("exit value" + process.exitValue());
+                    Debug.logInfo(ofbizName + " undeployment ended" , module);
+                } catch (IOException e) {
+                    throw new ContainerException(e);
+                } catch (InterruptedException e) {
+                    throw new ContainerException(e);
+                    } finally {
+                        process.destroy();
+                    }
+                }
+
+                if (redeploy) {
+                    if ("\\".equals(separator)) { //Windows
+                        command = commandCommonPart + " redeploy " + ofbizHome;
+                        processBuilder = new ProcessBuilder("cmd.exe", "/c", command);
+                    } else {                      // Linux
+                        command = commandCommonPart + " redeploy " + ofbizHome;
+                        processBuilder = new ProcessBuilder("sh", "-c", command);
+                }
+
+                } else {
+                if ("\\".equals(separator)) { //Windows
+                    if (offline) {
+                            command = commandCommonPart + " --offline deploy --inPlace " + ofbizHome;
+                    } else {
+                            command = commandCommonPart + " deploy --inPlace " + ofbizHome;
+                    }
+                        processBuilder = new ProcessBuilder("cmd.exe", "/c", command);
+                } else {                      // Linux
+                    if (offline) {
+                            command = commandCommonPart + " --offline deploy --inPlace " + ofbizHome;
+                    } else {
+                            command = commandCommonPart + " deploy --inPlace " + ofbizHome;
+                        }
+                        processBuilder = new ProcessBuilder("sh", "-c", command);
+                    }
+                }
+
+                if (pauseInGeronimoScript) {
+                    Map<String, String> env = processBuilder.environment();
+                    env.put("GERONIMO_BATCH_PAUSE", "on");
+                }
+                processBuilder.directory(workingDir);
+
+                try {
+                    System.out.println("Currently deploying " + ofbizName + ", using : <<" + command + ">>, please wait ...");
+                    processBuilder.redirectErrorStream(true);
+                    process = processBuilder.start();
+                    java.io.InputStream is = process.getInputStream();
+                    byte[] buf = new byte[2024];
+                    int readLen = 0;
+                    while ((readLen = is.read(buf,0,buf.length)) != -1) {
+                        if ("\\".equals(separator)) {   //Windows
+                            System.out.print(new String(buf,0,readLen));
+                        } else {
+                            System.out.println(new String(buf,0,readLen));
+                        }
+                    }
+                    is.close();
+                    process.waitFor();
+//                    System.out.println(process.waitFor());
+//                    System.out.println("exit value" + process.exitValue());
+                    Debug.logInfo(ofbizName + " deployment ended" , module);
+                } catch (IOException e) {
+                    throw new ContainerException(e);
+                } catch (InterruptedException e) {
+                    throw new ContainerException(e);
+                } finally {
+                    process.destroy();
+                }
+            }
+        } else {
+            //Debug.log("Using Data : " + dataMap, module);
+            for (int i = 0; i < files.length; i++) {
+                if (!files[i].isDirectory() && !files[i].isHidden()) {
+                    parseTemplate(files[i], dataMap);
+                }
+            }
+        }
+    }
+
+    private File[] getTemplates() throws ContainerException {
+        if (args == null) {
+            throw new ContainerException("Invalid application server type argument passed");
+        }
+
+        String templateLocation = args[0];
+        if (templateLocation == null) {
+            throw new ContainerException("Unable to locate Application Server template directory");
+        }
+
+        File parentDir = new File(ofbizHome + source + templateLocation);
+        if (!parentDir.exists() || !parentDir.isDirectory()) {
+            throw new ContainerException("Template location - " + templateLocation + " does not exist!");
+        }
+
+        return parentDir.listFiles();
+    }
+
+    private Map<String, Object> buildDataMap() throws ContainerException {
+        Map<String, Object> dataMap = FastMap.newInstance();
+        List<?> c[] = getClasspath();
+        dataMap.put("targetDirectory", getTargetDirectory());
+        dataMap.put("pathSeparatorChar", File.pathSeparatorChar);
+        dataMap.put("classpath", System.getProperty("java.class.path"));
+        dataMap.put("classpathJars", c[0]);
+        dataMap.put("classpathDirs", c[1]);
+        dataMap.put("env", System.getProperties());
+        dataMap.put("webApps", ComponentConfig.getAllWebappResourceInfos());
+        dataMap.put("ofbizHome", System.getProperty("ofbiz.home"));
+        return dataMap;
+    }
+
+    private List<?>[] getClasspath() {
+        Classpath classPath = new Classpath(System.getProperty("java.class.path"));
+        List<File> elements = classPath.getElements();
+        List<String> jar = FastList.newInstance();
+        List<String> dir = FastList.newInstance();
+
+        for (File f: elements) {
+            if (f.exists()) {
+                if (f.isDirectory()) {
+                    String path = f.getAbsolutePath();
+                    dir.add(path.replace('\\','/'));
+                } else {
+                    String path = f.getAbsolutePath();
+                    jar.add(path.replace('\\','/'));
+                }
+            }
+        }
+        List<?>[] lists = { jar, dir };
+        return lists;
+    }
+
+    private String getTargetDirectory() throws ContainerException {
+        // create the target file/directory
+        String targetDirectoryName = args.length > 1 ? args[1] : null;
+        if (targetDirectoryName == null) {
+            targetDirectoryName = target;
+        }
+        String targetDirectory = null;
+        if (!isGeronimo) {
+            targetDirectory = ofbizHome + targetDirectoryName + args[0];
+        } else {
+            targetDirectory = ofbizHome + targetDirectoryName;
+        }
+        File targetDir = new File(targetDirectory);
+        if (!targetDir.exists()) {
+            boolean created = targetDir.mkdirs();
+            if (!created) {
+                throw new ContainerException("Unable to create target directory - " + targetDirectory);
+            }
+        }
+
+        if (!targetDirectory.endsWith("/")) {
+            targetDirectory = targetDirectory + "/";
+        }
+
+        return targetDirectory;
+    }
+
+    private void parseTemplate(File templateFile, Map<String, Object> dataMap) throws ContainerException {
+        Debug.log("Parsing template : " + templateFile.getAbsolutePath(), module);
+        Reader reader = null;
+        try {
+            reader = new InputStreamReader(new FileInputStream(templateFile));
+        } catch (FileNotFoundException e) {
+            throw new ContainerException(e);
+        } finally {
+            if (reader != null) {
+                try {
+                    reader.close();
+                } catch (IOException e) {
+                    throw new ContainerException(e);
+                }
+            }
+        }
+
+        // create the target file/directory
+        String targetDirectory = getTargetDirectory();
+
+        // write the template to the target directory
+        Writer writer = null;
+        try {
+            writer = new FileWriter(targetDirectory + templateFile.getName());
+            try {
+                FreeMarkerWorker.renderTemplate(UtilURL.fromFilename(templateFile.getAbsolutePath()).toExternalForm(), dataMap, writer);
+            } catch (Exception e) {
+                throw new ContainerException(e);
+            }
+        } catch (IOException e) {
+            throw new ContainerException(e);
+        } finally {
+            try {
+                if (writer != null) {
+                    writer.flush();
+                    writer.close();
+                }
+            } catch (IOException e) {
+                throw new ContainerException(e);
+            }
+        }
+
+    }
+
+    // This method writes a DOM document to a file
+    public static void writeToXmlFile(Document doc, String filename) {
+        try {
+            // Prepare the DOM document for writing
+            Source source = new DOMSource(doc);
+
+            // Prepare the output file
+            File file = new File(filename);
+            Result result = new StreamResult(file);
+
+            // Write the DOM document to the file
+            Transformer xformer = TransformerFactory.newInstance().newTransformer();
+            xformer.transform(source, result);
+        } catch (TransformerConfigurationException e) {
+        } catch (TransformerException e) {
+        }
+    }
+
+    public boolean isFileExistsAndCanWrite(String fileName) {
+        File f = new File(fileName);
+        return f.exists() && f.canWrite();
+    }
+}
diff --git a/framework/appserver/src/org/ofbiz/appservers/GenerateGeronimoDeployment.java b/framework/appserver/src/org/ofbiz/appservers/GenerateGeronimoDeployment.java
new file mode 100644
index 0000000..2d7df67
--- /dev/null
+++ b/framework/appserver/src/org/ofbiz/appservers/GenerateGeronimoDeployment.java
@@ -0,0 +1,198 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ *******************************************************************************/
+
+package org.ofbiz.appservers;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.Writer;
+import java.nio.channels.FileChannel;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.ofbiz.base.component.ComponentConfig;
+import org.ofbiz.base.start.Classpath;
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.StringUtil;
+import org.ofbiz.base.util.UtilURL;
+import org.ofbiz.base.util.template.FreeMarkerWorker;
+
+/**
+ * GenerateGeronimoRepository - Generate needed jars in Geronimo (or WASCE) repository
+ *
+ */
+public class GenerateGeronimoDeployment {
+
+    public static final String module = GenerateGeronimoDeployment.class.getName();
+    public static final String source = "/framework/appserver/templates/";
+
+    protected  String geronimoRepository = null;
+
+    public List<String> generate(String geronimoVersion, String geronimoHome, String instanceNumber) {
+        geronimoRepository = geronimoHome + "/repository";
+        Debug.logInfo("The WASCE or Geronimo Repository is " + geronimoRepository, module);
+        Classpath classPath = new Classpath(System.getProperty("java.class.path"));
+        List<File> elements = classPath.getElements();
+        List<String> jar_version = new ArrayList<String>();
+        String jarPath = null;
+        String jarName = null;
+        String newJarName = null;
+        String jarNameSimple = null;
+        String jarVersion = "1.0";
+        int lastDash = -1;
+
+        for (File f: elements) {
+            if (f.exists()) {
+                if (f.isFile()) {
+                    jarPath = f.getAbsolutePath();
+                    jarName = f.getName();
+                    String jarNameWithoutExt = (String) jarName.subSequence(0, jarName.length()-4);
+                    lastDash = jarNameWithoutExt.lastIndexOf("-");
+                    if (lastDash > -1) {
+                        // get string between last dash and extension = version ?
+                        jarVersion = jarNameWithoutExt.substring(lastDash+1, jarNameWithoutExt.length());
+                        // get string before last dash
+                        jarNameSimple = jarNameWithoutExt.substring(0, lastDash);
+                        // Remove all but digits and "." and if length > 0 then it's already versioned
+                        boolean alreadyVersioned = 0 < StringUtil.removeRegex(jarVersion, "[^.0123456789]").length();
+                        if (! alreadyVersioned) {
+                            jarVersion = "1.0"; // by default put 1.0 version
+                            jarNameSimple = jarNameWithoutExt;
+                            newJarName = jarNameWithoutExt + "-" + jarVersion + ".jar";
+                        } else {
+                            newJarName = jarName;
+                        }
+                    } else {
+                        jarVersion = "1.0"; // by default put 1.0 version
+                        jarNameSimple = jarNameWithoutExt;
+                        newJarName = jarNameWithoutExt + "-" + jarVersion + ".jar";
+                    }
+
+                    jar_version.add(jarNameSimple + "#" + jarVersion);
+
+                    String targetDirectory = geronimoRepository + "/org/ofbiz/" + jarNameSimple + "/" + jarVersion;
+                    File targetDir = new File(targetDirectory);
+                    if (!targetDir.exists()) {
+                        boolean created = targetDir.mkdirs();
+                        if (!created) {
+                            Debug.logFatal("Unable to create target directory - " + targetDirectory, module);
+                            return null;
+                        }
+                    }
+
+                    if (!targetDirectory.endsWith("/")) {
+                        targetDirectory = targetDirectory + "/";
+                    }
+                    String newCompleteJarName= targetDirectory + newJarName;
+
+                    // copy the jar to the target directory
+                    try {
+                        // Create channel on the source
+                        FileChannel srcChannel = new FileInputStream(jarPath).getChannel();
+
+                        // Create channel on the destination
+                        FileChannel dstChannel = new FileOutputStream(newCompleteJarName).getChannel();
+
+                        // Copy file contents from source to destination
+                        dstChannel.transferFrom(srcChannel, 0, srcChannel.size());
+                        Debug.log("Created jar file : " + newJarName + " in WASCE or Geronimo repository", module);
+
+                        // Close the channels
+                        srcChannel.close();
+                        dstChannel.close();
+                    } catch (IOException e) {
+                        Debug.logFatal("Unable to create jar file - " + newJarName + " in WASCE or Geronimo repository (certainly already exists)", module);
+                        return null;
+                    }
+                }
+            }
+        }
+        List<ComponentConfig.WebappInfo> webApps  = ComponentConfig.getAllWebappResourceInfos();
+        File geronimoWebXml = new File(System.getProperty("ofbiz.home") + "/framework/appserver/templates/" + geronimoVersion + "/geronimo-web.xml");
+        for (ComponentConfig.WebappInfo webApp: webApps) {
+            if (null != webApp) {
+                parseTemplate(geronimoWebXml, webApp);
+            }
+        }
+        return jar_version;
+    }
+
+    private void parseTemplate(File templateFile, ComponentConfig.WebappInfo webApp) {
+        Debug.log("Parsing template : " + templateFile.getAbsolutePath() + " for web app " + webApp.getName(), module);
+
+        Map<String, Object> dataMap= new HashMap<String, Object>();
+        dataMap.put("webApp", webApp);
+        String webAppGeronimoWebXmlFileName = webApp.getLocation() + "/WEB-INF/geronimo-web.xml";
+        String webAppGeronimoWebInfDirName = webApp.getLocation() + "/WEB-INF";
+        File webAppGeronimoWebInfDir = new File(webAppGeronimoWebInfDirName);
+
+        if (!(webAppGeronimoWebInfDir.exists() && webAppGeronimoWebInfDir.isDirectory())) {
+            Debug.logFatal("Unable to create - " + webAppGeronimoWebXmlFileName, module);
+            Debug.logFatal("The directory "+ webAppGeronimoWebInfDirName + " does not exist", module);
+            return;
+        }
+
+        Reader reader = null;
+        try {
+            reader = new InputStreamReader(new FileInputStream(templateFile));
+        } catch (FileNotFoundException e) {
+            Debug.logFatal("Unable to create - " + webAppGeronimoWebXmlFileName, module);
+            return;
+        } finally {
+            if (reader != null) {
+                try {
+                    reader.close();
+                } catch (IOException e) {
+                    Debug.logError("Trouble closing - " + webAppGeronimoWebXmlFileName, module);
+                }
+            }
+        }
+
+        // write the template to the target directory
+        Writer writer = null;
+        try {
+            writer = new FileWriter(webAppGeronimoWebXmlFileName);
+        } catch (IOException e) {
+            Debug.logFatal("Unable to create - " + webAppGeronimoWebXmlFileName, module);
+            return;
+        }
+        try {
+            FreeMarkerWorker.renderTemplate(UtilURL.fromFilename(templateFile.getAbsolutePath()).toExternalForm(), dataMap, writer);
+        } catch (Exception e) {
+            Debug.logFatal("Unable to create - " + webAppGeronimoWebXmlFileName, module);
+            return;
+        }
+
+        try {
+            writer.flush();
+            writer.close();
+        } catch (IOException e) {
+            Debug.logFatal("Unable to create - " + webAppGeronimoWebXmlFileName, module);
+            return;
+        }
+    }
+}
diff --git a/framework/appserver/templates/glassfish21/README b/framework/appserver/templates/glassfish21/README
new file mode 100644
index 0000000..92f03b3
--- /dev/null
+++ b/framework/appserver/templates/glassfish21/README
@@ -0,0 +1,87 @@
+###############################################################################

+# Licensed to the Apache Software Foundation (ASF) under one

+# or more contributor license agreements.  See the NOTICE file

+# distributed with this work for additional information

+# regarding copyright ownership.  The ASF licenses this file

+# to you 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.

+###############################################################################

+

+This directory contains templates for Glassfish Server v2.1 deployment

+======================================================================

+

+README                  - this file.

+run.sh                  - loads seed and demo data into JavaDB that comes with

+                          Glassfish server and then deploys OFBiz.

+deploy.sh               - automatic deployment script. Builds WARs and the

+                          ofbiz.ear and deploys onto glassfish.

+domain.xml_patch        - updated to record the ofbiz home.

+entityengine.xml_patch  - updated to use bundled JavaDB datasources.

+url.properties          - updated to set the HTTPS port to 8181 (default port).

+application.xml         - EAR metadata.

+

+

+

+HOW-TO (this needs to be posted on the OFBiz documentation site)

+======

+

+1. Setup

+    a. Create a folder somewhere on the disk with ~800MB free memory. 

+       This becomes the work area. Referred as <work-folder> hence forth.

+    b. Download Glassfish Server v2.1 and install. (Download it from [1])

+    c. Download OFBiz source (if you have not done already). (Either 

+       download the build from http://build.ofbiz.org or checkout from SVN. 

+       Refer [2])

+    d. Build OFBiz sources (in case of svn checkout) using 'ant' command. 

+       This will create 'ofbiz.jar' file.

+    e. Generate container templates for Glassfish v2.1 server.

+         i. Goto the OFBiz source folder (referred as OFBIZ_HOME).

+        ii. Use the command 'java -jar ofbiz.jar -setup glassfish21' to 

+            generate the templates. For more information refer [3]. 

+            This will create a new folder called 'setup' inside OFBIZ_HOME 

+            and copy the generated templates under the folder 

+            'setup/glassfish21'.

+

+

+if (you are using JavaDB && want seed and demo data loaded) {

+    Copy OFBIZ_HOME/setup/glassfish21/run.sh to <work-folder>;

+    run run.sh script now!; 

+    // (without quotes) './run.sh <glassfish_home> <glassfish-domain-path>'

+} else {

+ read ahead;

+}

+

+

+2. Install and start the database server if its not done already.

+3. Create / update entityengine.xml to include your database server details. 

+   Refer [4]. If you want to use JavaDB with default settings, you can use entityengine.xml_patch

+   readily available under 'OFBIZ_HOME/setup/glassfish21'.

+4. Load seed and demo data (optional, but highly recommended) by using

+   './ant run-install' command under OFBIZ_HOME. Refer [5].

+5. Copy OFBIZ_HOME/setup/glassfish21/deploy.sh to <work-folder>.

+6. Run deploy.sh.

+   (without quotes) './deploy.sh <glassfish-home> <glassfish-domain-path>'.

+7. Check domain.xml for XML validation errors. This is to make sure the patching of domain.xml in previous step was done neatly.

+8. Start/restart glassfish server if its not already running.

+9. If you have opted for loading demo data, goto

+   http://localhost:8080/ecommerce and http://localhost:8080/webtools to 

+   verify the installation.

+

+References :

+

+[1] : https://glassfish.dev.java.net/downloads/v2.1-b60e.html

+[2] : http://cwiki.apache.org/confluence/confluence/display/OFBADMIN/Demo+and+Test+Setup+Guide (Building from SVN)

+[3] : OFBIZ_HOME/framework/appserver/README

+[4] : http://cwiki.apache.org/confluence/display/OFBTECH/Apache+OFBiz+Technical+Production+Setup+Guide (2.c. Database Setup)

+[5] : http://cwiki.apache.org/confluence/display/OFBTECH/Apache+OFBiz+Technical+Production+Setup+Guide (2.d. Seed Data Loading)

+

diff --git a/framework/appserver/templates/glassfish21/application.xml b/framework/appserver/templates/glassfish21/application.xml
new file mode 100644
index 0000000..d7f1dcf
--- /dev/null
+++ b/framework/appserver/templates/glassfish21/application.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<!--

+Licensed to the Apache Software Foundation (ASF) under one

+or more contributor license agreements.  See the NOTICE file

+distributed with this work for additional information

+regarding copyright ownership.  The ASF licenses this file

+to you 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.

+-->

+<application xmlns="http://java.sun.com/xml/ns/javaee"

+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+               xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd"

+               version="5">

+

+    <description>Open For Business - Deployment</description>

+    <display-name>OFBiz</display-name>

+

+<#list webApps as webapp>

+    <module>

+        <web>

+            <web-uri>${webapp.getName()}.war</web-uri>

+            <context-root>${webapp.getContextRoot()}</context-root>

+        </web>

+    </module>

+</#list>

+    

+</application>

diff --git a/framework/appserver/templates/glassfish21/deploy.sh b/framework/appserver/templates/glassfish21/deploy.sh
new file mode 100644
index 0000000..22f0733
--- /dev/null
+++ b/framework/appserver/templates/glassfish21/deploy.sh
@@ -0,0 +1,145 @@
+#!/bin/sh

+

+###############################################################################

+# Licensed to the Apache Software Foundation (ASF) under one

+# or more contributor license agreements.  See the NOTICE file

+# distributed with this work for additional information

+# regarding copyright ownership.  The ASF licenses this file

+# to you 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.

+###############################################################################

+

+

+#################################

+# Glassfish Deployment          #

+#                               #

+# Run with Glassfish Home and   #

+# domain directory path         #

+#################################

+

+# Check args.

+

+if [ $# -ne 2 ]; then

+  echo "Input required .."

+  echo "Syntax: $0 <glassfish-home> <glassfish-domain-directory-path>"

+  exit 1

+fi

+

+# Clean up ..

+

+if [ -f "./META-INF/application.xml" ]; then

+  rm -rf META-INF

+  echo "removed META-INF"

+fi

+if [ -f "./lib/ofbiz-base.jar" ]; then

+  rm -rf lib

+  echo "removed libs"

+  rm *.war

+  echo "removed wars"

+  rm ofbiz.ear

+  echo "removed ear"

+fi

+

+GLASSFISH_HOME=$1

+DOMAIN_HOME=$2

+

+# setup JavaDB drivers.

+if [ ! -f "${ofbizHome}/framework/entity/lib/jdbc/derbyclient.jar" ]; then

+    cp $GLASSFISH_HOME/javadb/lib/derbyclient.jar ${ofbizHome}/framework/entity/lib/jdbc/derbyclient.jar

+fi

+

+# setup log4j.xml (copy to domain1/config folder)

+if [ ! -f "$DOMAIN_HOME/config/log4j.xml" ]; then

+    cp ${ofbizHome}/framework/base/config/log4j.xml $DOMAIN_HOME/config

+fi

+

+# setup the OFBIZ_HOME by updating domain.xml

+if [ ! -f "$DOMAIN_HOME/config/domain.xml_bak" ]; then

+  cp $DOMAIN_HOME/config/domain.xml $DOMAIN_HOME/config/domain.xml_bak

+  patch  $DOMAIN_HOME/config/domain.xml ${targetDirectory}/domain.xml.patch

+  if [ $? ne 0] ; then

+    echo "Patching domain.xml failed.."

+    exit 1;

+  fi

+  echo "patched domain.xml"

+fi

+

+# setup entityengine.xml

+if [ -f "${ofbizHome}/framework/entity/config/entityengine.xml" ]; then

+    cp ${ofbizHome}/framework/entity/config/entityengine.xml ${ofbizHome}/framework/entity/config/entityengine.xml_bak

+    patch  framework/entity/config/entityengine.xml ${targetDirectory}/entityengine.xml.patch

+    if [ $? ne 0] ; then

+      echo "Patching entityengine.xml failed.."

+      exit 1;

+    fi

+    echo "patched entityengine.xml"

+fi

+

+# setup url.properties (SSL port)

+if [ -f "${ofbizHome}/framework/webapp/config/url.properties" ]; then

+    mv ${ofbizHome}/framework/webapp/config/url.properties ${ofbizHome}/framework/webapp/config/url.properties_bak

+    cp ${targetDirectory}/url.properties ${ofbizHome}/framework/webapp/config/url.properties

+    echo "Copied url.properties"

+fi

+

+# copy all lib files

+mkdir lib

+<#list classpathJars as jar>

+<#if (!jar.contains("j2eespec") && !jar.contains("catalina") && !jar.contains("mx4j") && !jar.contains("derby-") && !jar.contains("commons-el") && !jar.contains("avalon-framework") && !jar.contains("mail.jar"))>

+cp ${jar} ./lib

+</#if>

+</#list>

+echo "installed ofbiz libraries"

+

+<#list classpathDirs as dir>

+<#if (dir != ofbizHome)>

+<#assign jarname = dir.substring(ofbizHome.length()+1)/>

+<#assign jarname = jarname.replaceAll("/", ".")/>

+jar cvf ./lib/${jarname}.jar -C ${dir} .

+</#if>

+</#list>

+echo "\n\n"

+echo "packaged and installed ofbiz configuration directories"

+

+# WAR the web applications

+<#list webApps as webapp>

+jar -cvf ${webapp.getName()}.war -C ${webapp.getLocation()} .

+</#list>

+echo "WARred webapp directories"

+

+# create the application meta data

+mkdir META-INF

+cp ${targetDirectory}/application.xml ./META-INF

+echo "installed application.xml"

+

+# build EAR

+jar -cvf ofbiz.ear *

+

+# copy the EAR to autodeploy dir

+cp ofbiz.ear $DOMAIN_HOME/autodeploy/ofbiz.ear

+echo "Copied EAR to autodeploy"

+

+# revert entityengine.xml

+if [ -f "${ofbizHome}/framework/entity/config/entityengine.xml_bak" ]; then

+    mv ${ofbizHome}/framework/entity/config/entityengine.xml_bak ${ofbizHome}/framework/entity/config/entityengine.xml

+    echo "restored entityengine.xml"

+fi

+

+# revert url.properties

+if [ -f "${ofbizHome}/framework/webapp/config/url.properties_bak" ]; then

+    mv ${ofbizHome}/framework/webapp/config/url.properties_bak ${ofbizHome}/framework/webapp/config/url.properties

+    echo "restored url.properties"

+fi

+

+

+echo "\n"

diff --git a/framework/appserver/templates/glassfish21/entityengine.xml.patch b/framework/appserver/templates/glassfish21/entityengine.xml.patch
new file mode 100644
index 0000000..cb0fab6
--- /dev/null
+++ b/framework/appserver/templates/glassfish21/entityengine.xml.patch
@@ -0,0 +1,79 @@
+###############################################################################

+# Licensed to the Apache Software Foundation (ASF) under one

+# or more contributor license agreements.  See the NOTICE file

+# distributed with this work for additional information

+# regarding copyright ownership.  The ASF licenses this file

+# to you 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.

+###############################################################################

+53,54c53,54

+<         <group-map group-name="org.ofbiz" datasource-name="localderby"/>

+<         <group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>

+---

+>         <group-map group-name="org.ofbiz" datasource-name="derby"/>

+>         <group-map group-name="org.ofbiz.olap" datasource-name="derbyolap"/>

+55a56,57

+> 

+> 

+123a126,176

+> 

+>     <datasource name="derby"

+>             helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"

+>             schema-name="ofbiz"

+>             field-type-name="derby"

+>             check-on-start="true"

+>             add-missing-on-start="true"

+>             use-pk-constraint-names="false"

+>             use-indices-unique="false"

+>             alias-view-columns="false">

+>         <read-data reader-name="seed"/>

+>         <read-data reader-name="seed-initial"/>

+>         <read-data reader-name="demo"/>

+>         <read-data reader-name="ext"/>

+>         <inline-jdbc

+>                 jdbc-driver="org.apache.derby.jdbc.ClientDriver"

+>                 jdbc-uri="jdbc:derby://localhost:1527/ofbiz;create=true"

+>                 jdbc-username="ofbiz"

+>                 jdbc-password="ofbiz"

+>                 isolation-level="ReadCommitted"

+>                 pool-minsize="2"

+>                 pool-maxsize="250"/>

+>         <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/DerbyDataSource" isolation-level="ReadCommitted"/> -->

+>     </datasource>

+> 

+> 

+>     <datasource name="derbyolap"

+>             helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"

+>             schema-name="ofbiz"

+>             field-type-name="derby"

+>             check-on-start="true"

+>             add-missing-on-start="true"

+>             use-pk-constraint-names="false"

+>             use-indices-unique="false"

+>             alias-view-columns="false">

+>         <read-data reader-name="seed"/>

+>         <read-data reader-name="seed-initial"/>

+>         <read-data reader-name="demo"/>

+>         <read-data reader-name="ext"/>

+>         <inline-jdbc

+>                 jdbc-driver="org.apache.derby.jdbc.ClientDriver"

+>                 jdbc-uri="jdbc:derby://localhost:1527/ofbiz;create=true"

+>                 jdbc-username="ofbiz"

+>                 jdbc-password="ofbiz"

+>                 isolation-level="ReadCommitted"

+>                 pool-minsize="2"

+>                 pool-maxsize="250"/>

+>         <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/DerbyDataSource" isolation-level="ReadCommitted"/> -->

+>     </datasource>

+> 

+> 

diff --git a/framework/appserver/templates/glassfish21/run.sh b/framework/appserver/templates/glassfish21/run.sh
new file mode 100644
index 0000000..4a80f82
--- /dev/null
+++ b/framework/appserver/templates/glassfish21/run.sh
@@ -0,0 +1,80 @@
+#!/bin/sh 

+

+###############################################################################

+# Licensed to the Apache Software Foundation (ASF) under one

+# or more contributor license agreements.  See the NOTICE file

+# distributed with this work for additional information

+# regarding copyright ownership.  The ASF licenses this file

+# to you 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.

+###############################################################################

+

+# Check args.

+

+if [ $# -ne 2 ]; then

+  echo "Input required ..."

+  echo "Syntax: $0 <glassfish-home> <glassfish-domain-directory-path>"

+  exit 1

+fi

+

+GLASSFISH_HOME=$1

+DOMAIN_HOME=$2

+WORK_DIR=$PWD

+

+# Setup JavaDB JDBC driver.

+cd ../ 

+cp $GLASSFISH_HOME/javadb/lib/derbyclient.jar ${ofbizHome}/framework/entity/lib/jdbc/derbyclient.jar

+echo "Installed JDBC driver for JavaDB"

+

+# Generate seed and demo data.

+cd ${ofbizHome}

+cp framework/entity/config/entityengine.xml framework/entity/config/entityengine.xml_orig

+patch framework/entity/config/entityengine.xml ${targetDirectory}/entityengine.xml.patch 

+if [ $? ne 0] ; then

+ echo "Patching entityengine.xml failed.."

+ exit 1;

+fi

+

+ # Start JavaDB server.

+ cd $GLASSFISH_HOME

+ export DERBY_HOME=$PWD/javadb

+ export DERBY_OPTS=-Dderby.system.home=$PWD/domains/domain1/config

+ sh javadb/bin/startNetworkServer &

+echo "Started JavaDB server"

+

+ # Load the seed and demo data.

+ cd ${ofbizHome} 

+ ./ant run-install

+echo "Loaded seed and demo data"

+

+ # Restore entityengine.xml

+ mv framework/entity/config/entityengine.xml_orig framework/entity/config/entityengine.xml

+

+

+# Setup work area (where the WARs and EAR to be built.

+cp ${targetDirectory}/deploy.sh $WORK_DIR  

+

+# Run the deployment script.

+echo "Running the deployment script"

+cd $WORK_DIR  

+chmod +x deploy.sh  

+./deploy.sh $GLASSFISH_HOME $DOMAIN_HOME > run.log  

+

+

+# Finally start glassfish server.

+#echo "Starting glassfish server .."

+#cd $GLASSFISH_HOME

+#bin/asadmin start-domain &

+

+cd ..

+echo "done"

diff --git a/framework/appserver/templates/glassfish21/url.properties b/framework/appserver/templates/glassfish21/url.properties
new file mode 100644
index 0000000..eeeee73
--- /dev/null
+++ b/framework/appserver/templates/glassfish21/url.properties
@@ -0,0 +1,45 @@
+###############################################################################

+# Licensed to the Apache Software Foundation (ASF) under one

+# or more contributor license agreements.  See the NOTICE file

+# distributed with this work for additional information

+# regarding copyright ownership.  The ASF licenses this file

+# to you 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.

+###############################################################################

+####

+# OFBiz Global URL Settings - WebSite specific settings found in WebSite entity

+####

+

+# HTTPS Port (Secure port)

+port.https.enabled=Y

+port.https=8181

+force.https.host=

+

+# HTTP Port (Not Secure port)

+port.http=8080

+force.http.host=

+

+# Static Content URLs to make it easy to move the serving load for static content to other machines

+# -- thse are for general content such as images, js & css files, or non-dynamic HTML files

+content.url.prefix.secure=

+content.url.prefix.standard=

+

+# Here you can set the domain string to use for new cookies

+cookie.domain=

+

+# Exclude jsessionid for User-Agents (separated by comma's)

+link.remove_lsessionid.user_agent_list = googlebot,yahoo,msnbot

+

+# Should HTTP parameters sent to services require encryption?

+# This is generally advised for more secure webapps as it makes it more difficult to spoof requests (XSRF) that change data. 

+service.http.parameters.require.encrypted=Y

diff --git a/framework/appserver/templates/jboss422/application.xml b/framework/appserver/templates/jboss422/application.xml
new file mode 100644
index 0000000..57b0822
--- /dev/null
+++ b/framework/appserver/templates/jboss422/application.xml
@@ -0,0 +1,18 @@
+<application xmlns="http://java.sun.com/xml/ns/javaee"
+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd"
+               version="5">
+
+    <description>Open For Business - Deployment</description>
+    <display-name>OFBiz</display-name>
+
+    <#list webApps as webapp>
+
+    <module>
+        <web>
+            <web-uri>${webapp.getContextRoot()}.war</web-uri>
+            <context-root>${webapp.getContextRoot()}</context-root>
+        </web>
+    </module>
+    </#list>
+</application>
diff --git a/framework/appserver/templates/jboss422/build.xml b/framework/appserver/templates/jboss422/build.xml
new file mode 100644
index 0000000..590feec
--- /dev/null
+++ b/framework/appserver/templates/jboss422/build.xml
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you 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.
+  -->
+
+<!-- ======================================================================
+     OFBiz -> JBoss 4.2.2 Installer
+     ====================================================================== -->
+
+<project name="OfBiz JBoss" default="generate">
+    <description>
+        Create the ear file to run OfBiz in Jboss
+    </description>
+
+    <property name="DERBY_VERSION" value="10.4.2.0"/>
+    <property name="ofbizHome" location="${ofbizHome}/"/>
+
+
+    <!-- =================================
+    target: generate
+    ================================= -->
+    <target name="generate" depends="installDerby" description="--> Create the ear file to run OfBiz in Jboss"/>
+
+    <!-- - - - - - - - - - - - - - - - - -
+    target: clean
+    - - - - - - - - - - - - - - - - - -->
+    <target name="clean">
+        <delete failonerror="false">
+            <fileset dir="./META-INF/">
+                <include name="**/**"/>
+            </fileset>
+        </delete>
+        <delete failonerror="false">
+            <fileset dir=".">
+                <include name="lib/** *.war"/>
+            </fileset>
+        </delete>
+
+    </target>
+
+    <!-- - - - - - - - - - - - - - - - - -
+    target: installDerby
+    - - - - - - - - - - - - - - - - - -->
+    <target name="installDerby" depends="clean">
+        <!-- install derby -->
+        <copy file="${r"${ofbizHome}"}/framework/entity/lib/jdbc/derby-${r"${DERBY_VERSION}"}.jar" todir="../../lib/"/>
+
+        <!-- install derby plugin -->
+        <copy file="../../../../docs/examples/varia/derby-plugin.jar" todir="../../lib/"/>
+
+        <!-- install derby datasource -->
+        <copy todir=".">
+            <fileset dir="${r"${ofbizHome}"}/framework/appserver/templates/jboss422/patches/">
+                <include name="derby*.xml"/>
+            </fileset>
+        </copy>
+
+        <!-- move entityengine.xml, log4j.xml and jndi.properties -->
+        <move file="${r"${ofbizHome}"}/framework/entity/config/entityengine.xml" tofile="${r"${ofbizHome}"}/framework/entity/config/entityengine.xml.jbak"/>
+        <move file="${r"${ofbizHome}"}/framework/entity/config/entityengine-jboss422.xml" tofile="${r"${ofbizHome}"}/framework/entity/config/entityengine.xml"/>
+        <move file="${r"${ofbizHome}"}/framework/base/config/log4j.xml" tofile="${r"${ofbizHome}"}/framework/base/config/_log4j.xml.bak"/>
+        <move file="${r"${ofbizHome}"}/framework/base/config/jndi.properties" tofile="${r"${ofbizHome}"}/framework/base/config/_jndi.properties.bak"/>
+
+        <!-- copy all lib files -->
+        <mkdir dir="lib"/>
+        <copy todir="./lib" flatten="true">
+            <fileset dir="${r"${ofbizHome}"}">
+                <#list classpathJars as jar>
+                  <#assign fullJarName = jar?j_string />
+                  <#assign jarname = (fullJarName?substring(ofbizHome?length +1))?j_string/>
+                  <include name="${jarname}"/>
+                </#list>
+                <exclude name="**/*j2eespec*.jar"/>
+                <exclude name="**/*geronimo*.jar"/>
+                <exclude name="**/*catalina*.jar"/>
+                <exclude name="**/*tomcat*.jar"/>
+                <exclude name="**/*mx4j*.jar"/>
+                <exclude name="**/*derby-*.jar"/>
+                <exclude name="**/*commons-logging*.jar"/>
+                <exclude name="**/*commons-collections*.jar "/>
+                <exclude name="**/*commons-codec*.jar"/>
+                <exclude name="**/*commons-el*.jar"/>
+                <exclude name="**/*avalon-framework*.jar"/>
+                <exclude name="**/*bsh*.jar"/>
+                <exclude name="**/*bsf*.jar"/>
+                <exclude name="**/*antlr*.jar"/>
+                <exclude name="**/*mail.jar"/>
+                <exclude name="**/*xerces*.jar"/>
+                <exclude name="**/*xalan*.jar"/>
+            </fileset>
+        </copy>
+
+        <#list classpathDirs as dir>
+            <#if (dir != ofbizHome)>
+                <#assign dirname = dir?substring((ofbizHome?j_string)?length +1) />
+                <#assign dirname = dirname?replace("/", ".", "r")/>
+                <jar destfile="./lib/${dirname}.jar">
+                    <fileset dir="${dir}">
+                        <include name="**/**"/>
+                    </fileset>
+                </jar>
+            </#if>
+        </#list>
+
+        <!-- link the web applications -->
+        <#list webApps as webapp>
+            <copy todir=".${webapp.getContextRoot()}.war">
+                <fileset dir="${webapp.getLocation()}"/>
+            </copy>
+        </#list>
+
+        <!--  create the application meta data -->
+        <mkdir dir="META-INF"/>
+        <copy file="${targetDirectory}/application.xml" todir="./META-INF"></copy>
+
+        <copy file="${r"${ofbizHome}"}/framework/base/lib/scripting/bsh-2.0b4.jar" tofile="../../lib/bsh.jar"/>
+
+        <!-- revert entityengine.xml log4j.xml and jndi.properties -->
+        <move file="${r"${ofbizHome}"}/framework/entity/config/entityengine.xml" tofile="${r"${ofbizHome}"}/framework/entity/config/entityengine-jboss422.xml"/>
+        <move file="${r"${ofbizHome}"}/framework/entity/config/entityengine.xml.jbak" tofile="${r"${ofbizHome}"}/framework/entity/config/entityengine.xml"/>
+
+        <move file="${r"${ofbizHome}"}/framework/base/config/_log4j.xml.bak" tofile="${r"${ofbizHome}"}/framework/base/config/log4j.xml"/>
+        <move file="${r"${ofbizHome}"}/framework/base/config/_jndi.properties.bak" tofile="${r"${ofbizHome}"}/framework/base/config/jndi.properties"/>
+
+        <!-- setup the OFBIZ_HOME by updating run.conf -->
+        <move file="../../../../bin/run.conf" tofile="../../../../bin/run.conf.obak"/>
+        <copy file="${r"${ofbizHome}"}/setup/jboss422/run.conf" tofile="../../../../bin/run.conf"/>
+    </target>
+</project>
diff --git a/framework/appserver/templates/jboss422/deploy.sh b/framework/appserver/templates/jboss422/deploy.sh
new file mode 100755
index 0000000..d308728
--- /dev/null
+++ b/framework/appserver/templates/jboss422/deploy.sh
@@ -0,0 +1,120 @@
+#!/bin/sh
+
+#################################
+# JBoss Deployment              #
+#                               #
+# Copy to ofbiz.ear directory   #
+# in the JBoss deploy directory #
+#                               #
+#################################
+DERBY_VERSION="10.4.1.3"
+
+if [ -f "./META-INF/application.xml" ]; then
+  rm -rf META-INF
+  echo "removed META-INF"
+fi
+if [ -f "./lib/ofbiz-base.jar" ]; then
+  rm -rf lib
+  echo "removed libs"
+  rm *.war
+  echo "removed wars"
+fi
+
+# install derby
+if [ ! -f "../../lib/derby-$DERBY_VERSION.jar" ]; then
+  cp "${ofbizHome}/framework/entity/lib/jdbc/derby-$DERBY_VERSION.jar" ../../lib/
+  echo "installed derby-$DERBY_VERSION"
+fi
+
+# install derby plugin
+if [ ! -f "../../lib/derby-plugin.jar" ]; then
+  cp ../../../../docs/examples/varia/derby-plugin.jar ../../lib/
+  echo "installed derby-plugin.jar"
+fi
+
+# install derby datasource
+if [ ! -f "../derby-ds.xml" ]; then
+  cp ${ofbizHome}/framework/appserver/templates/jboss422/patches/derby*.xml ..
+  echo "derby datasource configuration installed"
+fi
+
+# configure the jboss entity engine (patch) configuration
+if [ ! -f "${ofbizHome}/framework/entity/config/entityengine-jboss422.xml" ]; then
+  patch -i ${ofbizHome}/framework/appserver/templates/jboss422/patches/jboss-ee-cfg.patch -o ${ofbizHome}/framework/entity/config/entityengine-jboss422.xml ${ofbizHome}/framework/entity/config/entityengine.xml
+  echo "created entityengine-jboss.xml"
+fi
+
+# move entityengine.xml, log4j.xml and jndi.properties
+if [ -f "${ofbizHome}/framework/entity/config/entityengine-jboss422.xml" ]; then
+  mv ${ofbizHome}/framework/entity/config/entityengine.xml ${ofbizHome}/framework/entity/config/entityengine.xml.jbak
+  mv ${ofbizHome}/framework/entity/config/entityengine-jboss422.xml ${ofbizHome}/framework/entity/config/entityengine.xml
+  echo "moved entityengine.xml"
+fi
+if [ -f "${ofbizHome}/framework/base/config/log4j.xml" ]; then
+  mv ${ofbizHome}/framework/base/config/log4j.xml ${ofbizHome}/framework/base/config/_log4j.xml.bak
+  echo "moved ${ofbizHome}/framework/base/config/log4j.xml"
+fi
+if [ -f "${ofbizHome}/framework/base/config/jndi.properties" ]; then
+  mv ${ofbizHome}/framework/base/config/jndi.properties ${ofbizHome}/framework/base/config/_jndi.properties.bak
+  echo "moved ${ofbizHome}/framework/base/config/jndi.properties"
+fi
+
+# copy all lib files
+mkdir lib
+<#list classpathJars as jar>
+<#if (!jar.contains("j2eespec") && !jar.contains("geronimo") && !jar.contains("catalina") && !jar.contains("mx4j") && !jar.contains("derby-") && !jar.contains("commons-logging") &&!jar.contains("commons-collections") &&!jar.contains("commons-codec") && !jar.contains("commons-el") && !jar.contains("avalon-framework") && !jar.contains("bsh") && !jar.contains("bsf") && !jar.contains("antlr") && !jar.contains("mail.jar"))>
+cp ${jar} ./lib
+</#if>
+</#list>
+echo "installed ofbiz libraries"
+
+<#list classpathDirs as dir>
+<#if (dir != ofbizHome)>
+<#assign jarname = dir.substring(ofbizHome.length()+1)/>
+<#assign jarname = jarname.replaceAll("/", ".")/>
+jar cvf ./lib/${jarname}.jar -C ${dir} .
+</#if>
+</#list>
+echo "\n\n"
+echo "packaged and installed ofbiz configuration directories"
+
+# link the web applications
+<#list webApps as webapp>
+ln -s ${webapp.getLocation()} .${webapp.getContextRoot()}.war
+</#list>
+echo "linked webapp directories"
+
+# create the application meta data
+mkdir META-INF
+cp ${targetDirectory}/application.xml ./META-INF
+echo "installed application.xml"
+
+# replace jboss bsh.jar with the ofbiz version
+if [ -f "../../lib/bsh.jar" ]; then
+  cp ${ofbizHome}/framework/base/lib/scripting/bsh-2.0b4.jar ../../lib/bsh.jar
+  echo "updated bsh.jar"
+fi
+
+# revert entityengine.xml log4j.xml and jndi.properties
+if [ -f "${ofbizHome}/framework/entity/config/entityengine.xml.jbak" ]; then
+  mv ${ofbizHome}/framework/entity/config/entityengine.xml ${ofbizHome}/framework/entity/config/entityengine-jboss422.xml
+  mv ${ofbizHome}/framework/entity/config/entityengine.xml.jbak ${ofbizHome}/framework/entity/config/entityengine.xml
+  echo "fixed entityengine.xml"
+fi
+if [ -f "${ofbizHome}/framework/base/config/_log4j.xml.bak" ]; then
+  mv ${ofbizHome}/framework/base/config/_log4j.xml.bak ${ofbizHome}/framework/base/config/log4j.xml
+  echo "fixed ${ofbizHome}/framework/base/config/log4j.xml"
+fi
+if [ -f "${ofbizHome}/framework/base/config/_jndi.properties.bak" ]; then
+  mv ${ofbizHome}/framework/base/config/_jndi.properties.bak ${ofbizHome}/framework/base/config/jndi.properties
+  echo "fixed ${ofbizHome}/framework/base/config/jndi.properties"
+fi
+
+# setup the OFBIZ_HOME by updating run.conf
+if [ ! -f "../../../../bin/run.conf.obak" ]; then
+  mv ../../../../bin/run.conf ../../../../bin/run.conf.obak
+  cp ${ofbizHome}/setup/jboss422/run.conf ../../../../bin/run.conf
+  echo "modifed bin/run.conf (with backup)"
+fi
+
+echo "\n"
diff --git a/framework/appserver/templates/jboss422/patches/derby-ds.xml b/framework/appserver/templates/jboss422/patches/derby-ds.xml
new file mode 100644
index 0000000..d38a9cb
--- /dev/null
+++ b/framework/appserver/templates/jboss422/patches/derby-ds.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you 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.
+  -->
+
+<!-- The Derby embedded database JCA connection factory config
+$Id: derby-ds.xml,v 1.1.4.1 2004/11/03 13:28:39 loubyansky Exp $ -->
+
+
+<datasources>
+   <local-tx-datasource>
+
+      <!-- The jndi name of the DataSource, it is prefixed with java:/ -->
+      <!-- Datasources are not available outside the virtual machine -->
+      <jndi-name>OFBizDS</jndi-name>
+
+      <!-- for in-process persistent db, saved when jboss stops. The
+      org.jboss.jdbc.DerbyDatabase mbean is necessary for properly db shutdown -->
+      <connection-url>jdbc:derby:${jboss.server.data.dir}${/}derby${/}ofbiz;create=true</connection-url>
+
+      <!-- The driver class -->
+      <driver-class>org.apache.derby.jdbc.EmbeddedDriver</driver-class>
+
+      <!-- The login and password -->
+      <user-name>sa</user-name>
+      <password></password>
+
+      <!-- The minimum connections in a pool/sub-pool. Pools are lazily constructed on first use -->
+      <min-pool-size>2</min-pool-size>
+
+      <!-- The maximum connections in a pool/sub-pool -->
+      <max-pool-size>5</max-pool-size>
+
+      <!-- The time before an unused connection is destroyed -->
+      <idle-timeout-minutes>15</idle-timeout-minutes>
+
+      <!-- Whether to check all statements are closed when the connection is returned to the pool,
+           this is a debugging feature that should be turned off in production -->
+      <track-statements/>
+
+      <!-- This mbean can be used when using in process persistent derby -->
+      <depends>jboss:service=OFBiz</depends>
+   </local-tx-datasource>
+
+   <mbean code="org.jboss.jdbc.DerbyDatabase" name="jboss:service=OFBiz"/>
+</datasources>
diff --git a/framework/appserver/templates/jboss422/patches/derby-ol-ds.xml b/framework/appserver/templates/jboss422/patches/derby-ol-ds.xml
new file mode 100644
index 0000000..38b5c9d
--- /dev/null
+++ b/framework/appserver/templates/jboss422/patches/derby-ol-ds.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you 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.
+  -->
+
+<!-- The Derby embedded database JCA connection factory config
+$Id: derby-ds.xml,v 1.1.4.1 2004/11/03 13:28:39 loubyansky Exp $ -->
+
+
+<datasources>
+   <local-tx-datasource>
+
+      <!-- The jndi name of the DataSource, it is prefixed with java:/ -->
+      <!-- Datasources are not available outside the virtual machine -->
+      <jndi-name>OFBizOlapDS</jndi-name>
+
+      <!-- for in-process persistent db, saved when jboss stops. The
+      org.jboss.jdbc.DerbyDatabase mbean is necessary for properly db shutdown -->
+      <connection-url>jdbc:derby:${jboss.server.data.dir}${/}derby${/}ofbizolap;create=true</connection-url>
+
+      <!-- The driver class -->
+      <driver-class>org.apache.derby.jdbc.EmbeddedDriver</driver-class>
+
+      <!-- The login and password -->
+      <user-name>sa</user-name>
+      <password></password>
+
+      <!-- The minimum connections in a pool/sub-pool. Pools are lazily constructed on first use -->
+      <min-pool-size>2</min-pool-size>
+
+      <!-- The maximum connections in a pool/sub-pool -->
+      <max-pool-size>5</max-pool-size>
+
+      <!-- The time before an unused connection is destroyed -->
+      <idle-timeout-minutes>15</idle-timeout-minutes>
+
+      <!-- Whether to check all statements are closed when the connection is returned to the pool,
+           this is a debugging feature that should be turned off in production -->
+      <track-statements/>
+
+      <!-- This mbean can be used when using in process persistent derby -->
+      <depends>jboss:service=OFBizOlap</depends>
+   </local-tx-datasource>
+
+   <mbean code="org.jboss.jdbc.DerbyDatabase" name="jboss:service=OFBizOlap"/>
+</datasources>
diff --git a/framework/appserver/templates/jboss422/patches/jboss-ee-cfg.patch b/framework/appserver/templates/jboss422/patches/jboss-ee-cfg.patch
new file mode 100644
index 0000000..eacddbb
--- /dev/null
+++ b/framework/appserver/templates/jboss422/patches/jboss-ee-cfg.patch
@@ -0,0 +1,78 @@
+Index: framework/entity/config/entityengine.xml
+===================================================================
+--- framework/entity/config/entityengine.xml	(revision 661518)
++++ framework/entity/config/entityengine.xml	(working copy)
+@@ -28,15 +28,15 @@
+
+     <!-- the transaction factory class to use, one is needed for each way of getting JTA interfaces -->
+     <!-- Use this one for Geronimo -->
+-    <transaction-factory class="org.ofbiz.geronimo.GeronimoTransactionFactory"/>
++    <!--<transaction-factory class="org.ofbiz.geronimo.GeronimoTransactionFactory"/>-->
+
+     <!-- Use this one for getting the JTA objects from JNDI -->
+-    <!-- NOTE: to use the JndiFactory you must specify the necessary JNDI properties
++    <!-- NOTE: to use the JndiFactory you must specify the necessary JNDI properties -->
+     <transaction-factory class="org.ofbiz.entity.transaction.JNDIFactory">
+         <user-transaction-jndi jndi-server-name="default" jndi-name="java:comp/UserTransaction"/>
+-        <transaction-manager-jndi jndi-server-name="default" jndi-name="java:comp/UserTransaction"/>
++        <transaction-manager-jndi jndi-server-name="default" jndi-name="java:/TransactionManager"/>
+     </transaction-factory>
+-    -->
++
+     <!--
+     	It is common to use UserTransaction for the TransactionManager, but if that doesn't work, try this: <transaction-manager-jndi jndi-server-name="default" jndi-name="java:comp/TransactionManager"/>
+         Common UserTransaction locations:
+@@ -160,6 +160,7 @@
+         <read-data reader-name="seed-initial"/>
+         <read-data reader-name="demo"/>
+         <read-data reader-name="ext"/>
++        <!--
+         <inline-jdbc
+                 jdbc-driver="org.apache.derby.jdbc.EmbeddedDriver"
+                 jdbc-uri="jdbc:derby:ofbiz;create=true"
+@@ -168,7 +169,8 @@
+                 isolation-level="ReadCommitted"
+                 pool-minsize="2"
+                 pool-maxsize="250"/>
+-        <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/DerbyDataSource" isolation-level="ReadCommitted"/> -->
++        -->
++        <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/OFBizDS" isolation-level="ReadCommitted"/>
+     </datasource>
+     <datasource name="localderbyodbc"
+         helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"
+@@ -179,6 +181,7 @@
+         use-pk-constraint-names="false"
+         use-indices-unique="false"
+         alias-view-columns="false">
++        <!--
+         <inline-jdbc
+             jdbc-driver="org.apache.derby.jdbc.EmbeddedDriver"
+             jdbc-uri="jdbc:derby:ofbizodbc;create=true"
+@@ -187,7 +190,8 @@
+             isolation-level="ReadCommitted"
+             pool-minsize="2"
+             pool-maxsize="250"/>
+-        <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/DerbyDataSource" isolation-level="ReadCommitted"/> -->
++        -->
++        <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/OFBizOdbcDS" isolation-level="ReadCommitted"/>
+     </datasource>
+     <datasource name="localderbyolap"
+             helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"
+@@ -202,6 +206,7 @@
+         <read-data reader-name="seed-initial"/>
+         <read-data reader-name="demo"/>
+         <read-data reader-name="ext"/>
++        <!--
+         <inline-jdbc
+                 jdbc-driver="org.apache.derby.jdbc.EmbeddedDriver"
+                 jdbc-uri="jdbc:derby:ofbizolap;create=true"
+@@ -210,7 +215,8 @@
+                 isolation-level="ReadCommitted"
+                 pool-minsize="2"
+                 pool-maxsize="250"/>
+-        <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/DerbyDataSource" isolation-level="ReadCommitted"/> -->
++        -->
++        <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/OFBizOlapDS" isolation-level="ReadCommitted"/>
+     </datasource>
+
+     <datasource name="localcloudscape"
diff --git a/framework/appserver/templates/jboss422/run.conf b/framework/appserver/templates/jboss422/run.conf
new file mode 100644
index 0000000..45f634a
--- /dev/null
+++ b/framework/appserver/templates/jboss422/run.conf
@@ -0,0 +1,51 @@
+## -*- shell-script -*- ######################################################
+##                                                                          ##
+##  JBoss Bootstrap Script Configuration                                    ##
+##                                                                          ##
+##############################################################################
+
+### $Id: run.conf 62747 2007-05-02 17:43:36Z dimitris@jboss.org $
+
+#
+# This file is optional; it may be removed if not needed.
+#
+
+#
+# Specify the maximum file descriptor limit, use "max" or "maximum" to use
+# the default, as queried by the system.
+#
+# Defaults to "maximum"
+#
+#MAX_FD="maximum"
+
+#
+# Specify the profiler configuration file to load.
+#
+# Default is to not load profiler configuration file.
+#
+#PROFILER=""
+
+#
+# Specify the location of the Java home directory.  If set then $JAVA will
+# be defined to $JAVA_HOME/bin/java, else $JAVA will be "java".
+#
+#JAVA_HOME="/opt/java/jdk"
+
+#
+# Specify the exact Java VM executable to use.
+#
+#JAVA=""
+
+#
+# Specify options to pass to the Java VM.
+#
+if [ "x$JAVA_OPTS" = "x" ]; then
+   #JAVA_OPTS="-Xmx1024M -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"
+   JAVA_OPTS="-Xmx512M -XX:PermSize=512M -Dofbiz.home=${ofbizHome}"
+fi
+
+# Sample JPDA settings for remote socket debuging
+#JAVA_OPTS="$JAVA_OPTS -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n"
+
+# Sample JPDA settings for shared memory debugging
+#JAVA_OPTS="$JAVA_OPTS -Xrunjdwp:transport=dt_shmem,server=y,suspend=n,address=jboss"
diff --git a/framework/appserver/templates/orion202/README b/framework/appserver/templates/orion202/README
new file mode 100644
index 0000000..a7ed147
--- /dev/null
+++ b/framework/appserver/templates/orion202/README
@@ -0,0 +1,36 @@
+
+Orion Application Server 2.0.2 Setup
+2004-04-01 - Andy Zeneski
+
+To use Orion 2.0.2 with OFBiz 3.0 follow the following steps:
+
+(all steps assume Orion is already installed and working)
+
+1) generate the configuration files (auto-creates classpath and webapp settings)
+
+- From the OFBiz root directory:
+java -jar ofbiz.jar -start framework/appservers/configure orion202
+
+2) Copy the newly created configuration files to orion config directory
+
+- From the Orion config directory (assuming ofbiz root is ../../ofbiz)
+cp ../../ofbiz/setup/orion202/*.xml .
+
+3) Configure OFBiz for running inside Orion
+
+- Comment out or remove base/config/jndi.properties so you use the one provided w/ Orion
+- Edit entityengine.xml to use JNDI for the datasource, this should match the JNDI name
+  specified in orion data-source.xml
+
+4) Run Orion
+
+- From Orion root directory
+java -Dofbiz.home=../../ofbiz -jar orion.jar
+
+The filter will load the components on the first hit, I have not yet figured out
+how to get Orion to auto-load filters.
+
+*** Note this is an example configuration and SSL is not enabled by default.
+If you would like to contribute the SSL configuration please post it to the
+dev mailing list and we wil include the templates. Until then, you will also
+need to disable SSL in framework/webapp/config/url.properties
diff --git a/framework/appserver/templates/orion202/ofbiz-application.xml b/framework/appserver/templates/orion202/ofbiz-application.xml
new file mode 100644
index 0000000..821806e
--- /dev/null
+++ b/framework/appserver/templates/orion202/ofbiz-application.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0"?>
+<!DOCTYPE orion-application PUBLIC "-//Evermind//DTD J2EE Application runtime 1.2//EN" "http://www.orionserver.com/dtds/orion-application.dtd">
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<!-- The global application config that is the parent of all the other
+    applications in this server. -->
+<orion-application>
+    <web-module id="ofbizDefault" path="${env.get("ofbiz.home")}/website"/>
+
+    <#list webApps as webapp>
+    <web-module id="${webapp.getName()}" path="${webapp.getLocation()}"/>
+    </#list>
+    <persistence path="../persistence"/>
+
+    <!-- Path to the libraries that are installed on this server.
+         These will accesible for the servlets, EJBs etc -->
+    <library path="../lib"/>
+    <#list classpathJars as jar>
+    <library path="${jar}"/>
+    </#list>
+    <#list classpathDirs as dir>
+    <library path="${dir}"/>
+    </#list>
+
+    <principals path="./principals.xml"/>
+
+    <log>
+        <file path="../log/ofbiz-application.log"/>
+    </log>
+
+    <data-sources path="data-sources.xml"/>
+
+    <namespace-access>
+        <read-access>
+            <namespace-resource root="">
+                <security-role-mapping>
+                    <group name="administrators"/>
+                </security-role-mapping>
+            </namespace-resource>
+        </read-access>
+        <write-access>
+            <namespace-resource root="">
+                <security-role-mapping>
+                    <group name="administrators"/>
+                </security-role-mapping>
+            </namespace-resource>
+        </write-access>
+    </namespace-access>
+</orion-application>
diff --git a/framework/appserver/templates/orion202/ofbiz-http-site.xml b/framework/appserver/templates/orion202/ofbiz-http-site.xml
new file mode 100644
index 0000000..3df8085
--- /dev/null
+++ b/framework/appserver/templates/orion202/ofbiz-http-site.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<!DOCTYPE web-site PUBLIC "Orion Web-site" "http://www.orionserver.com/dtds/web-site.dtd">
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+
+<web-site host="[ALL]" port="8080" display-name="OFBiz HTTP WebSite">
+    <!-- The default web-app for this site, bound to the root -->
+    <default-web-app application="ofbiz" name="ofbizDefault"/>
+
+    <#list webApps as webapp>
+    <web-app load-on-startup="true" application="ofbiz" shared="true" name="${webapp.getName()}" root="${webapp.getContextRoot()}"/>
+    </#list>
+
+    <!-- Access Log, where requests are logged to -->
+    <access-log path="../log/ofbiz-http-access.log"/>
+</web-site>
diff --git a/framework/appserver/templates/orion202/server.xml b/framework/appserver/templates/orion202/server.xml
new file mode 100644
index 0000000..a37b732
--- /dev/null
+++ b/framework/appserver/templates/orion202/server.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<!DOCTYPE application-server PUBLIC "Orion Application Server Config" "http://www.orionserver.com/dtds/application-server.dtd">
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<application-server
+    application-directory="../applications"
+    deployment-directory="../application-deployments"
+    >
+    <rmi-config path="./rmi.xml"/>
+    <!-- JMS-server config link, uncomment to activate the JMS service -->
+    <!-- <jms-config path="./jms.xml"/> -->
+    <log>
+        <file path="../log/server.log"/>
+    </log>
+
+    <global-application name="default" path="application.xml"/>
+    <global-application name="ofbiz" path="ofbiz-application.xml"/>
+
+    <global-web-app-config path="global-web-application.xml"/>
+    <web-site path="./default-web-site.xml"/>
+    <web-site path="./ofbiz-http-site.xml"/>
+
+    <!-- Compiler, activate this to specify an alternative compiler such
+        as jikes for EJB/JSP compiling. -->
+    <!-- <compiler executable="jikes" classpath="/myjdkdir/jre/lib/rt.jar"/> -->
+</application-server>
diff --git a/framework/appserver/templates/test/test1 b/framework/appserver/templates/test/test1
new file mode 100644
index 0000000..f695dd9
--- /dev/null
+++ b/framework/appserver/templates/test/test1
@@ -0,0 +1,26 @@
+<#--

+Licensed to the Apache Software Foundation (ASF) under one

+or more contributor license agreements.  See the NOTICE file

+distributed with this work for additional information

+regarding copyright ownership.  The ASF licenses this file

+to you 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.

+-->

+

+ofbiz.home = ${env.get("ofbiz.home")}

+

+Classpath - JARS

+======================================================================

+<#list classpathJars as jar>

+${jar}

+</#list>

diff --git a/framework/appserver/templates/test/test2 b/framework/appserver/templates/test/test2
new file mode 100644
index 0000000..04d0835
--- /dev/null
+++ b/framework/appserver/templates/test/test2
@@ -0,0 +1,26 @@
+<#--

+Licensed to the Apache Software Foundation (ASF) under one

+or more contributor license agreements.  See the NOTICE file

+distributed with this work for additional information

+regarding copyright ownership.  The ASF licenses this file

+to you 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.

+-->

+

+Web Applications

+======================================================================

+

+<#list webApps as webapp>

+${webapp.getName()} : ${webapp.getContextRoot()} - ${webapp.getLocation()?if_exists}

+</#list>

+

diff --git a/framework/appserver/templates/test/test3 b/framework/appserver/templates/test/test3
new file mode 100644
index 0000000..15a9226
--- /dev/null
+++ b/framework/appserver/templates/test/test3
@@ -0,0 +1,25 @@
+<#--

+Licensed to the Apache Software Foundation (ASF) under one

+or more contributor license agreements.  See the NOTICE file

+distributed with this work for additional information

+regarding copyright ownership.  The ASF licenses this file

+to you 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.

+-->

+

+Classpath - DIRS

+======================================================================

+

+<#list classpathDirs as dir>

+${dir}

+</#list>

diff --git a/framework/appserver/templates/tomcat55/catalina.bat b/framework/appserver/templates/tomcat55/catalina.bat
new file mode 100644
index 0000000..4896d67
--- /dev/null
+++ b/framework/appserver/templates/tomcat55/catalina.bat
@@ -0,0 +1,249 @@
+@echo off

+rem Licensed to the Apache Software Foundation (ASF) under one or more

+rem contributor license agreements.  See the NOTICE file distributed with

+rem this work for additional information regarding copyright ownership.

+rem The ASF licenses this file to You under the Apache License, Version 2.0

+rem (the "License"); you may not use this file except in compliance with

+rem the License.  You may obtain a copy of the License at

+rem

+rem     http://www.apache.org/licenses/LICENSE-2.0

+rem

+rem Unless required by applicable law or agreed to in writing, software

+rem distributed under the License is distributed on an "AS IS" BASIS,

+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+rem See the License for the specific language governing permissions and

+rem limitations under the License.

+

+if "%OS%" == "Windows_NT" setlocal

+rem ---------------------------------------------------------------------------

+rem Start/Stop Script for the CATALINA Server

+rem

+rem Environment Variable Prequisites

+rem

+rem   CATALINA_HOME   May point at your Catalina "build" directory.

+rem

+rem   CATALINA_BASE   (Optional) Base directory for resolving dynamic portions

+rem                   of a Catalina installation.  If not present, resolves to

+rem                   the same directory that CATALINA_HOME points to.

+rem

+rem   CATALINA_OPTS   (Optional) Java runtime options used when the "start",

+rem                   or "run" command is executed.

+rem

+rem   CATALINA_TMPDIR (Optional) Directory path location of temporary directory

+rem                   the JVM should use (java.io.tmpdir).  Defaults to

+rem                   %CATALINA_BASE%\temp.

+rem

+rem   JAVA_HOME       Must point at your Java Development Kit installation.

+rem                   Required to run the with the "debug" argument.

+rem

+rem   JRE_HOME        Must point at your Java Runtime installation.

+rem                   Defaults to JAVA_HOME if empty.

+rem

+rem   JAVA_OPTS       (Optional) Java runtime options used when the "start",

+rem                   "stop", or "run" command is executed.

+

+rem BEGIN OfBiz settings

+set JAVA_OPTS="%JAVA_OPTS% -Dofbiz.home=${ofbizHome}"

+rem END OfBiz settings

+

+rem   JSSE_HOME       (Optional) May point at your Java Secure Sockets Extension

+rem                   (JSSE) installation, whose JAR files will be added to the

+rem                   system class path used to start Tomcat.

+rem

+rem   JPDA_TRANSPORT  (Optional) JPDA transport used when the "jpda start"

+rem                   command is executed. The default is "dt_shmem".

+rem

+rem   JPDA_ADDRESS    (Optional) Java runtime options used when the "jpda start"

+rem                   command is executed. The default is "jdbconn".

+rem

+rem   JPDA_SUSPEND    (Optional) Java runtime options used when the "jpda start"

+rem                   command is executed. Specifies whether JVM should suspend

+rem                   execution immediately after startup. Default is "n".

+rem

+rem   JPDA_OPTS       (Optional) Java runtime options used when the "jpda start"

+rem                   command is executed. If used, JPDA_TRANSPORT, JPDA_ADDRESS,

+rem                   and JPDA_SUSPEND are ignored. Thus, all required jpda

+rem                   options MUST be specified. The default is:

+rem

+rem                   -Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,

+rem                       address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%

+rem

+rem $Id: catalina.bat 609438 2008-01-06 22:14:28Z markt $

+rem ---------------------------------------------------------------------------

+

+rem Guess CATALINA_HOME if not defined

+set CURRENT_DIR=%cd%

+if not "%CATALINA_HOME%" == "" goto gotHome

+set CATALINA_HOME=%CURRENT_DIR%

+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome

+cd ..

+set CATALINA_HOME=%cd%

+cd %CURRENT_DIR%

+:gotHome

+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome

+echo The CATALINA_HOME environment variable is not defined correctly

+echo This environment variable is needed to run this program

+goto end

+:okHome

+

+rem Get standard environment variables

+if "%CATALINA_BASE%" == "" goto gotSetenvHome

+if exist "%CATALINA_BASE%\bin\setenv.bat" call "%CATALINA_BASE%\bin\setenv.bat"

+goto gotSetenvBase

+:gotSetenvHome

+if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat"

+:gotSetenvBase

+

+rem Get standard Java environment variables

+if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath

+echo Cannot find %CATALINA_HOME%\bin\setclasspath.bat

+echo This file is needed to run this program

+goto end

+:okSetclasspath

+set BASEDIR=%CATALINA_HOME%

+call "%CATALINA_HOME%\bin\setclasspath.bat" %1

+if errorlevel 1 goto end

+

+rem Add on extra jar files to CLASSPATH

+if "%JSSE_HOME%" == "" goto noJsse

+set CLASSPATH=%CLASSPATH%;%JSSE_HOME%\lib\jcert.jar;%JSSE_HOME%\lib\jnet.jar;%JSSE_HOME%\lib\jsse.jar

+:noJsse

+set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\bootstrap.jar

+

+if not "%CATALINA_BASE%" == "" goto gotBase

+set CATALINA_BASE=%CATALINA_HOME%

+:gotBase

+

+if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir

+set CATALINA_TMPDIR=%CATALINA_BASE%\temp

+:gotTmpdir

+

+if not exist "%CATALINA_HOME%\bin\tomcat-juli.jar" goto noJuli

+set JAVA_OPTS=%JAVA_OPTS% -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"

+:noJuli

+

+rem ----- Execute The Requested Command ---------------------------------------

+

+echo Using CATALINA_BASE:   %CATALINA_BASE%

+echo Using CATALINA_HOME:   %CATALINA_HOME%

+echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR%

+if ""%1"" == ""debug"" goto use_jdk

+echo Using JRE_HOME:        %JRE_HOME%

+goto java_dir_displayed

+:use_jdk

+echo Using JAVA_HOME:       %JAVA_HOME%

+:java_dir_displayed

+

+set _EXECJAVA=%_RUNJAVA%

+set MAINCLASS=org.apache.catalina.startup.Bootstrap

+set ACTION=start

+set SECURITY_POLICY_FILE=

+set DEBUG_OPTS=

+set JPDA=

+

+if not ""%1"" == ""jpda"" goto noJpda

+set JPDA=jpda

+if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport

+set JPDA_TRANSPORT=dt_shmem

+:gotJpdaTransport

+if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress

+set JPDA_ADDRESS=jdbconn

+:gotJpdaAddress

+if not "%JPDA_SUSPEND%" == "" goto gotJpdaSuspend

+set JPDA_SUSPEND=n

+:gotJpdaSuspend

+if not "%JPDA_OPTS%" == "" goto gotJpdaOpts

+set JPDA_OPTS=-Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%

+:gotJpdaOpts

+shift

+:noJpda

+

+if ""%1"" == ""debug"" goto doDebug

+if ""%1"" == ""run"" goto doRun

+if ""%1"" == ""start"" goto doStart

+if ""%1"" == ""stop"" goto doStop

+if ""%1"" == ""version"" goto doVersion

+

+echo Usage:  catalina ( commands ... )

+echo commands:

+echo   debug             Start Catalina in a debugger

+echo   debug -security   Debug Catalina with a security manager

+echo   jpda start        Start Catalina under JPDA debugger

+echo   run               Start Catalina in the current window

+echo   run -security     Start in the current window with security manager

+echo   start             Start Catalina in a separate window

+echo   start -security   Start in a separate window with security manager

+echo   stop              Stop Catalina

+echo   version           What version of tomcat are you running?

+goto end

+

+:doDebug

+shift

+set _EXECJAVA=%_RUNJDB%

+set DEBUG_OPTS=-sourcepath "%CATALINA_HOME%\..\..\jakarta-tomcat-catalina\catalina\src\share"

+if not ""%1"" == ""-security"" goto execCmd

+shift

+echo Using Security Manager

+set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy

+goto execCmd

+

+:doRun

+shift

+if not ""%1"" == ""-security"" goto execCmd

+shift

+echo Using Security Manager

+set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy

+goto execCmd

+

+:doStart

+shift

+if not "%OS%" == "Windows_NT" goto noTitle

+set _EXECJAVA=start "Tomcat" %_RUNJAVA%

+goto gotTitle

+:noTitle

+set _EXECJAVA=start %_RUNJAVA%

+:gotTitle

+if not ""%1"" == ""-security"" goto execCmd

+shift

+echo Using Security Manager

+set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy

+goto execCmd

+

+:doStop

+shift

+set ACTION=stop

+set CATALINA_OPTS=

+goto execCmd

+

+:doVersion

+%_EXECJAVA% -classpath "%CATALINA_HOME%\server\lib\catalina.jar" org.apache.catalina.util.ServerInfo

+goto end

+

+

+:execCmd

+rem Get remaining unshifted command line arguments and save them in the

+set CMD_LINE_ARGS=

+:setArgs

+if ""%1""=="""" goto doneSetArgs

+set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1

+shift

+goto setArgs

+:doneSetArgs

+

+rem Execute Java with the applicable properties

+if not "%JPDA%" == "" goto doJpda

+if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity

+%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

+goto end

+:doSecurity

+%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

+goto end

+:doJpda

+if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda

+%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

+goto end

+:doSecurityJpda

+%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

+goto end

+

+:end

diff --git a/framework/appserver/templates/tomcat55/catalina.properties b/framework/appserver/templates/tomcat55/catalina.properties
new file mode 100644
index 0000000..59a1d46
--- /dev/null
+++ b/framework/appserver/templates/tomcat55/catalina.properties
@@ -0,0 +1,84 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+
+#
+# List of comma-separated packages that start with or equal this string
+# will cause a security exception to be thrown when
+# passed to checkPackageAccess unless the
+# corresponding RuntimePermission ("accessClassInPackage."+package) has
+# been granted.
+package.access=sun.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat.,org.apache.jasper.,sun.beans.
+#
+# List of comma-separated packages that start with or equal this string
+# will cause a security exception to be thrown when
+# passed to checkPackageDefinition unless the
+# corresponding RuntimePermission ("defineClassInPackage."+package) has
+# been granted.
+#
+# by default, no packages are restricted for definition, and none of
+# the class loaders supplied with the JDK call checkPackageDefinition.
+#
+package.definition=sun.,java.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat.,org.apache.jasper.
+
+#
+#
+# List of comma-separated paths defining the contents of the "common"
+# classloader. Prefixes should be used to define what is the repository type.
+# Path may be relative to the CATALINA_HOME or CATALINA_BASE path or absolute.
+# If left as blank,the JVM system loader will be used as Catalina's "common"
+# loader.
+# Examples:
+#     "foo": Add this folder as a class repository
+#     "foo/*.jar": Add all the JARs of the specified folder as class
+#                  repositories
+#     "foo/bar.jar": Add bar.jar as a class repository
+common.loader=${r"${catalina.home}"}/common/classes,${r"${catalina.home}"}/common/i18n/*.jar,${r"${catalina.home}"}/common/endorsed/*.jar,${r"${catalina.home}"}/common/lib/*.jar
+
+#
+# List of comma-separated paths defining the contents of the "server"
+# classloader. Prefixes should be used to define what is the repository type.
+# Path may be relative to the CATALINA_HOME or CATALINA_BASE path or absolute.
+# If left as blank, the "common" loader will be used as Catalina's "server"
+# loader.
+# Examples:
+#     "foo": Add this folder as a class repository
+#     "foo/*.jar": Add all the JARs of the specified folder as class
+#                  repositories
+#     "foo/bar.jar": Add bar.jar as a class repository
+server.loader=${r"${catalina.home}"}/server/classes,${r"${catalina.home}"}/server/lib/*.jar
+
+#
+# List of comma-separated paths defining the contents of the "shared"
+# classloader. Prefixes should be used to define what is the repository type.
+# Path may be relative to the CATALINA_BASE path or absolute. If left as blank,
+# the "common" loader will be used as Catalina's "shared" loader.
+# Examples:
+#     "foo": Add this folder as a class repository
+#     "foo/*.jar": Add all the JARs of the specified folder as class
+#                  repositories
+#     "foo/bar.jar": Add bar.jar as a class repository
+# Please note that for individual jar files, e.g. bar.jar, you need the URL form
+# starting with file:.
+ofbiz.home=${ofbizHome}
+shared.loader=${r"${catalina.base}"}/shared/classes,${r"${catalina.base}"}/shared/lib/*.jar,\
+file://${r"${ofbiz.home}"}/ofbiz.jar,\
+<#list classpathDirs as dir>${dir},\<#if dir_has_next>${"\n"}</#if></#list>
+<#list classpathJars as jar>file://${jar}<#if jar_has_next>,\</#if>${"\n"}</#list>
+#
+# String cache configuration.
+tomcat.util.buf.StringCache.byte.enabled=true
+#tomcat.util.buf.StringCache.char.enabled=true
+#tomcat.util.buf.StringCache.trainThreshold=500000
+#tomcat.util.buf.StringCache.cacheSize=5000
diff --git a/framework/appserver/templates/tomcat55/catalina.sh b/framework/appserver/templates/tomcat55/catalina.sh
new file mode 100755
index 0000000..839a2ee
--- /dev/null
+++ b/framework/appserver/templates/tomcat55/catalina.sh
@@ -0,0 +1,360 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+
+# -----------------------------------------------------------------------------
+# Start/Stop Script for the CATALINA Server
+#
+# Environment Variable Prequisites
+#
+#   CATALINA_HOME   May point at your Catalina "build" directory.
+#
+#   CATALINA_BASE   (Optional) Base directory for resolving dynamic portions
+#                   of a Catalina installation.  If not present, resolves to
+#                   the same directory that CATALINA_HOME points to.
+#
+#   CATALINA_OPTS   (Optional) Java runtime options used when the "start",
+#                   or "run" command is executed.
+#
+#   CATALINA_TMPDIR (Optional) Directory path location of temporary directory
+#                   the JVM should use (java.io.tmpdir).  Defaults to
+#                   $CATALINA_BASE/temp.
+#
+#   JAVA_HOME       Must point at your Java Development Kit installation.
+#                   Required to run the with the "debug" or "javac" argument.
+#
+#   JRE_HOME        Must point at your Java Development Kit installation.
+#                   Defaults to JAVA_HOME if empty.
+#
+#   JAVA_OPTS       (Optional) Java runtime options used when the "start",
+#                   "stop", or "run" command is executed.
+
+# BEGIN OfBiz settings
+JAVA_OPTS="$JAVA_OPTS -Dofbiz.home=${ofbizHome}"
+# END OfBiz settings
+
+#   JPDA_TRANSPORT  (Optional) JPDA transport used when the "jpda start"
+#                   command is executed. The default is "dt_socket".
+#
+#   JPDA_ADDRESS    (Optional) Java runtime options used when the "jpda start"
+#                   command is executed. The default is 8000.
+#
+#   JPDA_SUSPEND    (Optional) Java runtime options used when the "jpda start"
+#                   command is executed. Specifies whether JVM should suspend
+#                   execution immediately after startup. Default is "n".
+#
+#   JPDA_OPTS       (Optional) Java runtime options used when the "jpda start"
+#                   command is executed. If used, JPDA_TRANSPORT, JPDA_ADDRESS,
+#                   and JPDA_SUSPEND are ignored. Thus, all required jpda
+#                   options MUST be specified. The default is:
+#
+#                   -Xdebug -Xrunjdwp:transport=$JPDA_TRANSPORT,
+#                       address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND
+#
+#   JSSE_HOME       (Optional) May point at your Java Secure Sockets Extension
+#                   (JSSE) installation, whose JAR files will be added to the
+#                   system class path used to start Tomcat.
+#
+#   CATALINA_PID    (Optional) Path of the file which should contains the pid
+#                   of catalina startup java process, when start (fork) is used
+#
+# $Id: catalina.sh 609438 2008-01-06 22:14:28Z markt $
+# -----------------------------------------------------------------------------
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false
+os400=false
+darwin=false
+case "`uname`" in
+CYGWIN*) cygwin=true;;
+OS400*) os400=true;;
+Darwin*) darwin=true;;
+esac
+
+# resolve links - $0 may be a softlink
+PRG="$0"
+
+while [ -h "$PRG" ]; do
+  ls=`ls -ld "$PRG"`
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    PRG="$link"
+  else
+    PRG=`dirname "$PRG"`/"$link"
+  fi
+done
+
+# Get standard environment variables
+PRGDIR=`dirname "$PRG"`
+
+# Only set CATALINA_HOME if not already set
+[ -z "$CATALINA_HOME" ] && CATALINA_HOME=`cd "$PRGDIR/.." ; pwd`
+
+if [ -r "$CATALINA_BASE"/bin/setenv.sh ]; then
+  . "$CATALINA_BASE"/bin/setenv.sh
+elif [ -r "$CATALINA_HOME"/bin/setenv.sh ]; then
+  . "$CATALINA_HOME"/bin/setenv.sh
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin; then
+  [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$JRE_HOME" ] && JRE_HOME=`cygpath --unix "$JRE_HOME"`
+  [ -n "$CATALINA_HOME" ] && CATALINA_HOME=`cygpath --unix "$CATALINA_HOME"`
+  [ -n "$CATALINA_BASE" ] && CATALINA_BASE=`cygpath --unix "$CATALINA_BASE"`
+  [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+  [ -n "$JSSE_HOME" ] && JSSE_HOME=`cygpath --absolute --unix "$JSSE_HOME"`
+fi
+
+# For OS400
+if $os400; then
+  # Set job priority to standard for interactive (interactive - 6) by using
+  # the interactive priority - 6, the helper threads that respond to requests
+  # will be running at the same priority as interactive jobs.
+  COMMAND='chgjob job('$JOBNAME') runpty(6)'
+  system $COMMAND
+
+  # Enable multi threading
+  export QIBM_MULTI_THREADED=Y
+fi
+
+# Get standard Java environment variables
+if $os400; then
+  # -r will Only work on the os400 if the files are:
+  # 1. owned by the user
+  # 2. owned by the PRIMARY group of the user
+  # this will not work if the user belongs in secondary groups
+  BASEDIR="$CATALINA_HOME"
+  . "$CATALINA_HOME"/bin/setclasspath.sh
+else
+  if [ -r "$CATALINA_HOME"/bin/setclasspath.sh ]; then
+    BASEDIR="$CATALINA_HOME"
+    . "$CATALINA_HOME"/bin/setclasspath.sh
+  else
+    echo "Cannot find $CATALINA_HOME/bin/setclasspath.sh"
+    echo "This file is needed to run this program"
+    exit 1
+  fi
+fi
+
+# Add on extra jar files to CLASSPATH
+if [ -n "$JSSE_HOME" ]; then
+  CLASSPATH="$CLASSPATH":"$JSSE_HOME"/lib/jcert.jar:"$JSSE_HOME"/lib/jnet.jar:"$JSSE_HOME"/lib/jsse.jar
+fi
+CLASSPATH="$CLASSPATH":"$CATALINA_HOME"/bin/bootstrap.jar:"$CATALINA_HOME"/bin/commons-logging-api.jar
+
+if [ -z "$CATALINA_BASE" ] ; then
+  CATALINA_BASE="$CATALINA_HOME"
+fi
+
+if [ -z "$CATALINA_TMPDIR" ] ; then
+  # Define the java.io.tmpdir to use for Catalina
+  CATALINA_TMPDIR="$CATALINA_BASE"/temp
+fi
+
+# Bugzilla 37848: When no TTY is available, don't output to console
+have_tty=0
+if [ "`tty`" != "not a tty" ]; then
+    have_tty=1
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  JAVA_HOME=`cygpath --absolute --windows "$JAVA_HOME"`
+  JRE_HOME=`cygpath --absolute --windows "$JRE_HOME"`
+  CATALINA_HOME=`cygpath --absolute --windows "$CATALINA_HOME"`
+  CATALINA_BASE=`cygpath --absolute --windows "$CATALINA_BASE"`
+  CATALINA_TMPDIR=`cygpath --absolute --windows "$CATALINA_TMPDIR"`
+  CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+  [ -n "$JSSE_HOME" ] && JSSE_HOME=`cygpath --absolute --windows "$JSSE_HOME"`
+  JAVA_ENDORSED_DIRS=`cygpath --path --windows "$JAVA_ENDORSED_DIRS"`
+fi
+
+# Set juli LogManager if it is present
+if [ -r "$CATALINA_HOME"/bin/tomcat-juli.jar ]; then
+  JAVA_OPTS="$JAVA_OPTS "-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" "-Djava.util.logging.config.file="$CATALINA_BASE/conf/logging.properties"
+fi
+
+# ----- Execute The Requested Command -----------------------------------------
+
+# Bugzilla 37848: only output this if we have a TTY
+if [ $have_tty -eq 1 ]; then
+  echo "Using CATALINA_BASE:   $CATALINA_BASE"
+  echo "Using CATALINA_HOME:   $CATALINA_HOME"
+  echo "Using CATALINA_TMPDIR: $CATALINA_TMPDIR"
+  if [ "$1" = "debug" -o "$1" = "javac" ] ; then
+    echo "Using JAVA_HOME:       $JAVA_HOME"
+  else
+    echo "Using JRE_HOME:       $JRE_HOME"
+  fi
+fi
+
+if [ "$1" = "jpda" ] ; then
+  if [ -z "$JPDA_TRANSPORT" ]; then
+    JPDA_TRANSPORT="dt_socket"
+  fi
+  if [ -z "$JPDA_ADDRESS" ]; then
+    JPDA_ADDRESS="8000"
+  fi
+  if [ -z "$JPDA_SUSPEND" ]; then
+    JPDA_SUSPEND="n"
+  fi
+  if [ -z "$JPDA_OPTS" ]; then
+    JPDA_OPTS="-Xdebug -Xrunjdwp:transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND"
+  fi
+  CATALINA_OPTS="$CATALINA_OPTS $JPDA_OPTS"
+  shift
+fi
+
+if [ "$1" = "debug" ] ; then
+  if $os400; then
+    echo "Debug command not available on OS400"
+    exit 1
+  else
+    shift
+    if [ "$1" = "-security" ] ; then
+      echo "Using Security Manager"
+      shift
+      exec "$_RUNJDB" $JAVA_OPTS $CATALINA_OPTS \
+        -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
+        -sourcepath "$CATALINA_HOME"/../../jakarta-tomcat-catalina/catalina/src/share \
+        -Djava.security.manager \
+        -Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
+        -Dcatalina.base="$CATALINA_BASE" \
+        -Dcatalina.home="$CATALINA_HOME" \
+        -Djava.io.tmpdir="$CATALINA_TMPDIR" \
+        org.apache.catalina.startup.Bootstrap "$@" start
+    else
+      exec "$_RUNJDB" $JAVA_OPTS $CATALINA_OPTS \
+        -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
+        -sourcepath "$CATALINA_HOME"/../../jakarta-tomcat-catalina/catalina/src/share \
+        -Dcatalina.base="$CATALINA_BASE" \
+        -Dcatalina.home="$CATALINA_HOME" \
+        -Djava.io.tmpdir="$CATALINA_TMPDIR" \
+        org.apache.catalina.startup.Bootstrap "$@" start
+    fi
+  fi
+
+elif [ "$1" = "run" ]; then
+
+  shift
+  if [ "$1" = "-security" ] ; then
+    echo "Using Security Manager"
+    shift
+    exec "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
+      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
+      -Djava.security.manager \
+      -Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
+      -Dcatalina.base="$CATALINA_BASE" \
+      -Dcatalina.home="$CATALINA_HOME" \
+      -Djava.io.tmpdir="$CATALINA_TMPDIR" \
+      org.apache.catalina.startup.Bootstrap "$@" start
+  else
+    exec "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
+      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
+      -Dcatalina.base="$CATALINA_BASE" \
+      -Dcatalina.home="$CATALINA_HOME" \
+      -Djava.io.tmpdir="$CATALINA_TMPDIR" \
+      org.apache.catalina.startup.Bootstrap "$@" start
+  fi
+
+elif [ "$1" = "start" ] ; then
+
+  shift
+  touch "$CATALINA_BASE"/logs/catalina.out
+  if [ "$1" = "-security" ] ; then
+    echo "Using Security Manager"
+    shift
+    "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
+      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
+      -Djava.security.manager \
+      -Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
+      -Dcatalina.base="$CATALINA_BASE" \
+      -Dcatalina.home="$CATALINA_HOME" \
+      -Djava.io.tmpdir="$CATALINA_TMPDIR" \
+      org.apache.catalina.startup.Bootstrap "$@" start \
+      >> "$CATALINA_BASE"/logs/catalina.out 2>&1 &
+
+      if [ ! -z "$CATALINA_PID" ]; then
+        echo $! > $CATALINA_PID
+      fi
+  else
+    "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
+      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
+      -Dcatalina.base="$CATALINA_BASE" \
+      -Dcatalina.home="$CATALINA_HOME" \
+      -Djava.io.tmpdir="$CATALINA_TMPDIR" \
+      org.apache.catalina.startup.Bootstrap "$@" start \
+      >> "$CATALINA_BASE"/logs/catalina.out 2>&1 &
+
+      if [ ! -z "$CATALINA_PID" ]; then
+        echo $! > $CATALINA_PID
+      fi
+  fi
+
+elif [ "$1" = "stop" ] ; then
+
+  shift
+  FORCE=0
+  if [ "$1" = "-force" ]; then
+    shift
+    FORCE=1
+  fi
+
+  "$_RUNJAVA" $JAVA_OPTS \
+    -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
+    -Dcatalina.base="$CATALINA_BASE" \
+    -Dcatalina.home="$CATALINA_HOME" \
+    -Djava.io.tmpdir="$CATALINA_TMPDIR" \
+    org.apache.catalina.startup.Bootstrap "$@" stop
+
+  if [ $FORCE -eq 1 ]; then
+    if [ ! -z "$CATALINA_PID" ]; then
+       echo "Killing: `cat $CATALINA_PID`"
+       kill -9 `cat $CATALINA_PID`
+    else
+       echo "Kill failed: \$CATALINA_PID not set"
+    fi
+  fi
+
+elif [ "$1" = "version" ] ; then
+
+    "$_RUNJAVA"   \
+      -classpath "$CATALINA_HOME/server/lib/catalina.jar" \
+      org.apache.catalina.util.ServerInfo
+
+else
+
+  echo "Usage: catalina.sh ( commands ... )"
+  echo "commands:"
+  if $os400; then
+    echo "  debug             Start Catalina in a debugger (not available on OS400)"
+    echo "  debug -security   Debug Catalina with a security manager (not available on OS400)"
+  else
+    echo "  debug             Start Catalina in a debugger"
+    echo "  debug -security   Debug Catalina with a security manager"
+  fi
+  echo "  jpda start        Start Catalina under JPDA debugger"
+  echo "  run               Start Catalina in the current window"
+  echo "  run -security     Start in the current window with security manager"
+  echo "  start             Start Catalina in a separate window"
+  echo "  start -security   Start in a separate window with security manager"
+  echo "  stop              Stop Catalina"
+  echo "  stop -force       Stop Catalina (followed by kill -KILL)"
+  echo "  version           What version of tomcat are you running?"
+  exit 1
+
+fi
diff --git a/framework/appserver/templates/tomcat55/server.xml b/framework/appserver/templates/tomcat55/server.xml
new file mode 100644
index 0000000..7d58627
--- /dev/null
+++ b/framework/appserver/templates/tomcat55/server.xml
@@ -0,0 +1,406 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You 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.
+-->
+<!-- Example Server Configuration File -->
+<!-- Note that component elements are nested corresponding to their
+     parent-child relationships with each other -->
+
+<!-- A "Server" is a singleton element that represents the entire JVM,
+     which may contain one or more "Service" instances.  The Server
+     listens for a shutdown command on the indicated port.
+
+     Note:  A "Server" is not itself a "Container", so you may not
+     define subcomponents such as "Valves" or "Loggers" at this level.
+ -->
+
+<Server port="8005" shutdown="SHUTDOWN">
+
+  <!-- Comment these entries out to disable JMX MBeans support used for the
+       administration web application -->
+  <Listener className="org.apache.catalina.core.AprLifecycleListener"/>
+  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"/>
+  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
+  <Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/>
+
+  <!-- Global JNDI resources -->
+  <GlobalNamingResources>
+
+    <!-- Test entry for demonstration purposes -->
+    <Environment name="simpleValue" type="java.lang.Integer" value="30"/>
+
+    <!-- Editable user database that can also be used by
+         UserDatabaseRealm to authenticate users -->
+    <Resource name="UserDatabase" auth="Container"
+              type="org.apache.catalina.UserDatabase"
+       description="User database that can be updated and saved"
+           factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
+          pathname="conf/tomcat-users.xml"/>
+
+  </GlobalNamingResources>
+
+  <!-- A "Service" is a collection of one or more "Connectors" that share
+       a single "Container" (and therefore the web applications visible
+       within that Container).  Normally, that Container is an "Engine",
+       but this is not required.
+
+       Note:  A "Service" is not itself a "Container", so you may not
+       define subcomponents such as "Valves" or "Loggers" at this level.
+   -->
+
+  <!-- Define the Tomcat Stand-Alone Service -->
+  <Service name="Catalina">
+
+    <!-- A "Connector" represents an endpoint by which requests are received
+         and responses are returned.  Each Connector passes requests on to the
+         associated "Container" (normally an Engine) for processing.
+
+         By default, a non-SSL HTTP/1.1 Connector is established on port 8080.
+         You can also enable an SSL HTTP/1.1 Connector on port 8443 by
+         following the instructions below and uncommenting the second Connector
+         entry.  SSL support requires the following steps (see the SSL Config
+         HOWTO in the Tomcat 5 documentation bundle for more detailed
+         instructions):
+         * If your JDK version 1.3 or prior, download and install JSSE 1.0.2 or
+           later, and put the JAR files into "$JAVA_HOME/jre/lib/ext".
+         * Execute:
+             %JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA (Windows)
+             $JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA  (Unix)
+           with a password value of "changeit" for both the certificate and
+           the keystore itself.
+
+         By default, DNS lookups are enabled when a web application calls
+         request.getRemoteHost().  This can have an adverse impact on
+         performance, so you can disable it by setting the
+         "enableLookups" attribute to "false".  When DNS lookups are disabled,
+         request.getRemoteHost() will return the String version of the
+         IP address of the remote client.
+    -->
+
+    <!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
+    <Connector port="8080" maxHttpHeaderSize="8192"
+               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
+               enableLookups="false" redirectPort="8443" acceptCount="100"
+               connectionTimeout="20000" disableUploadTimeout="true"/>
+    <!-- Note : To disable connection timeouts, set connectionTimeout value
+     to 0 -->
+
+    <!-- Note : To use gzip compression you could set the following properties :
+
+               compression="on"
+               compressionMinSize="2048"
+               noCompressionUserAgents="gozilla, traviata"
+               compressableMimeType="text/html,text/xml"
+    -->
+
+    <!-- Define a SSL HTTP/1.1 Connector on port 8443 -->
+    <Connector port="8443" maxHttpHeaderSize="8192"
+               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
+               enableLookups="false" disableUploadTimeout="true"
+               acceptCount="100" scheme="https" secure="true"
+               clientAuth="false" sslProtocol="TLS"
+               keystoreFile="${ofbizHome}/framework/base/config/ofbizssl.jks"
+               keystorePass="changeit"/>
+
+    <!-- Define an AJP 1.3 Connector on port 8009 -->
+    <Connector port="8009"
+               enableLookups="false" redirectPort="8443" protocol="AJP/1.3"/>
+
+    <!-- Define a Proxied HTTP/1.1 Connector on port 8082 -->
+    <!-- See proxy documentation for more information about using this. -->
+    <!--
+    <Connector port="8082"
+               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
+               enableLookups="false" acceptCount="100" connectionTimeout="20000"
+               proxyPort="80" disableUploadTimeout="true"/>
+    -->
+
+    <!-- An Engine represents the entry point (within Catalina) that processes
+         every request.  The Engine implementation for Tomcat stand alone
+         analyzes the HTTP headers included with the request, and passes them
+         on to the appropriate Host (virtual host). -->
+
+    <!-- You should set jvmRoute to support load-balancing via AJP ie :
+    <Engine name="Standalone" defaultHost="localhost" jvmRoute="jvm1">
+    -->
+
+    <!-- Define the top level container in our container hierarchy -->
+    <Engine name="Catalina" defaultHost="localhost">
+
+      <!-- The request dumper valve dumps useful debugging information about
+           the request headers and cookies that were received, and the response
+           headers and cookies that were sent, for all requests received by
+           this instance of Tomcat.  If you care only about requests to a
+           particular virtual host, or a particular application, nest this
+           element inside the corresponding <Host> or <Context> entry instead.
+
+           For a similar mechanism that is portable to all Servlet 2.4
+           containers, check out the "RequestDumperFilter" Filter in the
+           example application (the source for this filter may be found in
+           "$CATALINA_HOME/webapps/examples/WEB-INF/classes/filters").
+
+           Note that this Valve uses the platform's default character encoding.
+           This may cause problems for developers in another encoding, e.g.
+           UTF-8.  Use the RequestDumperFilter instead.
+
+           Also note that enabling this Valve will write a ton of stuff to your
+           logs.  They are likely to grow quite large.  This extensive log writing
+           will definitely slow down your server.
+
+           Request dumping is disabled by default.  Uncomment the following
+           element to enable it. -->
+      <!--
+      <Valve className="org.apache.catalina.valves.RequestDumperValve"/>
+      -->
+
+      <!-- Because this Realm is here, an instance will be shared globally -->
+
+      <!-- This Realm uses the UserDatabase configured in the global JNDI
+           resources under the key "UserDatabase".  Any edits
+           that are performed against this UserDatabase are immediately
+           available for use by the Realm.  -->
+      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
+             resourceName="UserDatabase"/>
+
+      <!-- Comment out the old realm but leave here for now in case we
+           need to go back quickly -->
+      <!--
+      <Realm className="org.apache.catalina.realm.MemoryRealm"/>
+      -->
+
+      <!-- Replace the above Realm with one of the following to get a Realm
+           stored in a database and accessed via JDBC -->
+
+      <!--
+      <Realm  className="org.apache.catalina.realm.JDBCRealm"
+             driverName="org.gjt.mm.mysql.Driver"
+          connectionURL="jdbc:mysql://localhost/authority"
+         connectionName="test" connectionPassword="test"
+              userTable="users" userNameCol="user_name" userCredCol="user_pass"
+          userRoleTable="user_roles" roleNameCol="role_name"/>
+      -->
+
+      <!--
+      <Realm  className="org.apache.catalina.realm.JDBCRealm"
+             driverName="oracle.jdbc.driver.OracleDriver"
+          connectionURL="jdbc:oracle:thin:@ntserver:1521:ORCL"
+         connectionName="scott" connectionPassword="tiger"
+              userTable="users" userNameCol="user_name" userCredCol="user_pass"
+          userRoleTable="user_roles" roleNameCol="role_name"/>
+      -->
+
+      <!--
+      <Realm  className="org.apache.catalina.realm.JDBCRealm"
+             driverName="sun.jdbc.odbc.JdbcOdbcDriver"
+          connectionURL="jdbc:odbc:CATALINA"
+              userTable="users" userNameCol="user_name" userCredCol="user_pass"
+          userRoleTable="user_roles" roleNameCol="role_name"/>
+      -->
+
+      <!-- Define the default virtual host
+           Note: XML Schema validation will not work with Xerces 2.2.
+       -->
+      <Host name="localhost" appBase="webapps"
+       unpackWARs="true" autoDeploy="true"
+       xmlValidation="false" xmlNamespaceAware="false">
+
+        <!-- Defines a cluster for this node,
+             By defining this element, means that every manager will be changed.
+             So when running a cluster, only make sure that you have webapps in there
+             that need to be clustered and remove the other ones.
+             A cluster has the following parameters:
+
+             className = the fully qualified name of the cluster class
+
+             clusterName = a descriptive name for your cluster, can be anything
+
+             mcastAddr = the multicast address, has to be the same for all the nodes
+
+             mcastPort = the multicast port, has to be the same for all the nodes
+
+             mcastBindAddress = bind the multicast socket to a specific address
+
+             mcastTTL = the multicast TTL if you want to limit your broadcast
+
+             mcastSoTimeout = the multicast readtimeout
+
+             mcastFrequency = the number of milliseconds in between sending a "I'm alive" heartbeat
+
+             mcastDropTime = the number a milliseconds before a node is considered "dead" if no heartbeat is received
+
+             tcpThreadCount = the number of threads to handle incoming replication requests, optimal would be the same amount of threads as nodes
+
+             tcpListenAddress = the listen address (bind address) for TCP cluster request on this host,
+                                in case of multiple ethernet cards.
+                                auto means that address becomes
+                                InetAddress.getLocalHost().getHostAddress()
+
+             tcpListenPort = the tcp listen port
+
+             tcpSelectorTimeout = the timeout (ms) for the Selector.select() method in case the OS
+                                  has a wakup bug in java.nio. Set to 0 for no timeout
+
+             printToScreen = true means that managers will also print to std.out
+
+             expireSessionsOnShutdown = true means that
+
+             useDirtyFlag = true means that we only replicate a session after setAttribute,removeAttribute has been called.
+                            false means to replicate the session after each request.
+                            false means that replication would work for the following piece of code: (only for SimpleTcpReplicationManager)
+                            <%
+                            HashMap map = (HashMap)session.getAttribute("map");
+                            map.put("key","value");
+                            %>
+             replicationMode = can be either 'pooled', 'synchronous' or 'asynchronous'.
+                               * Pooled means that the replication happens using several sockets in a synchronous way. Ie, the data gets replicated, then the request return. This is the same as the 'synchronous' setting except it uses a pool of sockets, hence it is multithreaded. This is the fastest and safest configuration. To use this, also increase the nr of tcp threads that you have dealing with replication.
+                               * Synchronous means that the thread that executes the request, is also the
+                               thread the replicates the data to the other nodes, and will not return until all
+                               nodes have received the information.
+                               * Asynchronous means that there is a specific 'sender' thread for each cluster node,
+                               so the request thread will queue the replication request into a "smart" queue,
+                               and then return to the client.
+                               The "smart" queue is a queue where when a session is added to the queue, and the same session
+                               already exists in the queue from a previous request, that session will be replaced
+                               in the queue instead of replicating two requests. This almost never happens, unless there is a
+                               large network delay.
+        -->
+        <!--
+            When configuring for clustering, you also add in a valve to catch all the requests
+            coming in, at the end of the request, the session may or may not be replicated.
+            A session is replicated if and only if all the conditions are met:
+            1. useDirtyFlag is true or setAttribute or removeAttribute has been called AND
+            2. a session exists (has been created)
+            3. the request is not trapped by the "filter" attribute
+
+            The filter attribute is to filter out requests that could not modify the session,
+            hence we don't replicate the session after the end of this request.
+            The filter is negative, ie, anything you put in the filter, you mean to filter out,
+            ie, no replication will be done on requests that match one of the filters.
+            The filter attribute is delimited by ;, so you can't escape out ; even if you wanted to.
+
+            filter=".*\.gif;.*\.js;" means that we will not replicate the session after requests with the URI
+            ending with .gif and .js are intercepted.
+
+            The deployer element can be used to deploy apps cluster wide.
+            Currently the deployment only deploys/undeploys to working members in the cluster
+            so no WARs are copied upons startup of a broken node.
+            The deployer watches a directory (watchDir) for WAR files when watchEnabled="true"
+            When a new war file is added the war gets deployed to the local instance,
+            and then deployed to the other instances in the cluster.
+            When a war file is deleted from the watchDir the war is undeployed locally
+            and cluster wide
+        -->
+
+        <!--
+        <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
+                 managerClassName="org.apache.catalina.cluster.session.DeltaManager"
+                 expireSessionsOnShutdown="false"
+                 useDirtyFlag="true"
+                 notifyListenersOnReplication="true">
+
+            <Membership
+                className="org.apache.catalina.cluster.mcast.McastService"
+                mcastAddr="228.0.0.4"
+                mcastPort="45564"
+                mcastFrequency="500"
+                mcastDropTime="3000"/>
+
+            <Receiver
+                className="org.apache.catalina.cluster.tcp.ReplicationListener"
+                tcpListenAddress="auto"
+                tcpListenPort="4001"
+                tcpSelectorTimeout="100"
+                tcpThreadCount="6"/>
+
+            <Sender
+                className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
+                replicationMode="pooled"
+                ackTimeout="15000"
+                waitForAck="true"/>
+
+            <Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
+                   filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
+
+            <Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
+                      tempDir="/tmp/war-temp/"
+                      deployDir="/tmp/war-deploy/"
+                      watchDir="/tmp/war-listen/"
+                      watchEnabled="false"/>
+
+            <ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/>
+        </Cluster>
+        -->
+
+
+
+        <!-- Normally, users must authenticate themselves to each web app
+             individually.  Uncomment the following entry if you would like
+             a user to be authenticated the first time they encounter a
+             resource protected by a security constraint, and then have that
+             user identity maintained across *all* web applications contained
+             in this virtual host. -->
+        <!--
+        <Valve className="org.apache.catalina.authenticator.SingleSignOn"/>
+        -->
+
+        <!-- Access log processes all requests for this virtual host.  By
+             default, log files are created in the "logs" directory relative to
+             $CATALINA_HOME.  If you wish, you can specify a different
+             directory with the "directory" attribute.  Specify either a relative
+             (to $CATALINA_HOME) or absolute path to the desired directory.
+        -->
+        <!--
+        <Valve className="org.apache.catalina.valves.AccessLogValve"
+                 directory="logs"  prefix="localhost_access_log." suffix=".txt"
+                 pattern="common" resolveHosts="false"/>
+        -->
+
+        <!-- Access log processes all requests for this virtual host.  By
+             default, log files are created in the "logs" directory relative to
+             $CATALINA_HOME.  If you wish, you can specify a different
+             directory with the "directory" attribute.  Specify either a relative
+             (to $CATALINA_HOME) or absolute path to the desired directory.
+             This access log implementation is optimized for maximum performance,
+             but is hardcoded to support only the "common" and "combined" patterns.
+        -->
+        <!--
+        <Valve className="org.apache.catalina.valves.FastCommonAccessLogValve"
+                 directory="logs"  prefix="localhost_access_log." suffix=".txt"
+                 pattern="common" resolveHosts="false"/>
+        -->
+
+    <!-- BEGIN OFBiz settings -->
+<#list webApps as webapp>
+    <#-- Remove last directory segment from path -->
+    <#if webapp.getLocation().lastIndexOf("/") != -1>
+        <#assign lastSlash = webapp.getLocation().lastIndexOf("/")>
+    </#if>
+    <#if (webapp.getLocation().lastIndexOf("\\") > lastSlash)>
+        <#assign lastSlash = webapp.getLocation().lastIndexOf("\\")>
+    </#if>
+<Context path="${webapp.getContextRoot()}" docBase="${webapp.getLocation().substring(0,lastSlash)}${webapp.getContextRoot()}"
+         privileged="false" antiResourceLocking="true" antiJARLocking="true">
+</Context>
+</#list>
+    <!-- END OFBiz settings -->
+
+      </Host>
+
+    </Engine>
+
+  </Service>
+
+</Server>
diff --git a/framework/appserver/templates/tomcat6/catalina.bat b/framework/appserver/templates/tomcat6/catalina.bat
new file mode 100644
index 0000000..cbcae3b
--- /dev/null
+++ b/framework/appserver/templates/tomcat6/catalina.bat
@@ -0,0 +1,249 @@
+@echo off

+rem Licensed to the Apache Software Foundation (ASF) under one or more

+rem contributor license agreements.  See the NOTICE file distributed with

+rem this work for additional information regarding copyright ownership.

+rem The ASF licenses this file to You under the Apache License, Version 2.0

+rem (the "License"); you may not use this file except in compliance with

+rem the License.  You may obtain a copy of the License at

+rem

+rem     http://www.apache.org/licenses/LICENSE-2.0

+rem

+rem Unless required by applicable law or agreed to in writing, software

+rem distributed under the License is distributed on an "AS IS" BASIS,

+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+rem See the License for the specific language governing permissions and

+rem limitations under the License.

+

+if "%OS%" == "Windows_NT" setlocal

+rem ---------------------------------------------------------------------------

+rem Start/Stop Script for the CATALINA Server

+rem

+rem Environment Variable Prequisites

+rem

+rem   CATALINA_HOME   May point at your Catalina "build" directory.

+rem

+rem   CATALINA_BASE   (Optional) Base directory for resolving dynamic portions

+rem                   of a Catalina installation.  If not present, resolves to

+rem                   the same directory that CATALINA_HOME points to.

+rem

+rem   CATALINA_OPTS   (Optional) Java runtime options used when the "start",

+rem                   or "run" command is executed.

+rem

+rem   CATALINA_TMPDIR (Optional) Directory path location of temporary directory

+rem                   the JVM should use (java.io.tmpdir).  Defaults to

+rem                   %CATALINA_BASE%\temp.

+rem

+rem   JAVA_HOME       Must point at your Java Development Kit installation.

+rem                   Required to run the with the "debug" argument.

+rem

+rem   JRE_HOME        Must point at your Java Runtime installation.

+rem                   Defaults to JAVA_HOME if empty.

+rem

+rem   JAVA_OPTS       (Optional) Java runtime options used when the "start",

+rem                   "stop", or "run" command is executed.

+

+rem BEGIN OfBiz settings

+set JAVA_OPTS="%JAVA_OPTS% -Dofbiz.home=${ofbizHome}"

+rem END OfBiz settings

+

+rem   JSSE_HOME       (Optional) May point at your Java Secure Sockets Extension

+rem                   (JSSE) installation, whose JAR files will be added to the

+rem                   system class path used to start Tomcat.

+rem

+rem   JPDA_TRANSPORT  (Optional) JPDA transport used when the "jpda start"

+rem                   command is executed. The default is "dt_shmem".

+rem

+rem   JPDA_ADDRESS    (Optional) Java runtime options used when the "jpda start"

+rem                   command is executed. The default is "jdbconn".

+rem

+rem   JPDA_SUSPEND    (Optional) Java runtime options used when the "jpda start"

+rem                   command is executed. Specifies whether JVM should suspend

+rem                   execution immediately after startup. Default is "n".

+rem

+rem   JPDA_OPTS       (Optional) Java runtime options used when the "jpda start"

+rem                   command is executed. If used, JPDA_TRANSPORT, JPDA_ADDRESS,

+rem                   and JPDA_SUSPEND are ignored. Thus, all required jpda

+rem                   options MUST be specified. The default is:

+rem

+rem                   -Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,

+rem                       address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%

+rem

+rem $Id: catalina.bat 615987 2008-01-28 18:48:10Z rjung $

+rem ---------------------------------------------------------------------------

+

+rem Guess CATALINA_HOME if not defined

+set CURRENT_DIR=%cd%

+if not "%CATALINA_HOME%" == "" goto gotHome

+set CATALINA_HOME=%CURRENT_DIR%

+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome

+cd ..

+set CATALINA_HOME=%cd%

+cd %CURRENT_DIR%

+:gotHome

+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome

+echo The CATALINA_HOME environment variable is not defined correctly

+echo This environment variable is needed to run this program

+goto end

+:okHome

+

+rem Get standard environment variables

+if "%CATALINA_BASE%" == "" goto gotSetenvHome

+if exist "%CATALINA_BASE%\bin\setenv.bat" call "%CATALINA_BASE%\bin\setenv.bat"

+goto gotSetenvBase

+:gotSetenvHome

+if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat"

+:gotSetenvBase

+

+rem Get standard Java environment variables

+if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath

+echo Cannot find %CATALINA_HOME%\bin\setclasspath.bat

+echo This file is needed to run this program

+goto end

+:okSetclasspath

+set BASEDIR=%CATALINA_HOME%

+call "%CATALINA_HOME%\bin\setclasspath.bat" %1

+if errorlevel 1 goto end

+

+rem Add on extra jar files to CLASSPATH

+if "%JSSE_HOME%" == "" goto noJsse

+set CLASSPATH=%CLASSPATH%;%JSSE_HOME%\lib\jcert.jar;%JSSE_HOME%\lib\jnet.jar;%JSSE_HOME%\lib\jsse.jar

+:noJsse

+set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\bootstrap.jar

+

+if not "%CATALINA_BASE%" == "" goto gotBase

+set CATALINA_BASE=%CATALINA_HOME%

+:gotBase

+

+if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir

+set CATALINA_TMPDIR=%CATALINA_BASE%\temp

+:gotTmpdir

+

+if not exist "%CATALINA_BASE%\conf\logging.properties" goto noJuli

+set JAVA_OPTS=%JAVA_OPTS% -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"

+:noJuli

+

+rem ----- Execute The Requested Command ---------------------------------------

+

+echo Using CATALINA_BASE:   %CATALINA_BASE%

+echo Using CATALINA_HOME:   %CATALINA_HOME%

+echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR%

+if ""%1"" == ""debug"" goto use_jdk

+echo Using JRE_HOME:        %JRE_HOME%

+goto java_dir_displayed

+:use_jdk

+echo Using JAVA_HOME:       %JAVA_HOME%

+:java_dir_displayed

+

+set _EXECJAVA=%_RUNJAVA%

+set MAINCLASS=org.apache.catalina.startup.Bootstrap

+set ACTION=start

+set SECURITY_POLICY_FILE=

+set DEBUG_OPTS=

+set JPDA=

+

+if not ""%1"" == ""jpda"" goto noJpda

+set JPDA=jpda

+if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport

+set JPDA_TRANSPORT=dt_shmem

+:gotJpdaTransport

+if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress

+set JPDA_ADDRESS=jdbconn

+:gotJpdaAddress

+if not "%JPDA_SUSPEND%" == "" goto gotJpdaSuspend

+set JPDA_SUSPEND=n

+:gotJpdaSuspend

+if not "%JPDA_OPTS%" == "" goto gotJpdaOpts

+set JPDA_OPTS=-Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%

+:gotJpdaOpts

+shift

+:noJpda

+

+if ""%1"" == ""debug"" goto doDebug

+if ""%1"" == ""run"" goto doRun

+if ""%1"" == ""start"" goto doStart

+if ""%1"" == ""stop"" goto doStop

+if ""%1"" == ""version"" goto doVersion

+

+echo Usage:  catalina ( commands ... )

+echo commands:

+echo   debug             Start Catalina in a debugger

+echo   debug -security   Debug Catalina with a security manager

+echo   jpda start        Start Catalina under JPDA debugger

+echo   run               Start Catalina in the current window

+echo   run -security     Start in the current window with security manager

+echo   start             Start Catalina in a separate window

+echo   start -security   Start in a separate window with security manager

+echo   stop              Stop Catalina

+echo   version           What version of tomcat are you running?

+goto end

+

+:doDebug

+shift

+set _EXECJAVA=%_RUNJDB%

+set DEBUG_OPTS=-sourcepath "%CATALINA_HOME%\..\..\java"

+if not ""%1"" == ""-security"" goto execCmd

+shift

+echo Using Security Manager

+set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy

+goto execCmd

+

+:doRun

+shift

+if not ""%1"" == ""-security"" goto execCmd

+shift

+echo Using Security Manager

+set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy

+goto execCmd

+

+:doStart

+shift

+if not "%OS%" == "Windows_NT" goto noTitle

+set _EXECJAVA=start "Tomcat" %_RUNJAVA%

+goto gotTitle

+:noTitle

+set _EXECJAVA=start %_RUNJAVA%

+:gotTitle

+if not ""%1"" == ""-security"" goto execCmd

+shift

+echo Using Security Manager

+set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy

+goto execCmd

+

+:doStop

+shift

+set ACTION=stop

+set CATALINA_OPTS=

+goto execCmd

+

+:doVersion

+%_EXECJAVA% -classpath "%CATALINA_HOME%\lib\catalina.jar" org.apache.catalina.util.ServerInfo

+goto end

+

+

+:execCmd

+rem Get remaining unshifted command line arguments and save them in the

+set CMD_LINE_ARGS=

+:setArgs

+if ""%1""=="""" goto doneSetArgs

+set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1

+shift

+goto setArgs

+:doneSetArgs

+

+rem Execute Java with the applicable properties

+if not "%JPDA%" == "" goto doJpda

+if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity

+%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

+goto end

+:doSecurity

+%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

+goto end

+:doJpda

+if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda

+%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

+goto end

+:doSecurityJpda

+%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

+goto end

+

+:end

diff --git a/framework/appserver/templates/tomcat6/catalina.properties b/framework/appserver/templates/tomcat6/catalina.properties
new file mode 100644
index 0000000..e368d9a
--- /dev/null
+++ b/framework/appserver/templates/tomcat6/catalina.properties
@@ -0,0 +1,84 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+
+#
+# List of comma-separated packages that start with or equal this string
+# will cause a security exception to be thrown when
+# passed to checkPackageAccess unless the
+# corresponding RuntimePermission ("accessClassInPackage."+package) has
+# been granted.
+package.access=sun.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat.,org.apache.jasper.,sun.beans.
+#
+# List of comma-separated packages that start with or equal this string
+# will cause a security exception to be thrown when
+# passed to checkPackageDefinition unless the
+# corresponding RuntimePermission ("defineClassInPackage."+package) has
+# been granted.
+#
+# by default, no packages are restricted for definition, and none of
+# the class loaders supplied with the JDK call checkPackageDefinition.
+#
+package.definition=sun.,java.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat.,org.apache.jasper.
+
+#
+#
+# List of comma-separated paths defining the contents of the "common"
+# classloader. Prefixes should be used to define what is the repository type.
+# Path may be relative to the CATALINA_HOME or CATALINA_BASE path or absolute.
+# If left as blank,the JVM system loader will be used as Catalina's "common"
+# loader.
+# Examples:
+#     "foo": Add this folder as a class repository
+#     "foo/*.jar": Add all the JARs of the specified folder as class
+#                  repositories
+#     "foo/bar.jar": Add bar.jar as a class repository
+common.loader=${r"${catalina.home}"}/lib,${r"${catalina.home}"}/lib/*.jar
+
+#
+# List of comma-separated paths defining the contents of the "server"
+# classloader. Prefixes should be used to define what is the repository type.
+# Path may be relative to the CATALINA_HOME or CATALINA_BASE path or absolute.
+# If left as blank, the "common" loader will be used as Catalina's "server"
+# loader.
+# Examples:
+#     "foo": Add this folder as a class repository
+#     "foo/*.jar": Add all the JARs of the specified folder as class
+#                  repositories
+#     "foo/bar.jar": Add bar.jar as a class repository
+server.loader=
+
+#
+# List of comma-separated paths defining the contents of the "shared"
+# classloader. Prefixes should be used to define what is the repository type.
+# Path may be relative to the CATALINA_BASE path or absolute. If left as blank,
+# the "common" loader will be used as Catalina's "shared" loader.
+# Examples:
+#     "foo": Add this folder as a class repository
+#     "foo/*.jar": Add all the JARs of the specified folder as class
+#                  repositories
+#     "foo/bar.jar": Add bar.jar as a class repository
+# Please note that for single jars, e.g. bar.jar, you need the URL form
+# starting with file:.
+ofbiz.home=${ofbizHome}
+shared.loader=file://${r"${ofbiz.home}"}/ofbiz.jar,\
+<#list classpathDirs as dir>${dir},\<#if dir_has_next>${"\n"}</#if></#list>
+<#list classpathJars as jar>file://${jar}<#if jar_has_next>,\</#if>${"\n"}</#list>
+
+#
+# String cache configuration.
+tomcat.util.buf.StringCache.byte.enabled=true
+#tomcat.util.buf.StringCache.char.enabled=true
+#tomcat.util.buf.StringCache.trainThreshold=500000
+#tomcat.util.buf.StringCache.cacheSize=5000
diff --git a/framework/appserver/templates/tomcat6/catalina.sh b/framework/appserver/templates/tomcat6/catalina.sh
new file mode 100755
index 0000000..f68e9d0
--- /dev/null
+++ b/framework/appserver/templates/tomcat6/catalina.sh
@@ -0,0 +1,360 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+
+# -----------------------------------------------------------------------------
+# Start/Stop Script for the CATALINA Server
+#
+# Environment Variable Prequisites
+#
+#   CATALINA_HOME   May point at your Catalina "build" directory.
+#
+#   CATALINA_BASE   (Optional) Base directory for resolving dynamic portions
+#                   of a Catalina installation.  If not present, resolves to
+#                   the same directory that CATALINA_HOME points to.
+#
+#   CATALINA_OPTS   (Optional) Java runtime options used when the "start",
+#                   or "run" command is executed.
+#
+#   CATALINA_TMPDIR (Optional) Directory path location of temporary directory
+#                   the JVM should use (java.io.tmpdir).  Defaults to
+#                   $CATALINA_BASE/temp.
+#
+#   JAVA_HOME       Must point at your Java Development Kit installation.
+#                   Required to run the with the "debug" or "javac" argument.
+#
+#   JRE_HOME        Must point at your Java Development Kit installation.
+#                   Defaults to JAVA_HOME if empty.
+#
+#   JAVA_OPTS       (Optional) Java runtime options used when the "start",
+#                   "stop", or "run" command is executed.
+
+# BEGIN OfBiz settings
+JAVA_OPTS="$JAVA_OPTS -Dofbiz.home=${ofbizHome}"
+# END OfBiz settings
+
+#   JPDA_TRANSPORT  (Optional) JPDA transport used when the "jpda start"
+#                   command is executed. The default is "dt_socket".
+#
+#   JPDA_ADDRESS    (Optional) Java runtime options used when the "jpda start"
+#                   command is executed. The default is 8000.
+#
+#   JPDA_SUSPEND    (Optional) Java runtime options used when the "jpda start"
+#                   command is executed. Specifies whether JVM should suspend
+#                   execution immediately after startup. Default is "n".
+#
+#   JPDA_OPTS       (Optional) Java runtime options used when the "jpda start"
+#                   command is executed. If used, JPDA_TRANSPORT, JPDA_ADDRESS,
+#                   and JPDA_SUSPEND are ignored. Thus, all required jpda
+#                   options MUST be specified. The default is:
+#
+#                   -Xdebug -Xrunjdwp:transport=$JPDA_TRANSPORT,
+#                       address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND
+#
+#   JSSE_HOME       (Optional) May point at your Java Secure Sockets Extension
+#                   (JSSE) installation, whose JAR files will be added to the
+#                   system class path used to start Tomcat.
+#
+#   CATALINA_PID    (Optional) Path of the file which should contains the pid
+#                   of catalina startup java process, when start (fork) is used
+#
+# $Id: catalina.sh 600664 2007-12-03 20:24:19Z jim $
+# -----------------------------------------------------------------------------
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false
+os400=false
+darwin=false
+case "`uname`" in
+CYGWIN*) cygwin=true;;
+OS400*) os400=true;;
+Darwin*) darwin=true;;
+esac
+
+# resolve links - $0 may be a softlink
+PRG="$0"
+
+while [ -h "$PRG" ]; do
+  ls=`ls -ld "$PRG"`
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    PRG="$link"
+  else
+    PRG=`dirname "$PRG"`/"$link"
+  fi
+done
+
+# Get standard environment variables
+PRGDIR=`dirname "$PRG"`
+
+# Only set CATALINA_HOME if not already set
+[ -z "$CATALINA_HOME" ] && CATALINA_HOME=`cd "$PRGDIR/.." ; pwd`
+
+if [ -r "$CATALINA_BASE"/bin/setenv.sh ]; then
+  . "$CATALINA_BASE"/bin/setenv.sh
+elif [ -r "$CATALINA_HOME"/bin/setenv.sh ]; then
+  . "$CATALINA_HOME"/bin/setenv.sh
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin; then
+  [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$JRE_HOME" ] && JRE_HOME=`cygpath --unix "$JRE_HOME"`
+  [ -n "$CATALINA_HOME" ] && CATALINA_HOME=`cygpath --unix "$CATALINA_HOME"`
+  [ -n "$CATALINA_BASE" ] && CATALINA_BASE=`cygpath --unix "$CATALINA_BASE"`
+  [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+  [ -n "$JSSE_HOME" ] && JSSE_HOME=`cygpath --absolute --unix "$JSSE_HOME"`
+fi
+
+# For OS400
+if $os400; then
+  # Set job priority to standard for interactive (interactive - 6) by using
+  # the interactive priority - 6, the helper threads that respond to requests
+  # will be running at the same priority as interactive jobs.
+  COMMAND='chgjob job('$JOBNAME') runpty(6)'
+  system $COMMAND
+
+  # Enable multi threading
+  export QIBM_MULTI_THREADED=Y
+fi
+
+# Get standard Java environment variables
+if $os400; then
+  # -r will Only work on the os400 if the files are:
+  # 1. owned by the user
+  # 2. owned by the PRIMARY group of the user
+  # this will not work if the user belongs in secondary groups
+  BASEDIR="$CATALINA_HOME"
+  . "$CATALINA_HOME"/bin/setclasspath.sh
+else
+  if [ -r "$CATALINA_HOME"/bin/setclasspath.sh ]; then
+    BASEDIR="$CATALINA_HOME"
+    . "$CATALINA_HOME"/bin/setclasspath.sh
+  else
+    echo "Cannot find $CATALINA_HOME/bin/setclasspath.sh"
+    echo "This file is needed to run this program"
+    exit 1
+  fi
+fi
+
+# Add on extra jar files to CLASSPATH
+if [ -n "$JSSE_HOME" ]; then
+  CLASSPATH="$CLASSPATH":"$JSSE_HOME"/lib/jcert.jar:"$JSSE_HOME"/lib/jnet.jar:"$JSSE_HOME"/lib/jsse.jar
+fi
+CLASSPATH="$CLASSPATH":"$CATALINA_HOME"/bin/bootstrap.jar
+
+if [ -z "$CATALINA_BASE" ] ; then
+  CATALINA_BASE="$CATALINA_HOME"
+fi
+
+if [ -z "$CATALINA_TMPDIR" ] ; then
+  # Define the java.io.tmpdir to use for Catalina
+  CATALINA_TMPDIR="$CATALINA_BASE"/temp
+fi
+
+# Bugzilla 37848: When no TTY is available, don't output to console
+have_tty=0
+if [ "`tty`" != "not a tty" ]; then
+    have_tty=1
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  JAVA_HOME=`cygpath --absolute --windows "$JAVA_HOME"`
+  JRE_HOME=`cygpath --absolute --windows "$JRE_HOME"`
+  CATALINA_HOME=`cygpath --absolute --windows "$CATALINA_HOME"`
+  CATALINA_BASE=`cygpath --absolute --windows "$CATALINA_BASE"`
+  CATALINA_TMPDIR=`cygpath --absolute --windows "$CATALINA_TMPDIR"`
+  CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+  [ -n "$JSSE_HOME" ] && JSSE_HOME=`cygpath --absolute --windows "$JSSE_HOME"`
+  JAVA_ENDORSED_DIRS=`cygpath --path --windows "$JAVA_ENDORSED_DIRS"`
+fi
+
+# Set juli LogManager if it is present
+if [ -r "$CATALINA_BASE"/conf/logging.properties ]; then
+  JAVA_OPTS="$JAVA_OPTS "-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" "-Djava.util.logging.config.file="$CATALINA_BASE/conf/logging.properties"
+fi
+
+# ----- Execute The Requested Command -----------------------------------------
+
+# Bugzilla 37848: only output this if we have a TTY
+if [ $have_tty -eq 1 ]; then
+  echo "Using CATALINA_BASE:   $CATALINA_BASE"
+  echo "Using CATALINA_HOME:   $CATALINA_HOME"
+  echo "Using CATALINA_TMPDIR: $CATALINA_TMPDIR"
+  if [ "$1" = "debug" -o "$1" = "javac" ] ; then
+    echo "Using JAVA_HOME:       $JAVA_HOME"
+  else
+    echo "Using JRE_HOME:       $JRE_HOME"
+  fi
+fi
+
+if [ "$1" = "jpda" ] ; then
+  if [ -z "$JPDA_TRANSPORT" ]; then
+    JPDA_TRANSPORT="dt_socket"
+  fi
+  if [ -z "$JPDA_ADDRESS" ]; then
+    JPDA_ADDRESS="8000"
+  fi
+  if [ -z "$JPDA_SUSPEND" ]; then
+    JPDA_SUSPEND="n"
+  fi
+  if [ -z "$JPDA_OPTS" ]; then
+    JPDA_OPTS="-Xdebug -Xrunjdwp:transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND"
+  fi
+  CATALINA_OPTS="$CATALINA_OPTS $JPDA_OPTS"
+  shift
+fi
+
+if [ "$1" = "debug" ] ; then
+  if $os400; then
+    echo "Debug command not available on OS400"
+    exit 1
+  else
+    shift
+    if [ "$1" = "-security" ] ; then
+      echo "Using Security Manager"
+      shift
+      exec "$_RUNJDB" $JAVA_OPTS $CATALINA_OPTS \
+        -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
+        -sourcepath "$CATALINA_HOME"/../../java \
+        -Djava.security.manager \
+        -Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
+        -Dcatalina.base="$CATALINA_BASE" \
+        -Dcatalina.home="$CATALINA_HOME" \
+        -Djava.io.tmpdir="$CATALINA_TMPDIR" \
+        org.apache.catalina.startup.Bootstrap "$@" start
+    else
+      exec "$_RUNJDB" $JAVA_OPTS $CATALINA_OPTS \
+        -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
+        -sourcepath "$CATALINA_HOME"/../../java \
+        -Dcatalina.base="$CATALINA_BASE" \
+        -Dcatalina.home="$CATALINA_HOME" \
+        -Djava.io.tmpdir="$CATALINA_TMPDIR" \
+        org.apache.catalina.startup.Bootstrap "$@" start
+    fi
+  fi
+
+elif [ "$1" = "run" ]; then
+
+  shift
+  if [ "$1" = "-security" ] ; then
+    echo "Using Security Manager"
+    shift
+    exec "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
+      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
+      -Djava.security.manager \
+      -Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
+      -Dcatalina.base="$CATALINA_BASE" \
+      -Dcatalina.home="$CATALINA_HOME" \
+      -Djava.io.tmpdir="$CATALINA_TMPDIR" \
+      org.apache.catalina.startup.Bootstrap "$@" start
+  else
+    exec "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
+      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
+      -Dcatalina.base="$CATALINA_BASE" \
+      -Dcatalina.home="$CATALINA_HOME" \
+      -Djava.io.tmpdir="$CATALINA_TMPDIR" \
+      org.apache.catalina.startup.Bootstrap "$@" start
+  fi
+
+elif [ "$1" = "start" ] ; then
+
+  shift
+  touch "$CATALINA_BASE"/logs/catalina.out
+  if [ "$1" = "-security" ] ; then
+    echo "Using Security Manager"
+    shift
+    "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
+      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
+      -Djava.security.manager \
+      -Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
+      -Dcatalina.base="$CATALINA_BASE" \
+      -Dcatalina.home="$CATALINA_HOME" \
+      -Djava.io.tmpdir="$CATALINA_TMPDIR" \
+      org.apache.catalina.startup.Bootstrap "$@" start \
+      >> "$CATALINA_BASE"/logs/catalina.out 2>&1 &
+
+      if [ ! -z "$CATALINA_PID" ]; then
+        echo $! > $CATALINA_PID
+      fi
+  else
+    "$_RUNJAVA" $JAVA_OPTS $CATALINA_OPTS \
+      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
+      -Dcatalina.base="$CATALINA_BASE" \
+      -Dcatalina.home="$CATALINA_HOME" \
+      -Djava.io.tmpdir="$CATALINA_TMPDIR" \
+      org.apache.catalina.startup.Bootstrap "$@" start \
+      >> "$CATALINA_BASE"/logs/catalina.out 2>&1 &
+
+      if [ ! -z "$CATALINA_PID" ]; then
+        echo $! > $CATALINA_PID
+      fi
+  fi
+
+elif [ "$1" = "stop" ] ; then
+
+  shift
+  FORCE=0
+  if [ "$1" = "-force" ]; then
+    shift
+    FORCE=1
+  fi
+
+  "$_RUNJAVA" $JAVA_OPTS \
+    -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
+    -Dcatalina.base="$CATALINA_BASE" \
+    -Dcatalina.home="$CATALINA_HOME" \
+    -Djava.io.tmpdir="$CATALINA_TMPDIR" \
+    org.apache.catalina.startup.Bootstrap "$@" stop
+
+  if [ $FORCE -eq 1 ]; then
+    if [ ! -z "$CATALINA_PID" ]; then
+       echo "Killing: `cat $CATALINA_PID`"
+       kill -9 `cat $CATALINA_PID`
+    else
+       echo "Kill failed: \$CATALINA_PID not set"
+    fi
+  fi
+
+elif [ "$1" = "version" ] ; then
+
+    "$_RUNJAVA"   \
+      -classpath "$CATALINA_HOME/lib/catalina.jar" \
+      org.apache.catalina.util.ServerInfo
+
+else
+
+  echo "Usage: catalina.sh ( commands ... )"
+  echo "commands:"
+  if $os400; then
+    echo "  debug             Start Catalina in a debugger (not available on OS400)"
+    echo "  debug -security   Debug Catalina with a security manager (not available on OS400)"
+  else
+    echo "  debug             Start Catalina in a debugger"
+    echo "  debug -security   Debug Catalina with a security manager"
+  fi
+  echo "  jpda start        Start Catalina under JPDA debugger"
+  echo "  run               Start Catalina in the current window"
+  echo "  run -security     Start in the current window with security manager"
+  echo "  start             Start Catalina in a separate window"
+  echo "  start -security   Start in a separate window with security manager"
+  echo "  stop              Stop Catalina"
+  echo "  stop -force       Stop Catalina (followed by kill -KILL)"
+  echo "  version           What version of tomcat are you running?"
+  exit 1
+
+fi
diff --git a/framework/appserver/templates/tomcat6/server.xml b/framework/appserver/templates/tomcat6/server.xml
new file mode 100644
index 0000000..a54f668
--- /dev/null
+++ b/framework/appserver/templates/tomcat6/server.xml
@@ -0,0 +1,161 @@
+<?xml version='1.0' encoding='utf-8'?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You 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.
+-->
+<!-- Note:  A "Server" is not itself a "Container", so you may not
+     define subcomponents such as "Valves" at this level.
+     Documentation at /docs/config/server.html
+ -->
+<Server port="8005" shutdown="SHUTDOWN">
+
+  <!--APR library loader. Documentation at /docs/apr.html -->
+  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on"/>
+  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
+  <Listener className="org.apache.catalina.core.JasperListener"/>
+  <!-- JMX Support for the Tomcat server. Documentation at /docs/non-existent.html -->
+  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"/>
+  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
+
+  <!-- Global JNDI resources
+       Documentation at /docs/jndi-resources-howto.html
+  -->
+  <GlobalNamingResources>
+    <!-- Editable user database that can also be used by
+         UserDatabaseRealm to authenticate users
+    -->
+    <Resource name="UserDatabase" auth="Container"
+              type="org.apache.catalina.UserDatabase"
+              description="User database that can be updated and saved"
+              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
+              pathname="conf/tomcat-users.xml"/>
+  </GlobalNamingResources>
+
+  <!-- A "Service" is a collection of one or more "Connectors" that share
+       a single "Container" Note:  A "Service" is not itself a "Container",
+       so you may not define subcomponents such as "Valves" at this level.
+       Documentation at /docs/config/service.html
+   -->
+  <Service name="Catalina">
+
+    <!--The connectors can use a shared executor, you can define one or more named thread pools-->
+    <!--
+    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
+        maxThreads="150" minSpareThreads="4"/>
+    -->
+
+
+    <!-- A "Connector" represents an endpoint by which requests are received
+         and responses are returned. Documentation at :
+         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
+         Java AJP  Connector: /docs/config/ajp.html
+         APR (HTTP/AJP) Connector: /docs/apr.html
+         Define a non-SSL HTTP/1.1 Connector on port 8080
+    -->
+    <Connector port="8080" protocol="HTTP/1.1"
+               connectionTimeout="20000"
+               redirectPort="8443"/>
+    <!-- A "Connector" using the shared thread pool-->
+    <!--
+    <Connector executor="tomcatThreadPool"
+               port="8080" protocol="HTTP/1.1"
+               connectionTimeout="20000"
+               redirectPort="8443"/>
+    -->
+    <!-- Define a SSL HTTP/1.1 Connector on port 8443
+         This connector uses the JSSE configuration, when using APR, the
+         connector should be using the OpenSSL style configuration
+         described in the APR documentation -->
+    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
+               maxThreads="150" scheme="https" secure="true"
+               clientAuth="false" sslProtocol="TLS"
+               keystoreFile="${ofbizHome}/framework/base/config/ofbizssl.jks"
+               keystorePass="changeit"/>
+
+    <!-- Define an AJP 1.3 Connector on port 8009 -->
+    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
+
+
+    <!-- An Engine represents the entry point (within Catalina) that processes
+         every request.  The Engine implementation for Tomcat stand alone
+         analyzes the HTTP headers included with the request, and passes them
+         on to the appropriate Host (virtual host).
+         Documentation at /docs/config/engine.html -->
+
+    <!-- You should set jvmRoute to support load-balancing via AJP ie :
+    <Engine name="Standalone" defaultHost="localhost" jvmRoute="jvm1">
+    -->
+    <Engine name="Catalina" defaultHost="localhost">
+
+      <!--For clustering, please take a look at documentation at:
+          /docs/cluster-howto.html  (simple how to)
+          /docs/config/cluster.html (reference documentation) -->
+      <!--
+      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
+      -->
+
+      <!-- The request dumper valve dumps useful debugging information about
+           the request and response data received and sent by Tomcat.
+           Documentation at: /docs/config/valve.html -->
+      <!--
+      <Valve className="org.apache.catalina.valves.RequestDumperValve"/>
+      -->
+
+      <!-- This Realm uses the UserDatabase configured in the global JNDI
+           resources under the key "UserDatabase".  Any edits
+           that are performed against this UserDatabase are immediately
+           available for use by the Realm.  -->
+      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
+             resourceName="UserDatabase"/>
+
+      <!-- Define the default virtual host
+           Note: XML Schema validation will not work with Xerces 2.2.
+       -->
+      <Host name="localhost"  appBase="webapps"
+            unpackWARs="true" autoDeploy="true"
+            xmlValidation="false" xmlNamespaceAware="false">
+
+        <!-- SingleSignOn valve, share authentication between web applications
+             Documentation at: /docs/config/valve.html -->
+        <!--
+        <Valve className="org.apache.catalina.authenticator.SingleSignOn"/>
+        -->
+
+        <!-- Access log processes all example.
+             Documentation at: /docs/config/valve.html -->
+        <!--
+        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
+               prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
+        -->
+
+    <!-- BEGIN OFBiz settings -->
+<#list webApps as webapp>
+    <#-- Remove last directory segment from path -->
+    <#if webapp.getLocation().lastIndexOf("/") != -1>
+        <#assign lastSlash = webapp.getLocation().lastIndexOf("/")>
+    </#if>
+    <#if (webapp.getLocation().lastIndexOf("\\") > lastSlash)>
+        <#assign lastSlash = webapp.getLocation().lastIndexOf("\\")>
+    </#if>
+<Context path="${webapp.getContextRoot()}" docBase="${webapp.getLocation().substring(0,lastSlash)}${webapp.getContextRoot()}"
+         privileged="false" antiResourceLocking="true" antiJARLocking="true">
+</Context>
+</#list>
+    <!-- END OFBiz settings -->
+
+      </Host>
+    </Engine>
+  </Service>
+</Server>
diff --git a/framework/appserver/templates/wasce2/README b/framework/appserver/templates/wasce2/README
new file mode 100644
index 0000000..f47931d
--- /dev/null
+++ b/framework/appserver/templates/wasce2/README
@@ -0,0 +1,113 @@
+<#--
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you 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.
+-->
+
+Websphere Application Server Community Edition (WASCE) 2 or Geronimo 2.0.3 Setup - 2008-04-08 - Jacques Le Roux
+Refer to the Guidelines in the OFBiz documentation : http://docs.ofbiz.org/x/Ah
+To use OFBiz with WASCE 2 or Geronimo 2.0.3 follow the following steps (all steps assume WASCE 2 or Geronimo 2.0.3  is already installed and working)
+
+=======================================================================================================================================================
+    In function of your OS, copy in the geronimo script (.sh or .bat), the 2 lines below in (at the top)
+      of the doneSetArgs section (Windows)
+      or the <<elif [ "$1" = "run" ]>> block (Linux)
+
+    For the ofbiz.home value:
+    On Windows dont' worry about the /or \ in , they work both.
+    On Linux depending on your distribution you might need to put inside quotes around the ofbizHome value, then don't forget to escape them
+    For instance on Ubuntu 6.06 LTS inside quotes are needed, but don't put them for Suze 10...
+
+    Note :
+    If you prefer on WASCE you may use the setven scvript to set your env value. Notably if you want to separate things and have more var to set
+    Then copy the 2 lines below in the setJavaOpts section (Windows) or somewhere in the setEnv script you will find in GERONIMO_HOME/bin (Linux)
+    This script does not exist in Geronimo but is anticipated and taken into account.
+    If you need it, you may concatenate pre-existing JAVA_OPTS, same for CLASSPATH. But it's not needed for OFBiz alone.
+=======================================================================================================================================================
+
+<#assign classpath = ""/>
+<#list classpathDirs as dir>
+    <#assign classpath = classpath + dir + pathSeparatorChar/>
+</#list>
+<#assign classpath = classpath?substring(0, classpath?length - 1)/>
+
+Windows
+-------
+set JAVA_OPTS=-Dofbiz.home="${ofbizHome}" -Xms256M -Xmx512M -XX:MaxPermSize=128M -Duser.language=en
+set CLASSPATH=${classpath}
+
+Linux
+-----
+Add this 2 lines after the
+    elif [ "$1" = "run" ]; then
+line
+  JAVA_OPTS="-Dofbiz.home="${ofbizHome}" -Xms256M -Xmx512M -XX:MaxPermSize=128M -Duser.language=en"
+  CLASSPATH="${classpath}"
+
+
+=======================================================================================================================================================
+    Change also this line of the geronimo script in the doneSetArgs section (Windows) or in the <<elif [ "$1" = "run" ]>> block (Linux)
+=======================================================================================================================================================
+Windows
+-------
+Replace the line
+    %_EXECJAVA% %JAVA_OPTS% %GERONIMO_OPTS% %JAVA_AGENT_OPTS% -Djava.ext.dirs="%GERONIMO_BASE%\lib\ext;%JRE_HOME%\lib\ext" -Djava.endorsed.dirs="%GERONIMO_BASE%\lib\endorsed;%JRE_HOME%\lib\endorsed" -Dorg.apache.geronimo.base.dir="%GERONIMO_BASE%" -Djava.io.tmpdir="%GERONIMO_TMPDIR%" -jar %_JARFILE% %_LONG_OPT% %CMD_LINE_ARGS%
+by
+    %_EXECJAVA% %JAVA_OPTS% %GERONIMO_OPTS% %JAVA_AGENT_OPTS% -Djava.ext.dirs="%GERONIMO_BASE%\lib\ext;%JRE_HOME%\lib\ext" -Djava.endorsed.dirs="%GERONIMO_BASE%\lib\endorsed;%JRE_HOME%\lib\endorsed" -Dorg.apache.geronimo.base.dir="%GERONIMO_BASE%" -Djava.io.tmpdir="%GERONIMO_TMPDIR%" -cp .;%_JARFILE%;%CLASSPATH% %_LONG_OPT% %CMD_LINE_ARGS% %MAINCLASS%
+
+Linux
+-----
+Replace the line
+    -jar "$GERONIMO_HOME"/bin/server.jar $LONG_OPT "$@"
+by
+    -classpath ".":"$GERONIMO_HOME"/bin/server.jar:"$CLASSPATH" org.apache.geronimo.cli.daemon.DaemonCLI $LONG_OPT "$@"
+
+
+=======================================================================================================================================================
+    If you want to use RMI (RMIDispatcher) you will need to put the following lines in the limited-containers.xml file (set the values as you want)
+        <property name="bound-host" value="127.0.0.1"/>
+        <property name="bound-port" value="1099"/>
+
+    You will need also to change the value of use-initial-context to false and to put the complete path for ssl-keystore.
+
+    Finally you will have to set a security manager using the option -Djava.security.manager and
+    pass a client policy to the application server using the -Djava.security.policy=client.policy parameter,
+    simply put it at the end of JAVA_OPTS above.
+    Indeed to load the RMIDispatcher under the application server it needs a RMI Security Manager.
+    For my test I used a very simple client.policy file with all permissions that I put in the bin directory of the application server.
+    Its content is :
+        grant{
+        permission java.security.AllPermission;
+        };
+
+    To work cleanly on Windows you will also have to add the option -DXorg.apache.geronimo.JarFileClassLoader=false
+    see https://issues.apache.org/jira/browse/GERONIMO-4037 for more.
+
+    Debug stuff : -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
+    You may got this issue when shutting down : ERROR: transport error 202: bind failed: Address already in use ["transport.c",L41]
+    But you can neglect and force stopping
+
+    *** Also beware, you can't have spaces in the path where the application server is installed ***
+    And last but not least you may appreciate http://cwiki.apache.org/confluence/display/OFBIZ/FAQ+-+Tips+-+Tricks+-+Cookbook+-+HowTo#FAQ-Tips-Tricks-Cookbook-HowTo-HowtouseRMIwithoutSSL
+=======================================================================================================================================================
+
+Derby
+-----
+If you are using the embedded Derby database you should consider this.
+OFBiz creates 2 folders for the Derby Database under the runtime directory: ofbiz and ofbizolap, these contain all the setup data for OFBiz.
+If you run Geronimo, under your Geronimo bin directory you will see the 2 same directories.
+But those will not contain any data as you are not running OFBiz with the necessary parameters (you are running Geronimo, not OFBiz).
+Simply replace the 2 directories: ofbiz & ofbizolap in your Geronimo bin directory by the 2 directories from your OFBiz runtime directory.
diff --git a/framework/appserver/templates/wasce2/application.xml b/framework/appserver/templates/wasce2/application.xml
new file mode 100644
index 0000000..fde643a
--- /dev/null
+++ b/framework/appserver/templates/wasce2/application.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you 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.
+-->
+<!-- This generates an application.xml file used in an exploded EAR structure (no WAR files).
+  The file is copied in the META-INF directory in this EAR structure ready to deploy using the inPlace deployer tool option
+  Eventually irrelevant generated modules and dependencies should be removed (but it should not hurt if not done)
+  The indentation is specifically done for the rendered file
+-->
+<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xmlns="http://java.sun.com/xml/ns/javaee"
+  xmlns:application="http://java.sun.com/xml/ns/javaee/application_5.xsd"
+  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd"
+  id="Application_ID"
+  version="5">
+
+  <description>The Apache OFBiz Project  this is instance ${instanceNumber}</description>
+  <display-name>OFBiz instance ${instanceNumber}</display-name>
+
+  <#list webApps as webapp>
+    <#assign location = webapp.getLocation()?if_exists/>
+    <#assign origin = webapp.getLocation()?if_exists/>
+      <#if location.contains("/framework/") && (location.contains("/webtools/") || location.contains("/images/"))>
+        <#assign location = location.substring(location.lastIndexOf("framework"))/>
+      </#if>
+    <#if location.contains("/applications/")>
+        <#assign location = location.substring(location.lastIndexOf("applications"))/>
+      </#if>
+    <#if location.contains("/specialpurpose/")>
+        <#assign location = location.substring(location.lastIndexOf("specialpurpose"))/>
+      </#if>
+      <#if location.contains("/hot-deploy/")>
+        <#assign location = location.substring(location.lastIndexOf("hot-deploy"))/>
+      </#if>
+    <#if location != origin>
+  <module id="${webapp.getName()}${instanceNumber}">
+    <web>
+      <web-uri>${location}/</web-uri>
+      <context-root>${webapp.getContextRoot()}${instanceNumber}</context-root>
+    </web>
+  </module>
+    </#if>
+  </#list>
+</application>
diff --git a/framework/appserver/templates/wasce2/geronimo-application.xml b/framework/appserver/templates/wasce2/geronimo-application.xml
new file mode 100644
index 0000000..742d621
--- /dev/null
+++ b/framework/appserver/templates/wasce2/geronimo-application.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you 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.
+-->
+<!-- This generates a geronimo-application.xml file used in an exploded EAR structure (no WAR files).
+    The file is copied in the META-INF directory in this EAR structure ready to deploy using the inPlace deployer tool option
+    Eventually irrelevant generated modules and dependencies should be removed (but it should not hurt if not done)
+    The indentation is specifically done for the rendered file
+-->
+<application xmlns="http://geronimo.apache.org/xml/ns/j2ee/application-2.0"
+    xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.2"
+    xmlns:security="http://geronimo.apache.org/xml/ns/security-1.2">
+    <dep:environment>
+        <dep:moduleId>
+            <dep:groupId>org.ofbiz</dep:groupId>
+            <dep:artifactId>ofbiz${instanceNumber}</dep:artifactId>
+            <dep:version>1.0</dep:version>
+            <dep:type>ear</dep:type>
+        </dep:moduleId>
+
+        <dep:dependencies>
+          <#list classpathJars as jar_version>
+            <#assign jar = jar_version.substring(0,jar_version.indexOf("#"))/>
+              <#assign version = jar_version.substring(jar_version.indexOf("#") + 1)/>
+            <dependency>
+                <dep:groupId>org.ofbiz</dep:groupId>
+                <dep:artifactId>${jar}</dep:artifactId>
+                <dep:version>${version}</dep:version>
+                <dep:type>jar</dep:type>
+            </dependency>
+          </#list>
+        </dep:dependencies>
+        <dep:hidden-classes/>
+        <dep:non-overridable-classes/>
+    </dep:environment>
+
+    <#list webApps as webapp>
+        <#assign location = webapp.getLocation()?if_exists/>
+        <#assign origin = webapp.getLocation()?if_exists/>
+        <#if location.contains("/framework/") && (location.contains("/webtools/") || location.contains("/images/"))>
+                <#assign location = location.substring(location.lastIndexOf("framework"))/>
+        </#if>
+        <#if location.contains("/applications/")>
+            <#assign location = location.substring(location.lastIndexOf("applications"))/>
+        </#if>
+        <#if location.contains("/specialpurpose/") && !location.contains("/pos/")>
+            <#assign location = location.substring(location.lastIndexOf("specialpurpose"))/>
+        </#if>
+        <#if location.contains("/hot-deploy/")>
+            <#assign location = location.substring(location.lastIndexOf("hot-deploy"))/>
+        </#if>
+        <#if location != origin>
+    <module>
+        <web>${location}/</web>
+        <web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.2">
+            <context-root>${webapp.getContextRoot()}${instanceNumber}</context-root>
+        </web-app>
+    </module>
+        </#if>
+    </#list>
+
+</application>
diff --git a/framework/appserver/templates/wasce2/geronimo-web.xml b/framework/appserver/templates/wasce2/geronimo-web.xml
new file mode 100644
index 0000000..004cd69
--- /dev/null
+++ b/framework/appserver/templates/wasce2/geronimo-web.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you 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.
+-->
+<!-- This generates geronimo-web.xml files in each concerned webbapp, in an exploded EAR structure (no WAR files). -->
+<web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-2.0"
+    xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.2"
+    xmlns:naming="http://geronimo.apache.org/xml/ns/naming-1.2"
+    xmlns:security="http://geronimo.apache.org/xml/ns/security-1.2">
+
+    <dep:environment>
+        <dep:moduleId>
+            <dep:groupId>org.ofbiz.${webApp.getName()}</dep:groupId>
+            <dep:artifactId>${webApp.getName()}</dep:artifactId>
+            <dep:version>1.0</dep:version>
+            <dep:type>war</dep:type>
+        </dep:moduleId>
+        <dep:dependencies/>
+        <dep:hidden-classes/>
+        <dep:non-overridable-classes/>
+    </dep:environment>
+
+    <context-root>${webApp.getContextRoot()}</context-root>
+
+</web-app>
diff --git a/framework/appserver/templates/weblogic81/README b/framework/appserver/templates/weblogic81/README
new file mode 100644
index 0000000..aa382db
--- /dev/null
+++ b/framework/appserver/templates/weblogic81/README
@@ -0,0 +1,19 @@
+
+These configuration templates are for Weblogic 8.1 SP2, which was the latest version at the time of writing.
+
+For ease of use these three files are meant to be used in the "examples" domain that comes with Weblogic.
+
+The main reason for this is that it is difficult to configure Weblogic security settings for a new domain and this way it is easy to get started fast.
+
+To use just put OFBiz somewhere on your system and once it is in place generate the Weblogic configuration files from the templates, as described in the ofbiz/framework/appservers/README file. Copy those files into the $WL_HOME/samples/domains/examples directory.
+
+Before running there are some things that come by default in OFBiz that conflict with Weblogic. These are things to do before running:
+
+1. Remove the jndi.properties file from ofbiz/base/config so that the Weblogic defaults will be used
+2. Comment out or re-configure the RMIDispatcher container in the limited-containers.xml file in ofbiz/base/config
+
+Now, just run the startOFBizServer.cmd or startOFBizServer.sh scripts that were generated above and copied into the examples domain directory.
+
+Enjoy!
+
+
diff --git a/framework/appserver/templates/weblogic81/config.xml b/framework/appserver/templates/weblogic81/config.xml
new file mode 100644
index 0000000..ed5d6fe
--- /dev/null
+++ b/framework/appserver/templates/weblogic81/config.xml
@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<Domain ConfigurationVersion="8.1.2.0" Name="examples">
+    <Server COMEnabled="true" ConsoleInputEnabled="false"
+        JavaCompiler="javac" ListenAddress="" ListenPort="7001"
+        Name="examplesServer" ServerVersion="8.1.2.0" SocketReaderTimeoutMaxMillis="10">
+        <SSL Enabled="true" IdentityAndTrustLocations="KeyStores"
+            ListenPort="7002" Name="examplesServer"/>
+    </Server>
+
+    <Application Deployed="true" Name="mainWebApp"
+        Path="C:\bea\weblogic81\samples\server\examples\build" TwoPhase="true">
+        <WebAppComponent Name="mainWebApp" Targets="examplesServer" URI="mainWebApp"/>
+    </Application>
+    <Application Deployed="true" Name="examplesWebApp"
+        Path="C:\bea\weblogic81\samples\server\examples\build" TwoPhase="true">
+        <WebAppComponent Name="examplesWebApp" Targets="examplesServer" URI="examplesWebApp"/>
+    </Application>
+    <StartupClass ClassName="examples.cluster.rmi.HelloClusterImpl"
+        FailureIsFatal="false" Name="hello_cluster"/>
+    <StartupClass ClassName="examples.startup.StartBrowser"
+        FailureIsFatal="false" Name="StartBrowser"
+        Notes="On Windows, this class automatically starts a browser after the server has finished booting." Targets="examplesServer"/>
+    <StartupClass ClassName="examples.rmi.hello.HelloImpl"
+        FailureIsFatal="false" Name="hello"/>
+    <StartupClass ClassName="examples.rmi.multihello.HelloImpl"
+        FailureIsFatal="false" Name="multihello"/>
+    <StartupClass
+        Arguments="connectionFactory=weblogic.examples.jms.TopicConnectionFactory,topic=weblogic.examples.jms.exampleTopic"
+        ClassName="examples.jms.startup.ServerReceive"
+        FailureIsFatal="false" Name="serverReceive"/>
+    <StartupClass
+        Arguments="connectionFactory=weblogic.examples.jms.TopicConnectionFactory,topic=weblogic.examples.jms.exampleTopic"
+        ClassName="examples.jms.startup.PoolReceive"
+        FailureIsFatal="false" Name="poolReceive"/>
+    <JMSConnectionFactory
+        JNDIName="weblogic.examples.jms.QueueConnectionFactory"
+        Name="exampleQueue" Targets="examplesServer"/>
+    <JMSConnectionFactory
+        JNDIName="weblogic.examples.jms.TopicConnectionFactory"
+        Name="exampleTopic" Targets="examplesServer"/>
+    <JMSConnectionFactory JNDIName="jms.connection.traderFactory"
+        Name="exampleTrader" Targets="examplesServer"/>
+    <JMSJDBCStore ConnectionPool="demoPool" Name="exampleJDBCStore" PrefixName="examples"/>
+    <JMSServer Name="examplesJMSServer" Store="exampleJDBCStore" Targets="examplesServer">
+        <JMSQueue JNDIName="weblogic.examples.jms.exampleQueue" Name="exampleQueue"/>
+        <JMSQueue JNDIName="weblogic.examples.jms.exampleQueueReceive" Name="exampleQueueReceive"/>
+        <JMSQueue JNDIName="weblogic.examples.jms.exampleQueueSend" Name="exampleQueueSend"/>
+        <JMSTopic JNDIName="weblogic.examples.jms.exampleTopic" Name="exampleTopic"/>
+        <JMSTopic JNDIName="quotes" Name="quotes"/>
+    </JMSServer>
+    <JDBCConnectionPool CapacityIncrement="2"
+        DriverName="oracle.jdbc.driver.OracleDriver" InitialCapacity="4"
+        LoginDelaySeconds="1" MaxCapacity="10" Name="oraclePool"
+        Password="{3DES}aioYCP/l27g=" Properties="user=SCOTT"
+        RefreshMinutes="10" ShrinkPeriodMinutes="15"
+        ShrinkingEnabled="true" TestConnectionsOnRelease="false"
+        TestConnectionsOnReserve="false" TestTableName="dual" URL="jdbc:oracle:thin:@server:port:sid"/>
+    <JDBCConnectionPool CapacityIncrement="1"
+        DriverName="com.pointbase.xa.xaDataSource" InitialCapacity="2"
+        MaxCapacity="10" Name="demoXAPool"
+        Password="{3DES}29v4cTle6wsdsjHHe3l0AA=="
+        Properties="user=examples;DatabaseName=jdbc:pointbase:server://localhost/demo"
+        RefreshMinutes="0" ShrinkPeriodMinutes="15"
+        ShrinkingEnabled="true" Targets="examplesServer"
+        TestConnectionsOnRelease="false"
+        TestConnectionsOnReserve="false" TestTableName="SYSTABLES" URL="jdbc:pointbase:server://localhost/demo"/>
+    <JDBCConnectionPool CapacityIncrement="1"
+        DriverName="com.pointbase.jdbc.jdbcUniversalDriver"
+        InitialCapacity="1" MaxCapacity="10" Name="demoPool"
+        Password="{3DES}29v4cTle6wsdsjHHe3l0AA=="
+        Properties="user=examples" RefreshMinutes="0"
+        ShrinkPeriodMinutes="15" ShrinkingEnabled="true"
+        Targets="examplesServer" TestConnectionsOnRelease="false"
+        TestConnectionsOnReserve="false" TestTableName="SYSTABLES" URL="jdbc:pointbase:server://localhost/demo"/>
+    <JDBCTxDataSource EnableTwoPhaseCommit="true"
+        JNDIName="examples-dataSource-oracleXAPool"
+        Name="examples-dataSource-oracleXAPool" PoolName="oraclePool"/>
+    <JDBCTxDataSource EnableTwoPhaseCommit="true"
+        JNDIName="examples-dataSource-demoPool"
+        Name="examples-dataSource-demoPool" PoolName="demoPool" Targets="examplesServer"/>
+    <JDBCTxDataSource EnableTwoPhaseCommit="false"
+        JNDIName="examples-dataSource-demoXAPool"
+        Name="examples-dataSource-demoXAPool" PoolName="demoXAPool" Targets="examplesServer"/>
+
+    <JTA AbandonTimeoutSeconds="86400"
+        BeforeCompletionIterationLimit="100" ForgetHeuristics="false"
+        MaxTransactions="10000" MaxUniqueNameStatistics="1000"
+        Name="examples" TimeoutSeconds="100"/>
+    <Security Name="examples"
+        PasswordPolicy="wl_default_password_policy"
+        Realm="wl_default_realm" RealmSetup="true"/>
+    <EmbeddedLDAP
+        Credential="{3DES}GRR8WNEewgLkiUuYq3U8O9D1CBZ+KHfTIsDc1KH8OUo=" Name="examples"/>
+    <SecurityConfiguration
+        Credential="{3DES}8awKNTzSHpKbfdq0pSsIIUi8zgNWEWZ2FPqhpZYybeuOt5mVd3zYkiHeVLIYINH8RroM0oiREkhtKX+YbjTsv5Wim4ytFOP2"
+        Name="examples" RealmBootStrapVersion="1"/>
+    <Realm FileRealm="wl_default_file_realm" Name="wl_default_realm"/>
+    <FileRealm Name="wl_default_file_realm"/>
+    <PasswordPolicy Name="wl_default_password_policy"/>
+
+    <Application Name="_appsdir_ejb20_basic_statelessSession_ear"
+        Path="C:\bea\weblogic81\samples\domains\examples\applications\ejb20_basic_statelessSession.ear"
+        StagedTargets="examplesServer" StagingMode="stage" TwoPhase="true">
+        <EJBComponent Name="ejb20_basic_statelessSession.jar"
+            Targets="examplesServer" URI="ejb20_basic_statelessSession.jar"/>
+    </Application>
+    <Application Name="_appsdir_ejb20_message_ear"
+        Path="C:\bea\weblogic81\samples\domains\examples\applications\ejb20_message.ear"
+        StagedTargets="examplesServer" StagingMode="stage" TwoPhase="true">
+        <EJBComponent Name="ejb20_message.jar" Targets="examplesServer" URI="ejb20_message.jar"/>
+    </Application>
+    <Application Name="_appsdir_ejb20_basic_statefulSession_ear"
+        Path="C:\bea\weblogic81\samples\domains\examples\applications\ejb20_basic_statefulSession.ear"
+        StagedTargets="examplesServer" StagingMode="stage" TwoPhase="true">
+        <EJBComponent Name="ejb20_basic_statefulSession.jar"
+            Targets="examplesServer" URI="ejb20_basic_statefulSession.jar"/>
+    </Application>
+    <Application Name="_appsdir_ejb20_basic_containerManaged_ear"
+        Path="C:\bea\weblogic81\samples\domains\examples\applications\ejb20_basic_containerManaged.ear"
+        StagedTargets="examplesServer" StagingMode="stage" TwoPhase="true">
+        <EJBComponent Name="ejb20_basic_containerManaged.jar"
+            Targets="examplesServer" URI="ejb20_basic_containerManaged.jar"/>
+    </Application>
+    <Application Name="_appsdir_webservices_trader_ear"
+        Path="C:\bea\weblogic81\samples\domains\examples\applications\webservices_trader.ear"
+        StagedTargets="examplesServer" StagingMode="stage" TwoPhase="true">
+        <WebServiceComponent Name="webservice" Targets="examplesServer" URI="trader_service.war"/>
+        <EJBComponent Name="trader.jar" Targets="examplesServer" URI="trader.jar"/>
+    </Application>
+    <Application Name="_appsdir_jta_ejb_jmsjdbc_jar"
+        Path="C:\bea\weblogic81\samples\domains\examples\applications"
+        StagedTargets="examplesServer" StagingMode="stage" TwoPhase="true">
+        <EJBComponent Name="jta_ejb_jmsjdbc" Targets="examplesServer" URI="jta_ejb_jmsjdbc.jar"/>
+    </Application>
+    <Application Name="_appsdir_ejb20_basic_beanManaged_ear"
+        Path="C:\bea\weblogic81\samples\domains\examples\applications\ejb20_basic_beanManaged.ear"
+        StagedTargets="examplesServer" StagingMode="stage" TwoPhase="true">
+        <EJBComponent Name="ejb20_basic_beanManaged.jar"
+            Targets="examplesServer" URI="ejb20_basic_beanManaged.jar"/>
+    </Application>
+    <Application Name="_appsdir_jms_messageformat_jar"
+        Path="C:\bea\weblogic81\samples\domains\examples\applications"
+        StagedTargets="examplesServer" StagingMode="stage" TwoPhase="true">
+        <EJBComponent Name="jms_messageformat" Targets="examplesServer" URI="jms_messageformat.jar"/>
+    </Application>
+
+    <!-- BEGIN OFBiz settings -->
+<#list webApps as webapp>
+    <#-- Remove last directory segment from path, Weblogic is expecting the parent directory -->
+    <#if webapp.getLocation().lastIndexOf("/") != -1>
+        <#assign lastSlash = webapp.getLocation().lastIndexOf("/")>
+    </#if>
+    <#if (webapp.getLocation().lastIndexOf("\\") > lastSlash)>
+        <#assign lastSlash = webapp.getLocation().lastIndexOf("\\")>
+    </#if>
+    <Application Deployed="true" Name="${webapp.getName()}" Path="${webapp.getLocation().substring(0,lastSlash)}" TwoPhase="true">
+        <WebAppComponent Name="${webapp.getName()}" Targets="examplesServer" URI="${webapp.getContextRoot()}"/>
+    </Application>
+</#list>
+
+    <JDBCConnectionPool CapacityIncrement="1"
+        DriverName="org.hsqldb.jdbcDriver"
+        InitialCapacity="2" MaxCapacity="20" Name="localhsql"
+        Password=""
+        Properties="user=sa" RefreshMinutes="0"
+        ShrinkPeriodMinutes="15" ShrinkingEnabled="true"
+        Targets="examplesServer" TestConnectionsOnRelease="false"
+        TestConnectionsOnReserve="false" URL="jdbc:hsqldb:data/ofbiz"/> <!--  TestTableName="SYSTABLES" -->
+    <JDBCTxDataSource EnableTwoPhaseCommit="true"
+        JNDIName="localhsqlDataSource"
+        Name="localhsqlDataSource" PoolName="localhsql"/>
+</Domain>
diff --git a/framework/appserver/templates/weblogic81/startOFBizServer.cmd b/framework/appserver/templates/weblogic81/startOFBizServer.cmd
new file mode 100644
index 0000000..d5dab25
--- /dev/null
+++ b/framework/appserver/templates/weblogic81/startOFBizServer.cmd
@@ -0,0 +1,126 @@
+@rem ################################################################

+@rem Licensed to the Apache Software Foundation (ASF) under one

+@rem or more contributor license agreements.  See the NOTICE file

+@rem distributed with this work for additional information

+@rem regarding copyright ownership.  The ASF licenses this file

+@rem to you under the Apache License, Version 2.0 (the

+@rem "License"); you may not use this file except in compliance

+@rem with the License.  You may obtain a copy of the License at

+@rem

+@rem http://www.apache.org/licenses/LICENSE-2.0

+@rem

+@rem Unless required by applicable law or agreed to in writing,

+@rem software distributed under the License is distributed on an

+@rem "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

+@rem KIND, either express or implied.  See the License for the

+@rem specific language governing permissions and limitations

+@rem under the License.

+@rem ###################################################################

+@rem This script is used to start WebLogic Server.

+@rem

+@rem To create your own start script for your domain, you can initialize the

+@rem environment by calling %WL_HOME%/common/bin/commEnv.cmd.

+@rem

+@rem commEnv.cmd initializes following variables:

+@rem WL_HOME        - The root directory of your WebLogic installation.

+@rem JAVA_HOME      - Location of the version of Java used to start WebLogic

+@rem                  Server.

+@rem JAVA_VENDOR    - Vendor of the JVM (i.e. BEA, HP, IBM, Sun, etc.)

+@rem PATH           - JDK and WebLogic directories are added to system path.

+@rem WEBLOGIC_CLASSPATH

+@rem                - Classpath needed to start WebLogic Server.

+@rem JAVA_VM        - The java arg specifying the VM to run.  (i.e.

+@rem                  -server, -hotspot, etc.)

+@rem MEM_ARGS       - The variable to override the standard memory arguments

+@rem                  passed to java.

+@rem POINTBASE_HOME - Point Base home directory.

+@rem POINTBASE_CLASSPATH

+@rem                - Classpath needed to start PointBase.

+@rem Other variables used in this script include:

+@rem SERVER_NAME    - Name of the weblogic server.

+@rem ADMIN_URL      - If this variable is set, the server started will be a

+@rem                  managed server, and will look to the url specified (i.e.

+@rem                  http://localhost:7001) as the admin server.

+@rem WLS_USER       - cleartext user for server startup.

+@rem WLS_PW         - cleartext password for server startup.

+@rem PRODUCTION_MODE - Set to true for production mode servers, false for

+@rem                  development mode.

+@rem JAVA_OPTIONS   - Java command-line options for running the server. (These

+@rem                  will be tagged on to the end of the JAVA_VM and

+@rem                  MEM_ARGS)

+@rem

+@rem If you want to start the examples server using the JRockit JVM, edit

+@rem %WL_HOME%/common/bin/commEnv.cmd to specify the correct values for

+@rem JAVA_HOME and JAVA_VENDOR.

+@rem

+@rem For additional information, refer to the WebLogic Server Administration

+@rem Guide (http://e-docs.bea.com/wls/docs81/adminguide/startstop.html).

+@rem *************************************************************************

+

+echo off

+SETLOCAL

+

+set WL_HOME=C:\bea\weblogic81

+@rem Set Production Mode.  When this is set to true, the server starts up in

+@rem production mode.  When set to false, the server starts up in development

+@rem mode.  If it is not set, it will default to false.

+set PRODUCTION_MODE=

+

+@rem Set JAVA_VENDOR to java virtual machine you want to run on server side.

+set JAVA_VENDOR=Sun

+

+@rem Set JAVA_HOME to java virtual machine you want to run on server side.

+set JAVA_HOME=C:\bea\jdk141_05

+

+call "%WL_HOME%\common\bin\commEnv.cmd"

+

+@rem Set SERVER_NAME to the name of the server you wish to start up.

+set SERVER_NAME=examplesServer

+

+

+@rem Set JAVA_OPTIONS to the java flags you want to pass to the vm. i.e.:

+@rem set JAVA_OPTIONS=-Dweblogic.attribute=value -Djava.attribute=value

+set JAVA_OPTIONS=

+

+@rem Set MEM_ARGS to the memory args you want to pass to java.  For instance:

+@rem if "%JAVA_VENDOR%"=="BEA" set MEM_ARGS=-Xms32m -Xmx200m

+

+@rem *************************************************************************

+@rem PointBase and examples domain specific configuration

+set SAMPLES_HOME=C:\bea\weblogic81\samples

+set EXAMPLES_CONFIG=%SAMPLES_HOME%\domains\examples

+

+set EXAMPLES_HOME=%SAMPLES_HOME%\server\examples

+set EXAMPLES_BUILD=%EXAMPLES_HOME%\build

+

+set APPLICATIONS=%EXAMPLES_CONFIG%\applications

+set CLIENT_CLASSES=%EXAMPLES_BUILD%\clientclasses

+set SERVER_CLASSES=%EXAMPLES_BUILD%\serverclasses

+set COMMON_CLASSES=%EXAMPLES_BUILD%\common

+set EX_WEBAPP_CLASSES=%EXAMPLES_BUILD%\examplesWebApp\WEB-INF\classes

+

+@rem Add PointBase classes to the classpath, so we can start the examples

+@rem database.  Also add the examples directories specified above to the

+@rem classpath to be picked up by WebLogic Server.

+set CLASSPATH=C:\bea\weblogic81\server\lib\webservices.jar;%POINTBASE_CLASSPATH%;%CLIENT_CLASSES%;%SERVER_CLASSES%;%COMMON_CLASSES%;%CLIENT_CLASSES%\utils_common.jar

+

+@rem Start PointBase 4.4.

+start "PointBase" cmd /c ""%JAVA_HOME%\bin\java" com.pointbase.net.netServer /port:9092 /d:3 /pointbase.ini="pointbase.ini"" > "pointbase.log" 2>&1

+@rem *************************************************************************

+

+@rem Call WebLogic Server

+

+set CLASSPATH=%WEBLOGIC_CLASSPATH%;%CLASSPATH%

+

+@rem -=-=-=-=-=-=-=-=- Start OFBiz Classpath Here -=-=-=-=-=-=-=-=-

+<#list classpathDirs as dir>

+set CLASSPATH=%CLASSPATH%;${dir}

+</#list>

+<#list classpathJars as jar>

+set CLASSPATH=%CLASSPATH%;${jar}

+</#list>

+@rem -=-=-=-=-=-=-=-=- End OFBiz Classpath Here -=-=-=-=-=-=-=-=-

+

+"%JAVA_HOME%\bin\java" %JAVA_VM% %MEM_ARGS% %JAVA_OPTIONS% -Dweblogic.Name=%SERVER_NAME% -Dweblogic.ProductionModeEnabled=%PRODUCTION_MODE% -Djava.security.policy="%WL_HOME%\server\lib\weblogic.policy" -Dofbiz.home="${env.get("ofbiz.home")}" weblogic.Server

+

+ENDLOCAL

diff --git a/framework/appserver/templates/weblogic81/startOFBizServer.sh b/framework/appserver/templates/weblogic81/startOFBizServer.sh
new file mode 100755
index 0000000..8b5ff96
--- /dev/null
+++ b/framework/appserver/templates/weblogic81/startOFBizServer.sh
@@ -0,0 +1,167 @@
+#!/bin/sh
+#####################################################################
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+# ****************************************************************************
+# This script is used to start WebLogic Server.
+#
+# To create your own start script for your domain, you can initialize the
+# environment by calling $WL_HOME/common/bin/commEnv.sh. It sets following
+# variables:
+# WL_HOME        - The root directory of your WebLogic installation.
+# JAVA_HOME      - Location of the version of Java used to start WebLogic
+#                  Server.
+# JAVA_VENDOR    - Vendor of the JVM (i.e. BEA, HP, IBM, Sun, etc.)
+# PATH           - JDK and WebLogic directories are added to system path.
+# WEBLOGIC_CLASSPATH
+#                - Classpath needed to start WebLogic Server.
+# LD_LIBRARY_PATH, LIBPATH and SHLIB_PATH
+#                - Directories to locate native libraries.
+# JAVA_VM        - The java arg specifying the VM to run.  (i.e.
+#                  -server, -hotspot, etc.)
+# MEM_ARGS       - The variable to override the standard memory arguments
+#                  passed to java.
+# CLASSPATHSEP   - CLASSPATH deliminter.
+# PATHSEP        - Path deliminter.
+# POINTBASE_HOME - Point Base home directory.
+# POINTBASE_CLASSPATH
+#                - Classpath needed to start PointBase.
+#
+# Other variables used in this script include:
+# SERVER_NAME    - Name of the weblogic server.
+# ADMIN_URL      - If this variable is set, the server started will be a
+#                  managed server, and will look to the url specified (i.e.
+#                  http://localhost:7001) as the admin server.
+# WLS_USER       - cleartext user for server startup.
+# WLS_PW         - cleartext password for server startup.
+# PRODUCTION_MODE      - Set to true for production mode servers, false for
+#                  development mode.
+# JAVA_OPTIONS   - Java command-line options for running the server. (These
+#                  will be tagged on to the end of the JAVA_VM and MEM_ARGS)
+#
+# If you want to start the examples server using the JRockit JVM, edit
+# $WL_HOME/common/bin/commEnv.sh to specify the correct values for
+# JAVA_HOME and JAVA_VENDOR.
+#
+# For additional information, refer to the WebLogic Server Administration
+# Guide (http://e-docs.bea.com/wls/docs81/adminguide/startstop.html).
+# ****************************************************************************
+
+# set up WL_HOME, the root directory of your WebLogic installation
+WL_HOME="C:/bea/weblogic81"
+
+# set up common environment
+# Set Production Mode.  When this is set to true, the server starts up in
+# production mode.  When set to false, the server starts up in development
+# mode.  If it is not set, it will default to false.
+PRODUCTION_MODE=""
+
+# Set JAVA_VENDOR to java virtual machine you want to run on server side.
+JAVA_VENDOR="Sun"
+
+# Set JAVA_HOME to java virtual machine you want to run on server side.
+JAVA_HOME="C:/bea/jdk141_05"
+
+. "$WL_HOME/common/bin/commEnv.sh"
+
+# Set SERVER_NAME to the name of the server you wish to start up.
+SERVER_NAME=examplesServer
+
+# Set JAVA_VM to java virtual machine you want to run on server side.
+# JAVA_VM=""
+
+# Set JAVA_OPTIONS to the java flags you want to pass to the vm.  If there
+# are more than one, include quotes around them.  For instance:
+# JAVA_OPTIONS="-Dweblogic.attribute=value -Djava.attribute=value"
+JAVA_OPTIONS=""
+
+
+# ****************************************************************************
+# PointBase and examples domain specific configuration
+# Start PointBase 4.4.  PointBase will be killed when the server is shutdown.
+unset POINTBASE_PID
+
+
+SAMPLES_HOME="C:/bea/weblogic81/samples"
+EXAMPLES_CONFIG="$SAMPLES_HOME/domains/examples"
+
+EXAMPLES_HOME="$SAMPLES_HOME/server/examples"
+EXAMPLES_BUILD="$EXAMPLES_HOME/build"
+
+APPLICATIONS="$EXAMPLES_CONFIG/applications"
+CLIENT_CLASSES="$EXAMPLES_BUILD/clientclasses"
+SERVER_CLASSES="$EXAMPLES_BUILD/serverclasses"
+COMMON_CLASSES="$EXAMPLES_BUILD/common"
+EX_WEBAPP_CLASSES="$EXAMPLES_BUILD/examplesWebApp/WEB-INF/classes"
+
+<#noparse>
+CLASSPATH="${WL_HOME}/server/lib/webservices.jar${CLASSPATHSEP}${POINTBASE_CLASSPATH}${CLASSPATHSEP}${CLIENT_CLASSES}${CLASSPATHSEP}${SERVER_CLASSES}${CLASSPATHSEP}${COMMON_CLASSES}${CLASSPATHSEP}${CLIENT_CLASSES}/utils_common.jar"
+export CLASSPATH
+
+"$JAVA_HOME/bin/java" ${JAVA_OPTIONS} com.pointbase.net.netServer /port:9092 /d:3 /noconsole /pointbase.ini="pointbase.ini" > "pointbase.log" 2>&1 &
+POINTBASE_PID=${!}
+</#noparse>
+
+# trap SIGINT, this function is defined in commEnv.sh
+trapSIGINT
+
+echo
+echo "POINTBASE DATABASE HAS BEEN STARTED, IT'S PID IS $POINTBASE_PID!"
+echo
+#****************************************************************************
+
+
+# Reset number of open file descriptors in the current process
+# This function is defined in commEnv.sh
+resetFd
+
+# Start WebLogic server
+CLASSPATH="$WEBLOGIC_CLASSPATH$CLASSPATHSEP$CLASSPATH"
+
+# -=-=-=-=-=-=-=-=- Start OFBiz Classpath Here -=-=-=-=-=-=-=-=-
+<#list classpathDirs as dir>
+CLASSPATH="$CLASSPATH$CLASSPATHSEP${dir}"
+</#list>
+<#list classpathJars as jar>
+CLASSPATH="$CLASSPATH$CLASSPATHSEP${jar}"
+</#list>
+# -=-=-=-=-=-=-=-=- End OFBiz Classpath Here -=-=-=-=-=-=-=-=-
+
+echo CLASSPATH="$CLASSPATH"
+echo
+echo PATH="$PATH"
+echo
+echo "***************************************************"
+echo "*  To start WebLogic Server, use a username and   *"
+echo "*  password assigned to an admin-level user.  For *"
+echo "*  server administration, use the WebLogic Server *"
+echo "*  console at http://<hostname>:<port>/console    *"
+echo "***************************************************"
+
+
+"$JAVA_HOME/bin/java" $JAVA_VM $MEM_ARGS $JAVA_OPTIONS         \
+  -Dweblogic.Name=$SERVER_NAME                                 \
+  -Dweblogic.ProductionModeEnabled=$PRODUCTION_MODE            \
+  -Djava.security.policy="$WL_HOME/server/lib/weblogic.policy" \
+  -Dofbiz.home="${env.get("ofbiz.home")}"                      \
+   weblogic.Server
+
+
+if [ "$POINTBASE_PID" != "" ]; then
+  kill -9 $POINTBASE_PID
+  unset POINTBASE_PID
+fi
diff --git a/framework/base/config/ofbiz-containers.xml b/framework/base/config/ofbiz-containers.xml
index d53bfb1..bf2f53e 100644
--- a/framework/base/config/ofbiz-containers.xml
+++ b/framework/base/config/ofbiz-containers.xml
@@ -20,19 +20,267 @@
 
 <ofbiz-containers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/ofbiz-containers.xsd">
-
     <!-- load the ofbiz component container (always first) -->
-    <container name="component-container" loaders="main,rmi,pos,install" class="org.ofbiz.base.container.ComponentContainer"/>
+    <container name="component-container" class="org.ofbiz.base.container.ComponentContainer"/>
 
-    <container name="component-container-test" loaders="test" class="org.ofbiz.base.container.ComponentContainer">
-        <property name="ofbiz.instrumenterClassName" value="org.ofbiz.base.config.CoberturaInstrumenter"/>
-        <property name="ofbiz.instrumenterFile" value="runtime/logs/cobertura-components.dat"/>
+    <!-- load the cached classloader container (always second) -->
+    <container name="classloader-container" class="org.ofbiz.base.container.ClassLoaderContainer"/>
+
+    <container name="commons-vfs-container" class="org.ofbiz.commons.vfs.CommonsVfsContainer"/>
+    <container name="webslinger-container" class="org.ofbiz.webslinger.WebslingerContainer"/>
+
+    <!-- load JNDI/JOTM; this is no longer needed, leaving this in for now just in case someone wants to drop in JOTM from the specialized directory
+    <container name="jotm-container" class="org.ofbiz.jotm.container.JotmContainer">
+        <property name="jndi-config" value="iiop.properties"/>
+    </container>
+    -->
+
+    <!-- load the naming (JNDI) server -->
+    <container name="naming-container" class="org.ofbiz.base.container.NamingServiceContainer">
+        <property name="host" value="0.0.0.0"/>
+        <property name="port" value="1099"/>
     </container>
 
-    <container name="component-container-limited" loaders="limited" class="org.ofbiz.base.container.ComponentContainer">
-        <property name="update-classpath" value="false"/>
+    <!-- RMI Service Dispatcher -->
+    <container name="rmi-dispatcher" class="org.ofbiz.service.rmi.RmiServiceContainer">
+        <property name="bound-name" value="RMIDispatcher"/>
+        <property name="bound-host" value="127.0.0.1"/>
+        <property name="bound-port" value="1099"/>
+        <property name="delegator-name" value="default"/>
+        <property name="client-factory" value="org.ofbiz.service.rmi.socket.ssl.SSLClientSocketFactory"/>
+        <property name="server-factory" value="org.ofbiz.service.rmi.socket.ssl.SSLServerSocketFactory"/>
+        <property name="ssl-keystore" value="framework/base/config/ofbizrmi.jks"/>
+        <property name="ssl-keystore-type" value="JKS"/>
+        <property name="ssl-keystore-pass" value="changeit"/>
+        <property name="ssl-keystore-alias" value="rmissl"/>
+        <property name="ssl-client-auth" value="false"/>
     </container>
 
-    <container name="component-container" loaders="testlist" class="org.ofbiz.base.container.JustLoadComponentsContainer"/>
+    <!-- JavaMail Listener Container - Triggers MCA Rules -->
+    <!-- if delete-mail is set to true, will delete messages after fetching them. otherwise, will try to mark them as seen
+        mail.store.protocol supports both imap and pop3, but pop3 will not be able to mark messages as seen, so you would need to delete them-->
+    <!-- To use the mail listerner just uncomment and go...
+    <container name="javamail-container" class="org.ofbiz.service.mail.JavaMailContainer">
+        <property name="delegator-name" value="default"/>
+        <property name="dispatcher-name" value="JavaMailDispatcher"/>
+        <property name="run-as-user" value="system"/>
+        <property name="poll-delay" value="300000"/>
+        <property name="delete-mail" value="false"/>
+        <property name="maxSize" value="100000"/>
+        <property name="default-listener" value="store-listener">
+        <property name="mail.store.protocol" value="imap"/>
+        <property name="mail.host" value="[host]"/>
+        <property name="mail.user" value="[user]"/>
+        <property name="mail.pass" value="[pass]"/>
+        <property name="mail.debug" value="false"/>
+        </property>
+    </container>
+    -->
 
+    <!-- load Shark Workflow Engine -->
+    <!-- NOTE: before uncommenting this please see the instructions in the ofbiz/OPTIONAL_LIBRARIES file.
+    <container name="shark-container" class="org.ofbiz.shark.container.SharkContainer">
+        <property name="engine-name" value="Shark"/>
+        <property name="delegator-name" value="default"/>
+        <property name="dispatcher-name" value="WFDispatcher"/>
+        <property name="admin-user" value="system"/>
+        <property name="admin-pass" value="ofbiz"/>
+        <property name="iiop-host" value="127.0.0.1"/>
+        <property name="iiop-port" value="2000"/>
+    </container>
+    -->
+
+    <!-- load catalina (tomcat) and all web applications -->
+    <!-- TODO: switch to webslinger, for per-site logging
+    <container name="catalina-container" class="org.ofbiz.webslinger.WebslingerCatalinaContainer">
+    -->
+
+    <!-- Load embedded Jackrabbit content repository. Since this container depends
+         upon JNDI, it must be started after the naming-container container.-->
+    <container name="jcr-container" class="org.ofbiz.jcr.loader.JCRContainer">
+        <property name="configFilePath" value="framework/jcr/config/jcr-config.xml"/>
+        <property name="removeOnShutdown" value="false"/>
+    </container>
+
+    <container name="catalina-container" class="org.ofbiz.catalina.container.CatalinaContainer">
+        <!-- static configuration for tomcat -->
+        <property name="delegator-name" value="default"/>
+        <property name="use-naming" value="false"/>
+        <property name="debug" value="0"/>
+        <property name="catalina-runtime-home" value="runtime/catalina"/>
+        <property name="apps-context-reloadable" value="false"/>
+        <property name="apps-cross-context" value="false"/>
+        <property name="apps-distributable" value="false"/>
+        <!-- one or more tomcat engines (servers); map to this + host -->
+        <property name="default-server" value="engine">
+            <property name="default-host" value="0.0.0.0"/>
+            <property name="jvm-route" value="jvm1"/>
+            <property name="access-log-pattern">
+                <property-value>%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"</property-value>
+            </property>
+            <property name="access-log-resolve" value="true"/>
+            <property name="access-log-rotate" value="true"/>
+            <property name="access-log-prefix" value="access_log."/>
+            <property name="access-log-dir" value="runtime/logs"/>
+            <!-- uncomment for cluster support
+            <property name="default-server-cluster" value="cluster">
+                <property name="rep-valve-filter">
+                <property-value>.*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;.*\.png;.*\.css;.*\.ico;.*\.htc;</property-value>
+                </property>
+                <property name="manager-class" value="org.apache.catalina.ha.session.DeltaManager"/>
+                <property name="debug" value="5"/>
+                <property name="replication-mode" value="org.apache.catalina.tribes.transport.bio.PooledMultiSender"/>
+                <property name="tcp-listen-host" value="auto"/>
+                <property name="tcp-listen-port" value="4001"/>
+                <property name="tcp-sector-timeout" value="100"/>
+                <property name="tcp-thread-count" value="6"/>
+                <property name="mcast-bind-addr" value="192.168.2.1"/>
+                <property name="mcast-addr" value="228.0.0.4"/>
+                <property name="mcast-port" value="45564"/>
+                <property name="mcast-freq" value="500"/>
+                <property name="mcast-drop-time" value="3000"/>
+            </property>
+            -->
+            <!-- <property name="ssl-accelerator-port" value="8443"/> -->
+            <property name="enable-cross-subdomain-sessions" value="false"/>
+        </property>
+        <!-- all connectors support type, host, port, enable-lookups -->
+        <property name="ajp-connector" value="connector">
+            <!-- see http://jakarta.apache.org/tomcat/tomcat-5.5-doc/config/ajp.html for reference -->
+            <property name="allowTrace" value="false"/>
+            <property name="emptySessionPath" value="false"/>
+            <property name="enableLookups" value="false"/>
+            <property name="maxPostSize" value="2097152"/>
+            <property name="protocol" value="AJP/1.3"/>
+            <property name="proxyName" value=""/>
+            <property name="proxyPort" value=""/>
+            <property name="redirectPort" value=""/>
+            <property name="scheme" value="http"/>
+            <property name="secure" value="false"/>
+            <property name="URIEncoding" value="UTF-8"/>
+            <property name="useBodyEncodingForURI" value="false"/>
+            <property name="xpoweredBy" value="true"/>
+            <!-- AJP/13 connector attributes -->
+            <property name="address" value="0.0.0.0"/>
+            <property name="backlog" value="10"/>
+            <property name="maxSpareThreads" value="50"/>
+            <property name="maxThreads" value="200"/>
+            <property name="minSpareThreads" value="4"/>
+            <property name="port" value="8009"/>
+            <property name="tcpNoDelay" value="true"/>
+            <property name="soTimeout" value="60000"/>
+            <property name="tomcatAuthentication" value="true"/>
+        </property>
+        <property name="http-connector" value="connector">
+            <!-- see http://jakarta.apache.org/tomcat/tomcat-5.5-doc/config/http.html for reference -->
+            <property name="allowTrace" value="false"/>
+            <property name="emptySessionPath" value="false"/>
+            <property name="enableLookups" value="false"/>
+            <property name="maxPostSize" value="2097152"/>
+            <property name="protocol" value="HTTP/1.1"/>
+            <property name="proxyName" value=""/>
+            <property name="proxyPort" value=""/>
+            <property name="redirectPort" value=""/>
+            <property name="scheme" value="http"/>
+            <property name="secure" value="false"/>
+            <property name="URIEncoding" value="UTF-8"/>
+            <property name="useBodyEncodingForURI" value="false"/>
+            <property name="xpoweredBy" value="true"/>
+            <!-- HTTP connector attributes -->
+            <property name="acceptCount" value="10"/>
+            <property name="address" value="0.0.0.0"/>
+            <property name="bufferSize" value="2048"/>
+            <property name="compressableMimeType" value="text/html,text/xml,text/plain"/>
+            <property name="compression" value="on"/>
+            <property name="connectionLinger" value="-1"/>
+            <property name="connectionTimeout" value="60000"/>
+            <property name="disableUploadTimeout" value="false"/>
+            <property name="maxHttpHeaderSize" value="4096"/>
+            <property name="maxKeepAliveRequests" value="100"/>
+            <property name="maxSpareThreads" value="50"/>
+            <property name="maxThreads" value="100"/>
+            <property name="minSpareThreads" value="4"/>
+            <property name="noCompressionUserAgents" value=""/>
+            <property name="port" value="8080"/>
+            <property name="restrictedUserAgents" value=""/>
+            <property name="server" value=""/>
+            <property name="socketBuffer" value="9000"/>
+            <property name="strategy" value="lf"/>
+            <property name="tcpNoDelay" value="true"/>
+            <property name="threadPriority" value="java.lang.Thread#NORM_PRIORITY"/>
+        </property>
+        <property name="https-connector" value="connector">
+            <!-- see http://jakarta.apache.org/tomcat/tomcat-5.5-doc/config/http.html for reference -->
+            <property name="allowTrace" value="false"/>
+            <property name="emptySessionPath" value="false"/>
+            <property name="enableLookups" value="false"/>
+            <property name="maxPostSize" value="2097152"/>
+            <property name="protocol" value="HTTP/1.1"/>
+            <property name="proxyName" value=""/>
+            <property name="proxyPort" value=""/>
+            <property name="redirectPort" value=""/>
+            <property name="scheme" value="https"/>
+            <property name="secure" value="true"/>
+            <property name="URIEncoding" value="UTF-8"/>
+            <property name="useBodyEncodingForURI" value="false"/>
+            <property name="xpoweredBy" value="true"/>
+            <!-- HTTP connector attributes -->
+            <property name="acceptCount" value="10"/>
+            <property name="address" value="0.0.0.0"/>
+            <property name="bufferSize" value="2048"/>
+            <property name="compressableMimeType" value="text/html,text/xml,text/plain"/>
+            <property name="compression" value="on"/>
+            <property name="connectionLinger" value="-1"/>
+            <property name="connectionTimeout" value="60000"/>
+            <property name="disableUploadTimeout" value="false"/>
+            <property name="maxHttpHeaderSize" value="4096"/>
+            <property name="maxKeepAliveRequests" value="100"/>
+            <property name="maxSpareThreads" value="50"/>
+            <property name="maxThreads" value="100"/>
+            <property name="minSpareThreads" value="4"/>
+            <property name="noCompressionUserAgents" value=""/>
+            <property name="port" value="8443"/>
+            <property name="restrictedUserAgents" value=""/>
+            <property name="server" value=""/>
+            <property name="socketBuffer" value="9000"/>
+            <property name="strategy" value="lf"/>
+            <property name="tcpNoDelay" value="true"/>
+            <property name="threadPriority" value="java.lang.Thread#NORM_PRIORITY"/>
+            <!-- SSL connector attributes -->
+            <property name="sSLImplementation" value="org.ofbiz.catalina.container.SSLImpl"/>
+            <property name="algorithm" value="SunX509"/>
+            <!-- the clientAuth to "want" in order to receive certs from the client;
+                note that this isn't set this way by default because with certain browsers
+                (like Safari) it breaks access via HTTPS, so until that problem is fixed
+                the default will be false -->
+            <property name="clientAuth" value="false"/>
+            <property name="keystoreFile" value="framework/base/config/ofbizssl.jks"/>
+            <property name="keystorePass" value="changeit"/>
+            <property name="keystoreType" value="JKS"/>
+            <property name="sslProtocol" value="TLS"/>
+            <property name="ciphers" value=""/>
+        </property>
+    </container>
+
+    <!-- load the BIRT container -->
+    <container name="birt-container" class="org.ofbiz.birt.container.BirtContainer">
+        <property name="delegator-name" value="default"/>
+        <property name="dispatcher-name" value="birt-dispatcher"/>
+        <property name="delegator-group-helper-name" value="org.ofbiz"/>
+    </container>
+
+    <!-- load BeanShell remote telnet server -->
+    <!-- Commented out by default for security reasons -->
+    <!-- the port below and port-1 will be opened by Beanshell -->
+    <!--container name="beanshell-container" class="org.ofbiz.base.container.BeanShellContainer">
+        <property name="telnet-port" value="9990"/>
+        <property name="app-name" value="OFBiz"/>
+    </container-->
+
+    <!-- load Groovy remote telnet server -->
+    <!-- Commented out by default for security reasons -->
+    <!-- the port below will be opened by Groovy -->
+    <!--container name="groovyshell-container" class="org.ofbiz.base.container.GroovyShellContainer">
+        <property name="telnet-port" value="9991"/>
+    </container-->
 </ofbiz-containers>
diff --git a/framework/base/config/test-containers.xml b/framework/base/config/test-containers.xml
new file mode 100644
index 0000000..d0207d2
--- /dev/null
+++ b/framework/base/config/test-containers.xml
@@ -0,0 +1,237 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<ofbiz-containers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/ofbiz-containers.xsd">
+    <!-- load the ofbiz component container (always first) -->
+    <container name="component-container" class="org.ofbiz.base.container.ComponentContainer">
+        <property name="ofbiz.instrumenterClassName" value="org.ofbiz.base.config.CoberturaInstrumenter"/>
+        <property name="ofbiz.instrumenterFile" value="runtime/logs/cobertura-components.dat"/>
+    </container>
+
+    <!-- load the cached classloader container (always second) -->
+    <container name="classloader-container" class="org.ofbiz.base.container.ClassLoaderContainer"/>
+
+    <!-- load the naming (JNDI) server -->
+    <container name="naming-container" class="org.ofbiz.base.container.NamingServiceContainer">
+        <property name="port" value="1099"/>
+    </container>
+
+    <!-- RMI Service Dispatcher -->
+    <container name="rmi-dispatcher" class="org.ofbiz.service.rmi.RmiServiceContainer">
+        <property name="bound-name" value="RMIDispatcher"/>
+        <property name="bound-host" value="127.0.0.1"/>
+        <property name="bound-port" value="1099"/>
+        <property name="delegator-name" value="test"/>
+        <property name="client-factory" value="org.ofbiz.service.rmi.socket.ssl.SSLClientSocketFactory"/>
+        <property name="server-factory" value="org.ofbiz.service.rmi.socket.ssl.SSLServerSocketFactory"/>
+        <property name="ssl-keystore" value="framework/base/config/ofbizrmi.jks"/>
+        <property name="ssl-keystore-type" value="JKS"/>
+        <property name="ssl-keystore-pass" value="changeit"/>
+        <property name="ssl-keystore-alias" value="rmissl"/>
+        <property name="ssl-client-auth" value="true"/>
+    </container>
+
+    <!-- load Shark Workflow Engine -->
+    <!-- NOTE: before uncommenting this please see the instructions in the ofbiz/OPTIONAL_LIBRARIES file.
+    <container name="shark-container" class="org.ofbiz.shark.container.SharkContainer">
+        <property name="engine-name" value="Shark"/>
+        <property name="delegator-name" value="test"/>
+        <property name="dispatcher-name" value="WFDispatcher"/>
+        <property name="admin-user" value="system"/>
+        <property name="admin-pass" value="ofbiz"/>
+        <property name="iiop-host" value="127.0.0.1"/>
+        <property name="iiop-port" value="2000"/>
+    </container>
+     -->
+
+    <!-- Load embedded Jackrabbit content repository. Since this container depends
+    upon JNDI, it must be started after the naming-container container.-->
+    <container name="jcr-container" class="org.ofbiz.jcr.loader.JCRContainer">
+        <property name="configFilePath" value="framework/jcr/config/jcr-test-config.xml"/>
+        <property name="removeOnShutdown" value="true"/>
+    </container>
+
+    <!-- load catalina (tomcat) and all web applications -->
+    <container name="catalina-container" class="org.ofbiz.catalina.container.CatalinaContainer">
+        <!-- static configuration for tomcat -->
+        <property name="delegator-name" value="default"/>
+        <property name="use-naming" value="false"/>
+        <property name="debug" value="0"/>
+        <property name="catalina-runtime-home" value="runtime/catalina"/>
+        <property name="apps-context-reloadable" value="false"/>
+        <property name="apps-cross-context" value="false"/>
+        <property name="apps-distributable" value="false"/>
+        <!-- one or more tomcat engines (servers); map to this + host -->
+        <property name="default-server" value="engine">
+            <property name="default-host" value="0.0.0.0"/>
+            <property name="jvm-route" value="jvm1"/>
+            <property name="access-log-pattern">
+                <property-value>%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"</property-value>
+            </property>
+            <property name="access-log-resolve" value="true"/>
+            <property name="access-log-rotate" value="true"/>
+            <property name="access-log-prefix" value="access_log."/>
+            <property name="access-log-dir" value="runtime/logs"/>
+            <property name="enable-request-dump" value="false"/>
+            <!-- uncomment for cluster support
+            <property name="default-server-cluster" value="cluster">
+                <property name="rep-valve-filter">
+                <property-value>.*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;.*\.png;.*\.css;.*\.ico;.*\.htc;</property-value>
+                </property>
+                <property name="manager-class" value="org.apache.catalina.cluster.session.DeltaManager"/>
+                <property name="debug" value="5"/>
+                <property name="replication-mode" value="org.apache.catalina.tribes.transport.bio.PooledMultiSender"/>
+                <property name="tcp-listen-host" value="auto"/>
+                <property name="tcp-listen-port" value="4001"/>
+                <property name="tcp-sector-timeout" value="100"/>
+                <property name="tcp-thread-count" value="6"/>
+                <property name="mcast-bind-addr" value="192.168.2.1"/>
+                <property name="mcast-addr" value="224.0.0.1"/>
+                <property name="mcast-port" value="45564"/>
+                <property name="mcast-freq" value="500"/>
+                <property name="mcast-drop-time" value="3000"/>
+            </property>
+            -->
+            <!-- <property name="ssl-accelerator-port" value="8443"/> -->
+        </property>
+        <!-- all connectors support type, host, port, enable-lookups -->
+        <property name="ajp-connector" value="connector">
+            <!-- see http://jakarta.apache.org/tomcat/tomcat-5.5-doc/config/ajp.html for reference -->
+            <property name="allowTrace" value="false"/>
+            <property name="emptySessionPath" value="false"/>
+            <property name="enableLookups" value="false"/>
+            <property name="maxPostSize" value="2097152"/>
+            <property name="protocol" value="AJP/1.3"/>
+            <property name="proxyName" value=""/>
+            <property name="proxyPort" value=""/>
+            <property name="redirectPort" value=""/>
+            <property name="scheme" value="http"/>
+            <property name="secure" value="false"/>
+            <property name="URIEncoding" value="UTF-8"/>
+            <property name="useBodyEncodingForURI" value="false"/>
+            <property name="xpoweredBy" value="true"/>
+            <!-- AJP/13 connector attributes -->
+            <property name="address" value="0.0.0.0"/>
+            <property name="backlog" value="10"/>
+            <property name="maxSpareThreads" value="50"/>
+            <property name="maxThreads" value="200"/>
+            <property name="minSpareThreads" value="4"/>
+            <property name="port" value="8009"/>
+            <property name="tcpNoDelay" value="true"/>
+            <property name="soTimeout" value="60000"/>
+            <property name="tomcatAuthentication" value="true"/>
+        </property>
+        <property name="http-connector" value="connector">
+            <!-- see http://jakarta.apache.org/tomcat/tomcat-5.5-doc/config/http.html for reference -->
+            <property name="allowTrace" value="false"/>
+            <property name="emptySessionPath" value="false"/>
+            <property name="enableLookups" value="false"/>
+            <property name="maxPostSize" value="2097152"/>
+            <property name="protocol" value="HTTP/1.1"/>
+            <property name="proxyName" value=""/>
+            <property name="proxyPort" value=""/>
+            <property name="redirectPort" value=""/>
+            <property name="scheme" value="http"/>
+            <property name="secure" value="false"/>
+            <property name="URIEncoding" value="UTF-8"/>
+            <property name="useBodyEncodingForURI" value="false"/>
+            <property name="xpoweredBy" value="true"/>
+            <!-- HTTP connector attributes -->
+            <property name="acceptCount" value="10"/>
+            <property name="address" value="0.0.0.0"/>
+            <property name="bufferSize" value="2048"/>
+            <property name="compressableMimeType" value="text/html,text/xml,text/plain"/>
+            <property name="compression" value="on"/>
+            <property name="connectionLinger" value="-1"/>
+            <property name="connectionTimeout" value="60000"/>
+            <property name="disableUploadTimeout" value="false"/>
+            <property name="maxHttpHeaderSize" value="4096"/>
+            <property name="maxKeepAliveRequests" value="100"/>
+            <property name="maxSpareThreads" value="50"/>
+            <property name="maxThreads" value="100"/>
+            <property name="minSpareThreads" value="4"/>
+            <property name="noCompressionUserAgents" value=""/>
+            <property name="port" value="8080"/>
+            <property name="restrictedUserAgents" value=""/>
+            <property name="server" value=""/>
+            <property name="socketBuffer" value="9000"/>
+            <property name="strategy" value="lf"/>
+            <property name="tcpNoDelay" value="true"/>
+            <property name="threadPriority" value="java.lang.Thread#NORM_PRIORITY"/>
+        </property>
+        <property name="https-connector" value="connector">
+            <!-- see http://jakarta.apache.org/tomcat/tomcat-5.5-doc/config/http.html for reference -->
+            <property name="allowTrace" value="false"/>
+            <property name="emptySessionPath" value="false"/>
+            <property name="enableLookups" value="false"/>
+            <property name="maxPostSize" value="2097152"/>
+            <property name="protocol" value="HTTP/1.1"/>
+            <property name="proxyName" value=""/>
+            <property name="proxyPort" value=""/>
+            <property name="redirectPort" value=""/>
+            <property name="scheme" value="https"/>
+            <property name="secure" value="true"/>
+            <property name="URIEncoding" value="UTF-8"/>
+            <property name="useBodyEncodingForURI" value="false"/>
+            <property name="xpoweredBy" value="true"/>
+            <!-- HTTP connector attributes -->
+            <property name="acceptCount" value="10"/>
+            <property name="address" value="0.0.0.0"/>
+            <property name="bufferSize" value="2048"/>
+            <property name="compressableMimeType" value="text/html,text/xml,text/plain"/>
+            <property name="compression" value="on"/>
+            <property name="connectionLinger" value="-1"/>
+            <property name="connectionTimeout" value="60000"/>
+            <property name="disableUploadTimeout" value="false"/>
+            <property name="maxHttpHeaderSize" value="4096"/>
+            <property name="maxKeepAliveRequests" value="100"/>
+            <property name="maxSpareThreads" value="50"/>
+            <property name="maxThreads" value="100"/>
+            <property name="minSpareThreads" value="4"/>
+            <property name="noCompressionUserAgents" value=""/>
+            <property name="port" value="8443"/>
+            <property name="restrictedUserAgents" value=""/>
+            <property name="server" value=""/>
+            <property name="socketBuffer" value="9000"/>
+            <property name="strategy" value="lf"/>
+            <property name="tcpNoDelay" value="true"/>
+            <property name="threadPriority" value="java.lang.Thread#NORM_PRIORITY"/>
+            <!-- SSL connector attributes -->
+            <property name="sSLImplementation" value="org.ofbiz.catalina.container.SSLImpl"/>
+            <property name="algorithm" value="SunX509"/>
+            <property name="clientAuth" value="want"/>
+            <property name="keystoreFile" value="framework/base/config/ofbizssl.jks"/>
+            <property name="keystorePass" value="changeit"/>
+            <property name="keystoreType" value="JKS"/>
+            <property name="sslProtocol" value="TLS"/>
+            <property name="ciphers" value=""/>
+        </property>
+    </container>
+
+    <!-- load JUnit test container -->
+    <!-- this is now run through the new testtools stuff
+    <container name="junit-container" class="org.ofbiz.base.container.JunitContainer">
+        <property name="base-test" value="org.ofbiz.base.test.BaseUnitTests"/>
+    </container>
+    -->
+
+    <container name="testtools-container" class="org.ofbiz.testtools.TestRunContainer"/>
+</ofbiz-containers>
diff --git a/framework/base/lib/commons/commons-io-1.4.jar b/framework/base/lib/commons/commons-io-1.4.jar
new file mode 100644
index 0000000..133dc6c
--- /dev/null
+++ b/framework/base/lib/commons/commons-io-1.4.jar
Binary files differ
diff --git a/framework/base/lib/jcl-over-slf4j-1.6.4.jar b/framework/base/lib/jcl-over-slf4j-1.6.4.jar
new file mode 100644
index 0000000..3ddc1d1
--- /dev/null
+++ b/framework/base/lib/jcl-over-slf4j-1.6.4.jar
Binary files differ
diff --git a/framework/base/lib/log4j-over-slf4j-1.6.4.jar b/framework/base/lib/log4j-over-slf4j-1.6.4.jar
new file mode 100644
index 0000000..d757d95
--- /dev/null
+++ b/framework/base/lib/log4j-over-slf4j-1.6.4.jar
Binary files differ
diff --git a/framework/build.xml b/framework/build.xml
index aeb5c39..cc3547b 100644
--- a/framework/build.xml
+++ b/framework/build.xml
@@ -23,7 +23,7 @@
         files="start/build.xml,base/build.xml,sql/build.xml,
                entity/build.xml,geronimo/build.xml,
                catalina/build.xml,
-               security/build.xml,service/build.xml,entityext/build.xml,
+               security/build.xml,service/build.xml,jcr/build.xml,entityext/build.xml,
                bi/build.xml,minilang/build.xml,
                webapp/build.xml,widget/build.xml,
                common/build.xml,datafile/build.xml,
diff --git a/framework/component-load.xml b/framework/component-load.xml
index 0ecfd23..2e4443d 100644
--- a/framework/component-load.xml
+++ b/framework/component-load.xml
@@ -31,6 +31,7 @@
     <load-component component-location="service"/>
     <load-component component-location="catalina"/>
     <load-component component-location="entityext"/>
+    <load-component component-location="jcr"/>
     <load-component component-location="bi"/>
     <load-component component-location="webapp"/>
     <load-component component-location="widget"/>
diff --git a/framework/example/build.xml b/framework/example/build.xml
new file mode 100644
index 0000000..70ec24c
--- /dev/null
+++ b/framework/example/build.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<project name="OFBiz - Example Component" default="jar" basedir=".">
+    <import file="../../common.xml"/>
+
+    <!-- ================================================================== -->
+    <!-- Initialization of all property settings                            -->
+    <!-- ================================================================== -->
+
+    <property environment="env"/>
+    <property name="desc" value="Example Component"/>
+    <property name="name" value="ofbiz-example"/>
+    <property name="ofbiz.home.dir" value="../.."/>
+    <property name="src.dir" value="src"/>
+    <property name="dtd.dir" value="dtd"/>
+    <property name="lib.dir" value="lib"/>
+    <property name="build.dir" value="build"/>
+
+    <path id="local.class.path">
+        <fileset dir="${lib.dir}" includes="*.jar"/>
+        <fileset dir="../../framework/base/lib" includes="*.jar"/>
+        <fileset dir="../../framework/base/lib/commons" includes="*.jar"/>
+        <fileset dir="../../framework/base/lib/j2eespecs" includes="*.jar"/>
+        <fileset dir="../../framework/base/lib/scripting" includes="*.jar"/>
+        <fileset dir="../../framework/base/build/lib" includes="*.jar"/>
+        <fileset dir="../../framework/entity/lib" includes="*.jar"/>
+        <fileset dir="../../framework/entity/build/lib" includes="*.jar"/>
+        <fileset dir="../../framework/security/build/lib" includes="*.jar"/>
+        <fileset dir="../../framework/service/lib" includes="*.jar"/>
+        <fileset dir="../../framework/service/build/lib" includes="*.jar"/>
+        <fileset dir="../../framework/minilang/build/lib" includes="*.jar"/>
+        <fileset dir="../../framework/widget/build/lib" includes="*.jar"/>
+        <fileset dir="../../framework/webapp/lib" includes="*.jar"/>
+        <fileset dir="../../framework/webapp/build/lib" includes="*.jar"/>
+        <fileset dir="../../framework/common/build/lib" includes="*.jar"/>
+        <fileset dir="../../framework/jcr/lib" includes="*.jar"/>
+        <fileset dir="../../framework/jcr/build/lib" includes="*.jar"/>
+    </path>
+</project>
diff --git a/framework/example/config/ExampleEntityLabels.xml b/framework/example/config/ExampleEntityLabels.xml
new file mode 100644
index 0000000..ab02887
--- /dev/null
+++ b/framework/example/config/ExampleEntityLabels.xml
@@ -0,0 +1,199 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you 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.
+-->
+<resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <property key="ExampleFeatureApplType.description.DESIRED">
+        <value xml:lang="en">Desired</value>
+        <value xml:lang="fr">Désiré</value>
+        <value xml:lang="it">Desiderato</value>
+        <value xml:lang="th">ความต้องการ</value>
+        <value xml:lang="zh">期望的</value>
+    </property>
+    <property key="ExampleFeatureApplType.description.NOT_ALLOWED">
+        <value xml:lang="en">Not Allowed</value>
+        <value xml:lang="fr">Non laissé</value>
+        <value xml:lang="it">Non Permesso</value>
+        <value xml:lang="th">ไม่อนุญาต</value>
+        <value xml:lang="zh">不允许</value>
+    </property>
+    <property key="ExampleFeatureApplType.description.REQUIRED">
+        <value xml:lang="en">Required</value>
+        <value xml:lang="fr">Requis</value>
+        <value xml:lang="it">Richiesto</value>
+        <value xml:lang="th">ความต้องการ</value>
+        <value xml:lang="zh">必须的</value>
+    </property>
+    <property key="ExampleType.description.CONTRIVED">
+        <value xml:lang="en">Contrived</value>
+        <value xml:lang="fr">Arrangé</value>
+        <value xml:lang="it">Inventato</value>
+        <value xml:lang="th">เป็นไปตามที่วางแผนไว้</value>
+        <value xml:lang="zh">人为的</value>
+    </property>
+    <property key="ExampleType.description.INSPIRED">
+        <value xml:lang="en">Inspired</value>
+        <value xml:lang="fr">Inspiré</value>
+        <value xml:lang="it">Ispirato</value>
+        <value xml:lang="th">ยอดเยี่ยม</value>
+        <value xml:lang="zh">受启发的</value>
+    </property>
+    <property key="ExampleType.description.MADE_UP">
+        <value xml:lang="en">Made Up</value>
+        <value xml:lang="fr">Composé</value>
+        <value xml:lang="it">Composto</value>
+        <value xml:lang="th">ทำขึ้น</value>
+        <value xml:lang="zh">制定</value>
+    </property>
+    <!-- Example entity labels -->
+    <property key="ExampleType.description.REAL_WORLD">
+        <value xml:lang="en">Real World</value>
+        <value xml:lang="fr">Monde réel</value>
+        <value xml:lang="it">Mondo Reale</value>
+        <value xml:lang="th">สภาพที่เป็นจริง</value>
+        <value xml:lang="zh">真实世界</value>
+    </property>
+
+    <!-- Entity descriptions. The Web Tools component will use these properties
+        for online documentation. Entity description property keys have the form:
+        EntityDescription.[entityname].
+    -->
+    <property key="EntityDescription.Example">
+        <value xml:lang="en">Example Entity</value>
+    </property>
+
+    <!-- Entity field descriptions. The Web Tools component will use these properties
+        for online documentation. Field description property keys have two forms:
+        FieldDescription.[fieldname] - will be used for all fields of that name
+        FieldDescription.[entityname].[fieldname] - will be used for the specified
+        entity field
+    -->
+
+    <property key="FieldDescription.Example.exampleId">
+        <value xml:lang="en">A unique Example ID. If you don't assign an ID, one will be generated automatically</value>
+        <value xml:lang="fr">Une réf. unique d'exemple. Si vous n'entrez pas de réf., elle sera générée automatiquement</value>
+        <value xml:lang="it">Un codice esempio univoco. Se tu non assegni un codice, uno verrà generato automaticamente</value>
+        <value xml:lang="th">รหัสตัวอย่าง ถ้าไม่มีการกำหนดรหัส จะต้องมีการสร้างขึ้นอัตโมัติ</value>
+        <value xml:lang="zh">一个唯一的样例表示。如果你没有指定一个标识,那么会自动生成一个</value>
+    </property>
+    <property key="FieldDescription.ExampleItem.exampleItemSeqId">
+        <value xml:lang="en">A unique Example Item sequence ID. If you don't assign an ID, one will be generated automatically</value>
+        <value xml:lang="fr">Une réf. unique d'article exemple. Si vous n'entrez pas de réf., elle sera générée automatiquement</value>
+        <value xml:lang="it">Un codice riga esempio univoco. Se tu non assegni un codice, uno verrà generato automaticamente</value>
+        <value xml:lang="th">รหัสตัวอย่างสินค้า ถ้าไม่มีการกำหนดรหัส จะต้องมีการสร้างขึ้นอัตโมัติ</value>
+        <value xml:lang="zh">一个唯一的样例明细序号。如果你没有指定一个标识,那么会自动生成一个</value>
+    </property>
+    <property key="FieldDescription.ExampleType.exampleTypeId">
+        <value xml:lang="en">A unique Example Type ID. If you don't assign an ID, one will be generated automatically</value>
+        <value xml:lang="fr">Une réf. unique de type exemple. Si vous n'entrez pas de réf., elle sera générée automatiquement</value>
+        <value xml:lang="it">Un tipo esempio univoco. Se tu non assegni un codice, uno verrà generato automaticamente</value>
+        <value xml:lang="th">รหัสตัวอย่างประเภท ถ้าไม่มีการกำหนดรหัส จะต้องมีการสร้างขึ้นอัตโมัติ</value>
+        <value xml:lang="zh">一个唯一的样例类型序号。如果你没有指定一个标识,那么会自动生成一个</value>
+    </property>
+    <property key="FieldDescription.Example.exampleTypeId">
+        <value xml:lang="en">The type of Example.</value>
+        <value xml:lang="fr">Le type de l'exemple.</value>
+    </property>
+    <property key="FieldDescription.amount">
+        <value xml:lang="de">Betrag</value>
+        <value xml:lang="en">Amount</value>
+        <value xml:lang="fr">Montant</value>
+        <value xml:lang="it">Importo</value>
+        <value xml:lang="ro">Import</value>
+        <value xml:lang="th">จำนวน</value>
+        <value xml:lang="zh">金额</value>
+    </property>
+    <property key="FieldDescription.anotherDate">
+        <value xml:lang="en">Another Date</value>
+        <value xml:lang="fr">Une autre date</value>
+        <value xml:lang="it">Altra Data</value>
+        <value xml:lang="th">วันที่อื่น ๆ</value>
+        <value xml:lang="zh">另一个日期</value>
+    </property>
+    <property key="FieldDescription.anotherText">
+        <value xml:lang="en">Another Text</value>
+        <value xml:lang="fr">Une autre texte</value>
+        <value xml:lang="it">Altro Testo</value>
+        <value xml:lang="th">ตัวอักษรอื่น ๆ</value>
+        <value xml:lang="zh">另一个文本</value>
+    </property>
+    <property key="FieldDescription.comments">
+        <value xml:lang="de">Kommentare</value>
+        <value xml:lang="en">Comments</value>
+        <value xml:lang="fr">Commentaires</value>
+        <value xml:lang="it">Commenti</value>
+        <value xml:lang="ro">Comentarii</value>
+        <value xml:lang="th">ความคิดเห็น</value>
+        <value xml:lang="zh">评论</value>
+    </property>
+    <property key="FieldDescription.exampleDate">
+        <value xml:lang="en">Example Date</value>
+        <value xml:lang="fr">Exemple de date</value>
+        <value xml:lang="it">Esempio Data</value>
+        <value xml:lang="ro">Data Exemplu</value>
+        <value xml:lang="th">ตัวอย่างวันที่</value>
+        <value xml:lang="zh">样例日期</value>
+    </property>
+    <property key="FieldDescription.exampleId">
+        <value xml:lang="en">Example ID</value>
+        <value xml:lang="fr">Réf. d'exemple</value>
+        <value xml:lang="it">Codice Esempio</value>
+        <value xml:lang="ro">Cod Exemplu</value>
+        <value xml:lang="th">รหัสตัวอย่าง</value>
+        <value xml:lang="zh">样例标识</value>
+    </property>
+    <property key="FieldDescription.exampleItemSeqId">
+        <value xml:lang="en">Example Item sequence ID</value>
+        <value xml:lang="fr">Réf. de séquence exemple d'article</value>
+        <value xml:lang="it">Riga esempio</value>
+        <value xml:lang="th">รหัสลำดับตัวอย่างสินค้า</value>
+        <value xml:lang="zh">样例明细序号</value>
+    </property>
+    <property key="FieldDescription.exampleName">
+        <value xml:lang="en">Example Name</value>
+        <value xml:lang="fr">Nom d'exemple</value>
+        <value xml:lang="it">Nome Esempio</value>
+        <value xml:lang="ro">Nume Exemplu</value>
+        <value xml:lang="th">ชื่อตัวอย่าง</value>
+        <value xml:lang="zh">样例名称</value>
+    </property>
+    <property key="FieldDescription.exampleSize">
+        <value xml:lang="en">Example Size</value>
+        <value xml:lang="fr">Exemple de taille</value>
+        <value xml:lang="it">Esempio Taglia</value>
+        <value xml:lang="ro">Marime-size Exemplu</value>
+        <value xml:lang="th">ขนาดตัวอย่าง</value>
+        <value xml:lang="zh">样例尺寸</value>
+    </property>
+    <property key="FieldDescription.exampleTypeId">
+        <value xml:lang="en">Example Type ID</value>
+        <value xml:lang="fr">Réf. de type d'exemple</value>
+        <value xml:lang="it">Tipo esempio</value>
+        <value xml:lang="th">รหัสประเภทตัวอย่าง</value>
+        <value xml:lang="zh">样例类型标识</value>
+    </property>
+    <property key="FieldDescription.longDescription">
+        <value xml:lang="en">Long Description</value>
+        <value xml:lang="fr">Longue description</value>
+        <value xml:lang="it">Descrizione Lunga</value>
+        <value xml:lang="ro">Descriere Lunga</value>
+        <value xml:lang="th">รายละเอียด</value>
+        <value xml:lang="zh">详细描述</value>
+    </property>
+</resource>
diff --git a/framework/example/config/ExampleHelpUiLabels.xml b/framework/example/config/ExampleHelpUiLabels.xml
new file mode 100644
index 0000000..f21e94a
--- /dev/null
+++ b/framework/example/config/ExampleHelpUiLabels.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you 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.
+-->
+<resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <property key="ExampleEditHelp">
+        <value xml:lang="en">An example of a Help screen.</value>
+        <value xml:lang="fr">Un exemple d'écran d'aide</value>
+        <value xml:lang="it">Un esempio di schermata di aiuto.</value>
+        <value xml:lang="zh">帮助屏幕的样例</value>
+    </property>
+</resource>
diff --git a/framework/example/config/ExampleUiLabels.xml b/framework/example/config/ExampleUiLabels.xml
new file mode 100644
index 0000000..a0caba8
--- /dev/null
+++ b/framework/example/config/ExampleUiLabels.xml
@@ -0,0 +1,868 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you 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.
+-->
+<resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <property key="ExampelsJackrabbitDownloadFile">
+        <value xml:lang="de">Datei herunterladen</value>
+        <value xml:lang="en">Download file</value>
+    </property>
+    <property key="ExampelsJackrabbitOpenData">
+        <value xml:lang="de">Content öffnen.</value>
+        <value xml:lang="en">Open content.</value>
+    </property>
+    <property key="ExampelsJackrabbitOpenFile">
+        <value xml:lang="de">Datei öffnen</value>
+        <value xml:lang="en">Open file</value>
+    </property>
+    <property key="ExampelsJackrabbitRemoveData">
+        <value xml:lang="de">Content löschen.</value>
+        <value xml:lang="en">Remove content.</value>
+    </property>
+    <property key="ExampelsJackrabbitRemoveFile">
+        <value xml:lang="de">Datei löschen</value>
+        <value xml:lang="en">Remove file</value>
+    </property>
+    <property key="ExampleAddNewContentEntry">
+        <value xml:lang="de">Einen neuen Content Eintrag hinzufügen</value>
+        <value xml:lang="en">Add a new content entry</value>
+    </property>
+    <property key="ExampleAddNewNodePath">
+        <value xml:lang="de">Füge einen neuen Node Pfad hinzu, z.B. /Foo/Baa speichert die Datei im Ordner "Baa"</value>
+        <value xml:lang="en">Add a (new) node path like /Foo/Baa will store the file under the folder "Baa"</value>
+    </property>
+    <property key="ExampleAjaxExamples">
+        <value xml:lang="en">Ajax Examples</value>
+        <value xml:lang="fr">Exemples Ajax</value>
+        <value xml:lang="it">Esempi Ajax</value>
+        <value xml:lang="zh">Ajax样例</value>
+    </property>
+    <property key="ExampleAjaxIntro">
+        <value xml:lang="en">To use this Ajax demonstration, you must have JavaScript enabled on your browser.</value>
+        <value xml:lang="fr">Pour utiliser cette démonstration Ajax, vous devez avoir activé Javascript </value>
+        <value xml:lang="it">Per usare questa dimostrazione Ajax, tu devi avere JavaScript abilitato sul tuo browser.</value>
+        <value xml:lang="zh">要使用这个Ajax演示,你必须让你的浏览器启用JavaScript。</value>
+    </property>
+    <!-- Example component properties -->
+    <property key="ExampleApplication">
+        <value xml:lang="en">Example Application</value>
+        <value xml:lang="fr">Application exemple</value>
+        <value xml:lang="it">Applicazione Esempi</value>
+        <value xml:lang="ro">Aplicatie Exemple</value>
+        <value xml:lang="ru">Приложение Пример</value>
+        <value xml:lang="th">ตัวอย่างโปรแกรมคอมพิวเตอร์</value>
+        <value xml:lang="zh">样例应用</value>
+    </property>
+    <property key="ExampleAutocompleteDropdown">
+        <value xml:lang="en">Autocomplete Dropdown</value>
+        <value xml:lang="fr">Liste déroulante à auto complétion</value>
+    </property>
+    <property key="ExampleAutocompleteTooltip">
+        <value xml:lang="en">COUNTRY type based example, use Geo.Geoid and Geo.GeoName Entity.fields for completion</value>
+        <value xml:lang="fr">Exemple sur le type COUNTRY et utilisant Geo.Geoid et Geo.GeoName comme Entité.champs pour la complétion</value>
+    </property>
+    <property key="ExampleBaseNodeVersion">
+        <value xml:lang="de">Verion des Content Knoten</value>
+        <value xml:lang="en">Version of the base content node</value>
+    </property>
+    <property key="ExampleBirtChartReport">
+        <value xml:lang="en">HTML chart report</value>
+        <value xml:lang="fr">Graphiques HTML</value>
+    </property>
+    <property key="ExampleBirtChartViewHandler">
+        <value xml:lang="en">PDF chart report</value>
+        <value xml:lang="fr">Graphiques PDF</value>
+    </property>
+    <property key="ExampleBirtMail">
+        <value xml:lang="en">Send any format through Mail</value>
+    </property>
+    <property key="ExampleBirtReport">
+        <value xml:lang="en">HTML</value>
+    </property>
+    <property key="ExampleBirtViewHandler">
+        <value xml:lang="en">PDF</value>
+    </property>
+    <property key="ExampleCalendarFromLayer">
+        <value xml:lang="en">Calendar field (only test purp.)</value>
+        <value xml:lang="fr">Calendrier (only test)</value>
+    </property>
+    <property key="ExampleCompanyName">
+        <value xml:lang="en">OFBiz: Example</value>
+        <value xml:lang="fr">OFBiz : Exemple</value>
+        <value xml:lang="it">OFBiz: Esempi</value>
+        <value xml:lang="ro">OFBiz: Exemple</value>
+        <value xml:lang="ru">OFBiz: Пример</value>
+        <value xml:lang="th">OFBiz: ตัวอย่าง</value>
+        <value xml:lang="zh">OFBiz: 样例</value>
+    </property>
+    <property key="ExampleCompanySubtitle">
+        <!--value xml:lang="ar">جزء من عائلة أوفبيز للبرمجيات الحرة</value-->
+        <value xml:lang="ar">جزء من عائلة أوفبيز للتطبيقات الحرة للتسيير</value>
+        <value xml:lang="de">Teil der Open For Business Familie von Open Source Software</value>
+        <value xml:lang="en">Part of the Open For Business Family of Open Source Software</value>
+        <!--value xml:lang="es">Parte de la familia "Open for Bussiness" de Software Libre</value-->
+        <value xml:lang="es">Parte de la familia de software Open For Business de código abierto</value>
+        <value xml:lang="fr">Un module de la famille Open For Business, logiciel libre de gestion d'entreprise.</value>
+        <value xml:lang="it">Un modulo della famiglia di software open source Open For Business</value>
+        <!--value xml:lang="nl">Onderdeel van de Open For Business'-suite</value-->
+        <value xml:lang="nl">Deel van de Open For Business-suite van Open Source Software</value>
+        <value xml:lang="pt_BR">Parte da família OfBiz de software de fonte aberta</value>
+        <!--value xml:lang="pt_PT">Parte do Software de Fonte Aberta para Grupos Abertos Para o Negócio</value-->
+        <value xml:lang="pt_PT">Parte da família OfBiz de software de fonte aberta</value>
+        <!--value xml:lang="ro">Parte accesibila pentru Business Family of Open Source Software</valuevalue xml:lang="ro">Parte din Open for Business Family of Open Source Software</value-->
+        <value xml:lang="ro">Partea de Deschidere Pentru Afaceri Familiale din Open Source Software</value>
+        <!--value xml:lang="ru">Часть семейства ПО Open For Business</valuevalue xml:lang="ru">Часть семейства "Open For Business Family" программных продуктов Open Source </value-->
+        <value xml:lang="ru">Входит в состав семейства Open For Business</value>
+        <!--value xml:lang="th">เป็นส่วนหนึ่งของธุรกิจแบบครอบครัวที่เป็นซอฟต์แวร์โอเพนซอส</value-->
+        <value xml:lang="th">ส่วนหนึ่งของธุรกิจแบบครอบครัวที่เป็นซอฟต์แวร์โอเพนซอส</value>
+        <!--value xml:lang="zh">开源软件OFBiz的组成部分</valuevalue xml:lang="zh">开源软件OFBiz的组成部分</value-->
+        <value xml:lang="zh">开源软件OFBiz家族的一部分</value>
+        <value xml:lang="zh_CN">OFBiz的一部分</value>
+    </property>
+    <property key="ExampleDashboard">
+        <value xml:lang="en">Dashboard</value>
+        <value xml:lang="fr">Personnalisation des pages</value>
+        <value xml:lang="it">Cruscotto</value>
+        <value xml:lang="zh">个人主页</value>
+    </property>
+    <property key="ExampleDateField10Title">
+        <value xml:lang="en">Field10: date and time selection field with default value</value>
+        <value xml:lang="fr">Champ 10 : sélection de date et temps (valeur par défaut)</value>
+        <value xml:lang="it">Campo10: campo di selezione con valore di default per data e ora</value>
+        <value xml:lang="zh">数据项10:带有缺省值的日期和时间选择</value>
+    </property>
+    <property key="ExampleDateField10Tooltip">
+        <value xml:lang="en">Same as above, uses the nowTimestamp variable (always available in the form context) to set the default value to now</value>
+        <value xml:lang="fr">La même chose mais la variable nowTimestamp (toujours disponible dans context) est utilisée pour affecter la valeur par défaut à "maintenant"</value>
+        <value xml:lang="it">Lo stesso di sopra, usare la variabile nowTimestamp (sempre disponibile nel contesto della form) per impostare il valore di default ad adesso</value>
+        <value xml:lang="zh">同上,使用nowTimstamp变量(在表单中总是可用的)来把缺省值设置为现在</value>
+    </property>
+    <property key="ExampleDateField11Title">
+        <value xml:lang="en">Field11: date and time selection field with default value</value>
+        <value xml:lang="fr">Champ 11 : sélection de date et temps (valeur par défaut)</value>
+        <value xml:lang="it">Campo11: campo di selezione con valore di default per data e ora</value>
+        <value xml:lang="zh">数据项11:带有缺省值的日期和时间选择</value>
+    </property>
+    <property key="ExampleDateField11Tooltip">
+        <value xml:lang="en">Uses the \${date:dayStart(nowTimestamp, timeZone, locale)} UEL expression to set the default value to the start of today</value>
+        <value xml:lang="zh">使用\${date:dayStart(nowTimestamp, timeZone, locale)}表达式来把缺省值设置为今天的开始时间</value>
+    </property>
+    <property key="ExampleDateField12Title">
+        <value xml:lang="en">Field12: advanced date time selection with a step value for minutes</value>
+        <value xml:lang="fr">Champ 12 : Sélection avancée date et temps avec la possibilité de choisir un pas pour les minutes</value>
+    </property>
+    <property key="ExampleDateField12Tooltip">
+        <value xml:lang="en">Use step=1 (default), 5, 10, 15, 30</value>
+        <value xml:lang="fr">Utiliser 1 (valeur par défaut), 5, 10, 15, 30 pour la valeur du pas</value>
+    </property>
+    <property key="ExampleDateField1Title">
+        <value xml:lang="en">Field1: date and time selection field</value>
+        <value xml:lang="fr">Champ 1 : sélection de date et temps</value>
+        <value xml:lang="it">Campo1: campo di selezione data e ora</value>
+        <value xml:lang="zh">数据项1:日期和时间选择</value>
+    </property>
+    <property key="ExampleDateField2Title">
+        <value xml:lang="en">Field2: date selection field</value>
+        <value xml:lang="fr">Champ 2 : sélection de date</value>
+        <value xml:lang="it">Campo2: campo di selezione data</value>
+        <value xml:lang="zh">数据项2:日期选择</value>
+    </property>
+    <property key="ExampleDateField3Title">
+        <value xml:lang="en">Field3: time selection field</value>
+        <value xml:lang="fr">Champ 3 : sélection de temps</value>
+        <value xml:lang="it">Campo3: campo di selezione ora</value>
+        <value xml:lang="zh">数据项3:时间选择</value>
+    </property>
+    <property key="ExampleDateField4Title">
+        <value xml:lang="en">Field4: advanced date time selection</value>
+        <value xml:lang="fr">Champ 4 : sélection avancée de date et temps </value>
+        <value xml:lang="it">Campo4: selezione avanzata data e ora</value>
+        <value xml:lang="zh">数据项4:高级日期时间选择</value>
+    </property>
+    <property key="ExampleDateField4Tooltip">
+        <value xml:lang="en">Use the input-method (time-dropdown) and clock (24) attributes to create drop down boxes for hour and minute selections</value>
+        <value xml:lang="fr">Utilise des listes déroulantes pour définir les heures et minutes</value>
+        <value xml:lang="it">Usare il metodo di input (time-dropdown) e gli attributi ora (24) per creare i box per la selezione ore e minuti</value>
+        <value xml:lang="zh">使用输入方法(时间下拉框)和时钟(24)属性来创建小时和分钟的下拉框</value>
+    </property>
+    <property key="ExampleDateField5Title">
+        <value xml:lang="en">Field5: advanced date time selection (AM/PM)</value>
+        <value xml:lang="fr">Champ 5 : sélection avancée de date et temps (AM/PM)</value>
+        <value xml:lang="it">Campo5: selezione avanzata data e ora (AM/PM)</value>
+        <value xml:lang="zh">数据项5:高级日期时间选择(上午/下午)</value>
+    </property>
+    <property key="ExampleDateField6Title">
+        <value xml:lang="en">Field6: date and time simple display</value>
+        <value xml:lang="fr">Champ 5 : affichage simple de date et temps</value>
+        <value xml:lang="it">Campo6: data e ora semplice da visualizzare</value>
+        <value xml:lang="zh">数据项6:日期和时间简单显示</value>
+    </property>
+    <property key="ExampleDateField7Title">
+        <value xml:lang="en">Field7: date and time display with custom format</value>
+        <value xml:lang="fr">Champ 7 : affichage de date et temps à un format spécifique</value>
+        <value xml:lang="it">Campo7: data e ora da visualizzare con un formato personalizzato</value>
+        <value xml:lang="zh">数据项7:使用定制格式显示日期和时间</value>
+    </property>
+    <property key="ExampleDateField7Tooltip">
+        <value xml:lang="en">This is an example of MM/dd/yyyy format</value>
+        <value xml:lang="fr">Exemple auformat MM/dd/yyyy</value>
+        <value xml:lang="it">Questo è un'esempio di formato data MM/gg/aaaa</value>
+        <value xml:lang="zh">这是MM/dd/yyyy格式样例</value>
+    </property>
+    <property key="ExampleDateField8Title">
+        <value xml:lang="en">Field8: date and time display with custom format</value>
+        <value xml:lang="fr">Champ 8 : affichage de date et temps à un format spécifique</value>
+        <value xml:lang="it">Campo8: data e ora da visualizzare con un formato personalizzato</value>
+        <value xml:lang="zh">数据项8:使用定制格式显示日期和时间</value>
+    </property>
+    <property key="ExampleDateField8Tooltip">
+        <value xml:lang="en">This is an example of MMMM, dd, yyyy format</value>
+        <value xml:lang="fr">Exemple au format MMMM, dd, yyyy</value>
+        <value xml:lang="it">Questo è un'esempio di formato data MMMM, gg, aaaa</value>
+        <value xml:lang="zh">这是MMMM, dd, yyyy格式样例</value>
+    </property>
+    <property key="ExampleDateField9Title">
+        <value xml:lang="en">Field9: date and time selection field with default value</value>
+        <value xml:lang="fr">Champ 9 : sélection de date et temps avec valeur par défaut</value>
+        <value xml:lang="it">Campo9: campo di selezione con valore di default per data e ora</value>
+        <value xml:lang="zh">数据项9:日期和时间选择带有缺省值</value>
+    </property>
+    <property key="ExampleDateField9Tooltip">
+        <value xml:lang="en">Same as above, uses the \${groovy:...} notation to call an util method to get the now timestamp</value>
+        <value xml:lang="fr">La même chose mais utilise la notation \${groovy:...} pour appeler un méthode utilitaire pour obtenir l'heure du moment</value>
+        <value xml:lang="it">Lo stesso di sopra, usare la notazione \${groovy:...} per eseguire un metodo di utilità per ottenere un nuovo timestamp</value>
+        <value xml:lang="zh">同上,使用\${groovy:...}来调用一个应用方法来获得现在的时间戳</value>
+    </property>
+    <property key="ExampleDateTimeFields">
+        <value xml:lang="en">Date/Time fields</value>
+        <value xml:lang="fr">Champs de date et temps</value>
+        <value xml:lang="it">Campi data/ora</value>
+        <value xml:lang="zh">日期/时间数据项</value>
+    </property>
+    <property key="ExampleDefinitionFile">
+        <value xml:lang="en">in the file: </value>
+        <value xml:lang="fr">dans le fichier : </value>
+        <value xml:lang="it">nel file: </value>
+        <value xml:lang="zh">在文件:</value>
+    </property>
+    <property key="ExampleDefinitionFileTooltip">
+        <value xml:lang="en">framework/example/widget/example/FormWidgetExampleForms.xml</value>
+        <value xml:lang="fr">framework/example/widget/example/FormWidgetExampleForms.xml</value>
+        <value xml:lang="it">framework/example/widget/example/FormWidgetExampleForms.xml</value>
+    </property>
+    <property key="ExampleDefinitionName">
+        <value xml:lang="en"> - see the form definition with name</value>
+        <value xml:lang="fr"> - voir la défintion avec la form de nom </value>
+        <value xml:lang="it"> - vedi la definizione della form con il nome</value>
+        <value xml:lang="zh"> - 参见表单定义,名称为</value>
+    </property>
+    <property key="ExampleDependentDropDownTooltip">
+        <value xml:lang="en">Needs some fields to be set, see in FormWidgetExampleScreens.xml (begins with dependentForm)</value>
+        <value xml:lang="fr">Nécessite de définir certains champs, voir dans FormWidgetExampleScreens.xml (commence avec dependentForm)</value>
+    </property>
+    <property key="ExampleDependentDropDowns">
+        <value xml:lang="en">Dependent drop-downs</value>
+        <value xml:lang="fr">liste déroulante dépendantes</value>
+    </property>
+    <property key="ExampleDropDown">
+        <value xml:lang="en">drop-down</value>
+        <value xml:lang="fr">liste déroulante</value>
+        <value xml:lang="it">drop-down</value>
+        <value xml:lang="zh">下拉框</value>
+    </property>
+    <property key="ExampleDropDownEntityOptions">
+        <value xml:lang="en">entity-options</value>
+        <value xml:lang="fr">entity-options</value>
+        <value xml:lang="it">entity-options</value>
+        <value xml:lang="zh">实体选项</value>
+    </property>
+    <property key="ExampleDropDownEntityOptionsTooltip1">
+        <value xml:lang="en">All these fields retrieve the list of values from another entity by using the entity-options element.</value>
+        <value xml:lang="fr">Tous ces champs récupèrent leurs listes de valeurs depuis une autre entité en utilisant l'élement entity-options</value>
+        <value xml:lang="it">Tutti questi campi ricavano la lista di valori da un'altra entità che usa l'elemento entity-options.</value>
+        <value xml:lang="zh">全部这些数据项是通过使用实体选项元素从另一个实体抽取数据列表得到的。</value>
+    </property>
+    <property key="ExampleDropDownEntityOptionsTooltip2">
+        <value xml:lang="en">entity-options will look up options for the field in the given entity.</value>
+        <value xml:lang="fr">entity-options recherchera les options de ce champ en fonction de l'entité utilisée</value>
+        <value xml:lang="it">entity-options ricercherà le opzioni per il campo nell'entità specificata.</value>
+        <value xml:lang="zh">实体选项会查找指定实体的数据项选项</value>
+    </property>
+    <property key="ExampleDropDownEntityOptionsTooltip3">
+        <value xml:lang="en">The complete syntax is... TODO</value>
+        <value xml:lang="fr">La syntaxe complète est... A FAIRE </value>
+        <value xml:lang="it">La sintassi completa è.... DA FARE</value>
+        <value xml:lang="zh">完整的语法是... 待实现</value>
+    </property>
+    <property key="ExampleDropDownField1Title">
+        <value xml:lang="en">Field1: optional</value>
+        <value xml:lang="fr">Champ1 : optionnel</value>
+        <value xml:lang="it">Campo1: opzionale</value>
+        <value xml:lang="zh">数据项1:可选的</value>
+    </property>
+    <property key="ExampleDropDownField1Tooltip">
+        <value xml:lang="en">This is an example of a drop-down field with allow-empty set to true: as you can see, an empty entry is automatically added.</value>
+        <value xml:lang="fr">Exemple de champ à liste déroulante ayant allow-empty définit comme vrai. Comme vous le voyez, une option vide est automatiquement ajoutée en tête</value>
+        <value xml:lang="it">Questo è un'esempio di un campo drop-down con allow-empty impostato a vero: come tu puoi vedere, una riga automatica verrà aggiunta</value>
+        <value xml:lang="zh">这是一个下拉数据项的例子,允许空设置为是:如你所见,会自动添加一个空的记录。</value>
+    </property>
+    <property key="ExampleDropDownField2Title">
+        <value xml:lang="en">Field2: mandatory</value>
+        <value xml:lang="fr">Champ 2 : obligatoire</value>
+        <value xml:lang="it">Campo2: obbligatorio</value>
+        <value xml:lang="zh">数据项2:强制</value>
+    </property>
+    <property key="ExampleDropDownField2Tooltip">
+        <value xml:lang="en">The same as above, but here allow-empty is set to false (the default, if not specified): as you can see, there is no empty selection.</value>
+        <value xml:lang="fr">La même chose mais ici allow-empty est faux (la valeur par défaut n'est pas spécifiée). Comme vous pouvez le voir, il n'y a pas d'option vide en tête</value>
+        <value xml:lang="it">Lo stesso di spota, ma qui allow-empty è falso (di default, se non specificato): come puoi vedere, non c'è nessuna selezione vuota.</value>
+        <value xml:lang="zh">同上,但是这里允许空设置为否(如果没有指明的话,否是缺省值):如你所见,没有空的选择。</value>
+    </property>
+    <property key="ExampleDropDownField3Title">
+        <value xml:lang="en">Field3: sort in descending order</value>
+        <value xml:lang="fr">Champ 3 : tri descendant</value>
+        <value xml:lang="it">Campo3: ordinato in ordine discendente</value>
+        <value xml:lang="zh">数据项3:按降序排序</value>
+    </property>
+    <property key="ExampleDropDownField4Title">
+        <value xml:lang="en">Field4: combined description</value>
+        <value xml:lang="fr">Champ 4 : description combinée</value>
+        <value xml:lang="it">Campo4: descrizione combinata</value>
+        <value xml:lang="zh">数据项4:组合的描述</value>
+    </property>
+    <property key="ExampleDropDownField5Title">
+        <value xml:lang="en">Field5: selection of a default value from the list</value>
+        <value xml:lang="fr">Champ 5 : choix d'une valeur par défaut dans la liste</value>
+        <value xml:lang="it">Campo5: seleziona un valore di default dalla lista</value>
+        <value xml:lang="zh">数据项5:从列表选择一个缺省值</value>
+    </property>
+    <property key="ExampleDropDownField5Tooltip">
+        <value xml:lang="en">How to use the no-current-selected-key to select a default value from the options</value>
+        <value xml:lang="fr">Comment utiliser no-current-selected-key pour choisir une valeur par défaut parmi les options</value>
+        <value xml:lang="it">Come usare no-current-selected-key per selezionare un valore di default dalle opzioni</value>
+        <value xml:lang="zh">怎样使用没有当前选择键来从选项中选择一个缺省值</value>
+    </property>
+    <property key="ExampleDropDownField6Title">
+        <value xml:lang="en">Field6: (exampleTypeId): shortest notation</value>
+        <value xml:lang="fr">Champ 6 : (exampleTypeId): notation plus courte</value>
+        <value xml:lang="it">Campo6: (exampleTypeId): notazione breve</value>
+        <value xml:lang="zh">数据项6:(样例类型标识):最短注释</value>
+    </property>
+    <property key="ExampleDropDownField7Title">
+        <value xml:lang="en">Field7: additional constraint</value>
+        <value xml:lang="fr">Champ 8 : contrainte additionnelle</value>
+        <value xml:lang="it">Campo7: costrizioni aggiuntive</value>
+        <value xml:lang="zh">数据项7:额外限制</value>
+    </property>
+    <property key="ExampleDropDownField8Title">
+        <value xml:lang="en">Field8: Javascript event</value>
+        <value xml:lang="fr">Champ 8 : évènement Javascript</value>
+        <value xml:lang="it">Campo8: evento Javascript</value>
+        <value xml:lang="zh">数据项8:Javascript事件</value>
+    </property>
+    <property key="ExampleDropDownField8Tooltip">
+        <value xml:lang="en">How to use the event and action attributes (in the field element) to trigger a Javascript action (in this example a popup message when the option is changed).</value>
+        <value xml:lang="fr">Comment utiliser les attributs évènement (event) et action, dans l'élément champ (field) pour déclencher une action Javascript, dans cet exemple un message surgissant quand l'option est changée</value>
+        <value xml:lang="it">Come usare gli eventi a l'azione attributi (nell'elemento field) per avviare l'azione Javascript (nell'esempio un messaggio popup quando l'opzione viene cambiata).</value>
+        <value xml:lang="zh">怎样使用事件和操作属性(在数据项元素(field))中触发一个Javascript操作(在这个样例中,当选项变化时会弹出一个信息)。</value>
+    </property>
+    <property key="ExampleDropDownFields">
+        <value xml:lang="en">Drop down fields</value>
+        <value xml:lang="fr">Champs à listes déroulantes</value>
+        <value xml:lang="it">Campi drop down</value>
+        <value xml:lang="zh">下拉框数据项</value>
+    </property>
+    <property key="ExampleDropDownTooltip">
+        <value xml:lang="en">First of all you have to define a drop-down element inside of the field element that you want to render as a drop down field.</value>
+        <value xml:lang="fr">Pour commencer vous définissez un élément liste déroulante (drop-down) à l'intérieur de l'élément champ (field) que vous voulez créer comme liste déroulante</value>
+        <value xml:lang="it">Prima di tutto tu devi definire un'elemento drop-down dentro un'elemento field che tu visualizzerai come campo drop down.</value>
+        <value xml:lang="zh">首先,你必须在数据项元素内定义一个下拉元素,来修饰为下拉数据项。</value>
+    </property>
+    <property key="ExampleExample">
+        <value xml:lang="en">Example</value>
+        <value xml:lang="fr">Exemple</value>
+        <value xml:lang="it">Esempio</value>
+        <value xml:lang="ro">Exemplu</value>
+        <value xml:lang="ru">Пример</value>
+        <value xml:lang="th">ตัวอย่าง</value>
+        <value xml:lang="zh">样例</value>
+    </property>
+    <property key="ExampleExampleFeature">
+        <value xml:lang="en">Example Feature</value>
+        <value xml:lang="fr">Caractéristique exemple</value>
+        <value xml:lang="it">Caratteristica Esempio</value>
+        <value xml:lang="ro">Caracteristica Exemplu</value>
+        <value xml:lang="ru">Особенность примера</value>
+        <value xml:lang="th">ลักษณะตัวอย่าง</value>
+        <value xml:lang="zh">样例特征</value>
+    </property>
+    <property key="ExampleExampleFeatureId">
+        <value xml:lang="en">Example Feature ID</value>
+        <value xml:lang="fr">Réf. de caractéristique exemple</value>
+        <value xml:lang="it">Codice Caratteristica Esempio</value>
+        <value xml:lang="ro">Cod Caracteristica Exemplu </value>
+        <value xml:lang="ru">Код особенности примера</value>
+        <value xml:lang="th">ตัวอย่างรหัสลักษณะ</value>
+        <value xml:lang="zh">样例特征标识</value>
+    </property>
+    <property key="ExampleExampleId">
+        <value xml:lang="en">Example ID</value>
+        <value xml:lang="fr">Réf. exemple</value>
+        <value xml:lang="it">Codice esempio</value>
+        <value xml:lang="ro">Cod Exemplu</value>
+        <value xml:lang="ru">Код примера</value>
+        <value xml:lang="th">รหัสตัวอย่าง</value>
+        <value xml:lang="zh">样例标识</value>
+    </property>
+    <property key="ExampleExamples">
+        <value xml:lang="en">Examples</value>
+        <value xml:lang="fr">Exemples</value>
+        <value xml:lang="it">Esempi</value>
+        <value xml:lang="ro">Exemple</value>
+        <value xml:lang="ru">Примеры</value>
+        <value xml:lang="th">ตัวอย่าง</value>
+        <value xml:lang="zh">样例</value>
+    </property>
+    <property key="ExampleExplicitOption">
+        <value xml:lang="en">Explicit Option</value>
+        <value xml:lang="fr">Option explicite</value>
+        <value xml:lang="it">Opzione Esplicita</value>
+        <value xml:lang="th">ทางเลือกที่ชัดเจน</value>
+        <value xml:lang="zh">显在选项</value>
+    </property>
+    <property key="ExampleFeature">
+        <value xml:lang="en">Feature</value>
+        <value xml:lang="fr">Caractéristique</value>
+        <value xml:lang="it">Caratteristica</value>
+        <value xml:lang="ro">Caracteristica</value>
+        <value xml:lang="ru">Особенность</value>
+        <value xml:lang="th">ลักษณะ</value>
+        <value xml:lang="zh">特征</value>
+    </property>
+    <property key="ExampleFeatureSource">
+        <value xml:lang="en">Feature Source</value>
+        <value xml:lang="fr">Caractéristique d'origine</value>
+        <value xml:lang="it">Caratteristica Origine</value>
+        <value xml:lang="ro">Origine Caracteristici </value>
+        <value xml:lang="ru">Источник особенности</value>
+        <value xml:lang="th">ที่มา</value>
+        <value xml:lang="zh">特征源</value>
+    </property>
+    <property key="ExampleFeatures">
+        <value xml:lang="en">Features</value>
+        <value xml:lang="fr">Caractéristiques</value>
+        <value xml:lang="it">Caratteristiche</value>
+        <value xml:lang="ro">Caracteristici</value>
+        <value xml:lang="ru">Особенности</value>
+        <value xml:lang="th">ลักษณะ</value>
+        <value xml:lang="zh">特征</value>
+    </property>
+    <property key="ExampleField">
+        <value xml:lang="en">Field</value>
+        <value xml:lang="it">Campo</value>
+        <value xml:lang="zh">数据项</value>
+    </property>
+    <property key="ExampleFopFonts">
+        <value xml:lang="en">This will print a simple PDF file which will show the FOP fonts avalaible in OFBiz</value>
+        <value xml:lang="fr">Impression d'un simple fichier PDF qui montre les polices FOP disponibles dans OFBiz</value>
+        <value xml:lang="it">Questo stampa un file PDF semplice che mostrerà i font FOP disponibili in OFBiz</value>
+        <value xml:lang="zh">这将打印一个简单的PDF文件,这个文件会显示OFBiz中可用的FOP字体</value>
+    </property>
+    <property key="ExampleFormWidgetExamples">
+        <value xml:lang="en">Form Widget Examples</value>
+        <value xml:lang="fr">Exemple de Form Widget</value>
+        <value xml:lang="it">Esempi form widget</value>
+        <value xml:lang="th">ตัวอย่างรูปแบบ Widget</value>
+        <value xml:lang="zh">表单挂件样例</value>
+    </property>
+    <property key="ExampleGroupField">
+        <value xml:lang="en">Group</value>
+        <value xml:lang="it">Gruppo</value>
+        <value xml:lang="zh">组</value>
+    </property>
+    <property key="ExampleGroupFields">
+        <value xml:lang="en">Fields groups</value>
+        <value xml:lang="it">Gruppi campi</value>
+        <value xml:lang="zh">数据项组</value>
+    </property>
+    <property key="ExampleJackrabbitCleanRepository">
+        <value xml:lang="de">Repository aufräumen</value>
+        <value xml:lang="en">Clean repository</value>
+    </property>
+    <property key="ExampleJackrabbitCleanRepositoryTooltip">
+        <value xml:lang="de">Löscht alle Nodes aus dem Repository, die keine Verkünpfung in der Content Tabelle haben.</value>
+        <value xml:lang="en">Removes all nodes which are not linked in the content table.</value>
+    </property>
+    <property key="ExampleJackrabbitListNodes">
+        <value xml:lang="de">Liste alles Knoten</value>
+        <value xml:lang="en">List Nodes</value>
+    </property>
+    <property key="ExampleJackrabbitQueryForContent">
+        <value xml:lang="de">Das Repository kann mit Hilfe der SQL2 oder JQOM Query Language durchsucht werden: z.B. SELECT * FROM [nt:unstructured] gibt alle nodes vom Typ nt:unstructured zurück.</value>
+        <value xml:lang="en">You can search the repository by using SQL2 or JQOM query syntax: i.e. SELECT * FROM [nt:unstructured] gives all nodes with the typ nt:unstructured.</value>
+    </property>
+    <property key="ExampleJackrabbitQuickContentSelect">
+        <value xml:lang="de">Content Schnellauswahl - Content Node auswählen und Sprache bestimmen.</value>
+        <value xml:lang="en">Content quick select - Choose your content node and select a language.</value>
+    </property>
+    <property key="ExampleJackrabbitShowContentData">
+        <value xml:lang="de">(Text) Content anzeigen</value>
+        <value xml:lang="en">Show (text) content</value>
+    </property>
+    <property key="ExampleJackrabbitShowUploadedFiles">
+        <value xml:lang="de">Dateien anzeigen</value>
+        <value xml:lang="en">Show uploaded Files</value>
+    </property>
+    <property key="ExampleJackrabbitTryRightClick">
+        <value xml:lang="de">Wähle eine Datei und versuche einen Rechtklick</value>
+        <value xml:lang="en">Choose a file and try a 'right click'</value>
+    </property>
+    <property key="ExampleJackrabbitUploadFileData">
+        <value xml:lang="de">Eine neue Datei speichern</value>
+        <value xml:lang="en">Upload a new file</value>
+    </property>
+    <property key="ExampleLanguageTextVersion">
+        <value xml:lang="de">Verion der gewählten sprache</value>
+        <value xml:lang="en">Version of the choosen language</value>
+    </property>
+    <property key="ExampleLayerFromLayer">
+        <value xml:lang="en">Layered lookup field (only test purp.)</value>
+        <value xml:lang="fr">Lookup de type layer (only test)</value>
+    </property>
+    <property key="ExampleLongDescription">
+        <value xml:lang="en">Long Description</value>
+        <value xml:lang="it">Descrizione lunga</value>
+        <value xml:lang="zh">详细描述</value>
+    </property>
+    <property key="ExampleLookupFields">
+        <value xml:lang="en">Lookup Fields: First of type popup, second layered and showing use of set_values underneath, ie returning not only Id but also another value. Both using also autocomplete</value>
+        <value xml:lang="fr">Champs de recherche: le premier de type popup, le second de type layer avec usage sous-jacent de set_values qui permet de traiter non seulement une référence mais aussi une autre valeur. Les 2 utilisent aussi l'autocompletion</value>
+    </property>
+    <property key="ExampleLookupFieldsTitle">
+        <value xml:lang="en">Lookup Fields</value>
+        <value xml:lang="fr">Champs de recherche</value>
+    </property>
+    <property key="ExampleMainPage">
+        <value xml:lang="en">Example Main Page</value>
+        <value xml:lang="fr">Exemple de page principale</value>
+        <value xml:lang="it">Pagina principale esempi</value>
+        <value xml:lang="th">ตัวอย่างหน้าหลัก</value>
+        <value xml:lang="zh">样例首页</value>
+    </property>
+    <property key="ExampleMessage">
+        <value xml:lang="en">For something interesting make sure you are logged in, try username:admin, password:ofbiz.</value>
+        <value xml:lang="fr">Pour voir les exemples, vérifiez que vous être connecté, essayez l'utilisateur admin et le mot de passe ofbiz</value>
+        <value xml:lang="it">Per qualsiasi interesse devi essere sicuro di essere entrato, provare nome utente:admin, password:ofbiz.</value>
+        <value xml:lang="ro">Pentru a fi sigur ca te-ai logat, incearca username:admin, password:ofbiz.</value>
+        <value xml:lang="ru">Для того чтобы иметь возможность сделать что-нибудь интересное убедитесь что вы зарегистрировались в системе, попробуйте имя:admin, пароль:ofbiz.</value>
+        <value xml:lang="th">สำหรับท่านที่สนใจสามารถเข้าสู่ระบบได้, โดยใช้ ชื่อผู้ใช้:admin, รหัสผ่าน:ofbiz</value>
+        <value xml:lang="zh">如果对某部分感兴趣,请先确信你已登录,可以尝试用 用户名:admin、密码:ofbiz登录。</value>
+    </property>
+    <property key="ExampleMultipleDropDownTooltip">
+        <value xml:lang="en">Needs some fields to be set, see in FormWidgetExampleScreens.xml (begins with multipleSelect)</value>
+        <value xml:lang="fr">Nécessite de définir certains champs, voir dans FormWidgetExampleScreens.xml (commence avec multipleSelect)</value>
+    </property>
+    <property key="ExampleMultipleDropDowns">
+        <value xml:lang="en">Multiple drop-downs</value>
+        <value xml:lang="fr">liste déroulante avec choix multiples</value>
+    </property>
+    <property key="ExampleNewExample">
+        <value xml:lang="en">New Example</value>
+        <value xml:lang="fr">Nouvel exemple</value>
+        <value xml:lang="it">Nuovo Esempio</value>
+        <value xml:lang="ro">Nou Exemplu</value>
+        <value xml:lang="ru">Новый пример</value>
+        <value xml:lang="th">ตัวอย่างใหม่</value>
+        <value xml:lang="zh">新建样例</value>
+    </property>
+    <property key="ExampleNewExampleFeature">
+        <value xml:lang="en">New Example Feature</value>
+        <value xml:lang="fr">Nouvelle caractéristique exemple</value>
+        <value xml:lang="it">Nuova Caratteristica Esempio</value>
+        <value xml:lang="ro">Noua Caracteristica Exemplu</value>
+        <value xml:lang="ru">Новая особенность примера</value>
+        <value xml:lang="th">ลักษณะตัวอย่างใหม่</value>
+        <value xml:lang="zh">新建样例特征</value>
+    </property>
+    <property key="ExampleNoAttributeSet">
+        <value xml:lang="en">No SpecificTitle attribute set for this portlet. You can use the Portlet attribute editing button to set them.</value>
+        <value xml:lang="it">Non si è specificato nessun valore per l'attributo SpecificTitle in questo Portlet. Utilizza la funzione editing dei parametri per impostarlo.</value>
+    </property>
+    <property key="ExampleOriginalExample">
+        <value xml:lang="en">Original Example</value>
+        <value xml:lang="fr">Exemple original</value>
+        <value xml:lang="it">Esempio originale</value>
+        <value xml:lang="ru">Оригинальный пример</value>
+        <value xml:lang="th">ตัวอย่างเดิม</value>
+        <value xml:lang="zh">原样例</value>
+    </property>
+    <property key="ExamplePermissionError">
+        <value xml:lang="en">Security Error: to run ${resourceDescription} you must have the EXAMPLE_${mainAction} or EXAMPLE_ADMIN permission</value>
+        <value xml:lang="fr">Erreur de sécurité : pour exécuter ${resourceDescription} vous devez avoir l'autorisation EXAMPLE_${mainAction} ou EXAMPLE_ADMIN</value>
+        <value xml:lang="it">Errore Sicurezza: per eseguire ${resourceDescription} tu devi avere il permesso EXAMPLE${mainAction} o EXAMPLE_ADMIN</value>
+        <value xml:lang="ro">Eroare Siguranta: pentru executare ${resourceDescription} trebuie sa ai permisul EXAMPLE${mainAction} sau EXAMPLE_ADMIN</value>
+        <value xml:lang="ru">Ошибка безопасности: для выполнения ${resourceDescription} у вас должны быть права EXAMPLE_${mainAction} или EXAMPLE_ADMIN</value>
+        <value xml:lang="th">ข้อผิดพลาดในส่วนของความปลอดภัย: ในการรัน ${resourceDescription} คุณต้องได้รับอนุญาตจาก EXAMPLE_${mainAction} หรือ EXAMPLE_ADMIN ก่อน</value>
+        <value xml:lang="zh">安全错误: 要运行${methodShortDescription},你必须具有EXAMPLE${securityAction}或EXAMPLE_ADMIN权限</value>
+    </property>
+    <property key="ExamplePermissionMainActionAttributeMissing">
+        <value xml:lang="en">In the permission-service element for the exampleGenericPermission service the main-action attribute was missing but is required</value>
+        <value xml:lang="it">Nell'elemento permission-service per il servizio exampleGenericPermission l'attributo è mancancate ma è richiesto</value>
+    </property>
+    <property key="ExamplePointAddress">
+        <value xml:lang="en">Geolocation via address</value>
+        <value xml:lang="fr">Géolocalisation par l'adresse</value>
+    </property>
+    <property key="ExamplePortletAttributNeedToBeDefineClickHere">
+        <value xml:lang="en">Portlet Attribut need to be define, click here to resolve it </value>
+        <value xml:lang="fr">Les attributs de la portlet doivent être definie. Cliquez ici pour résoudre le problème.</value>
+    </property>
+    <property key="ExamplePortletFirst">
+        <value xml:lang="en">Hi, this is a first example of portlet</value>
+        <value xml:lang="it">Salve, questo è il primo esempio di portlet</value>
+        <value xml:lang="zh">你好,这是第一个Portlet样例</value>
+    </property>
+    <property key="ExamplePortletGoToConfiguredPortalPage">
+        <value xml:lang="en">Go to configured portal page -&gt; </value>
+        <value xml:lang="fr">Allez à la page portail configurée -&gt; </value>
+    </property>
+    <property key="ExamplePortletSecond">
+        <value xml:lang="en">Hi, this is a second example of portlet</value>
+        <value xml:lang="it">Salve, questo è il secondo esempio di portlet</value>
+        <value xml:lang="zh">你好,这是第二个Portlet样例</value>
+    </property>
+    <property key="ExamplePortletSpecificSubTitle">
+        <value xml:lang="en">Specific Sub Title</value>
+        <value xml:lang="it">Sotto-titolo specifico</value>
+        <value xml:lang="zh">指定的子标题</value>
+    </property>
+    <property key="ExamplePortletSpecificTitle">
+        <value xml:lang="en">Specific Title</value>
+        <value xml:lang="it">Titolo specifico</value>
+        <value xml:lang="zh">指定的标题</value>
+    </property>
+    <property key="ExamplePortletThird">
+        <value xml:lang="en">Hi, this is a third example of portlet with editable parameters.</value>
+        <value xml:lang="it">Salve, questo è il terzo esempio di portlet con parametri modificabili.</value>
+        <value xml:lang="zh">你好,这是第三个Portlet样例,具有编辑参数。</value>
+    </property>
+    <property key="ExamplePrintButton">
+        <value xml:lang="en">Print Button</value>
+        <value xml:lang="it">Bottone di stampa</value>
+        <value xml:lang="zh">打印按钮</value>
+    </property>
+    <property key="ExampleRepositoryFile">
+        <value xml:lang="de">Datei</value>
+        <value xml:lang="en">File</value>
+    </property>
+    <property key="ExampleRepositoryFolder">
+        <value xml:lang="de">Ordner</value>
+        <value xml:lang="en">Folder</value>
+    </property>
+    <property key="ExampleRepositoryMessage">
+        <value xml:lang="de">Text Nachricht</value>
+        <value xml:lang="en">Text message</value>
+    </property>
+    <property key="ExampleRepositoryNode">
+        <value xml:lang="de">Knoten</value>
+        <value xml:lang="en">Node</value>
+    </property>
+    <property key="ExampleScanRepositoryStrukture">
+        <value xml:lang="de">Repository Struktur überprüfen</value>
+        <value xml:lang="en">Scan repository structure</value>
+    </property>
+    <property key="ExampleSelectionBoxes">
+        <value xml:lang="en">Selection boxes</value>
+        <value xml:lang="fr">Boutons de sélection</value>
+    </property>
+    <property key="ExampleSourceCode">
+        <value xml:lang="en">Source Code</value>
+        <value xml:lang="it">Codice sorgente</value>
+        <value xml:lang="zh">源代码</value>
+    </property>
+    <property key="ExampleTextDescription">
+        <value xml:lang="en">This example text means we are in the extended form.</value>
+        <value xml:lang="it">Questo testo di esempio significa che noi siamo nella form estesa di esempio.</value>
+        <value xml:lang="zh">这个样例文本意味着我们处于扩展表单中。</value>
+    </property>
+    <property key="ExampleToDo">
+        <value xml:lang="en">Explanation TODO</value>
+        <value xml:lang="fr">Explication à faire</value>
+        <value xml:lang="it">DA FARE</value>
+        <value xml:lang="zh">待实现</value>
+    </property>
+    <property key="ExampleViewPermissionError">
+        <value xml:lang="en">You do not have permission to view this page. ("EXAMPLE_VIEW" or "EXAMPLE_ADMIN" needed)</value>
+        <value xml:lang="fr">Vous n'avez pas l'autorisation de voir cette page ("EXAMPLE_VIEW" ou "EXAMPLE_ADMIN" nécessaire)</value>
+        <value xml:lang="it">Tu non sei autorizzare a vedere questa pagina. (Permesso "EXAMPLE_VIEW" o "EXAMPLE_ADMIN" necessario)</value>
+        <value xml:lang="ro">Nu esti autorizat sa vezi aceasta pagina. (Este necesar Permisul "EXAMPLE_VIEW" sau "EXAMPLE_ADMIN")</value>
+        <value xml:lang="ru">У вас нет прав для просмотра этой страницы. (необходимы права "EXAMPLE_VIEW" или "EXAMPLE_ADMIN")</value>
+        <value xml:lang="th">คุณไม่ได้รับอนุญาตให้เข้าดูหน้านี้ได้ (หน้า "EXAMPLE_VIEW" หรือ "EXAMPLE_ADMIN" ที่ต้องการ)</value>
+        <value xml:lang="zh">你没有浏览这个页面的权限。(需要"EXAMPLE_VIEW"或"EXAMPLE_ADMIN")</value>
+    </property>
+    <property key="ExampleWelcome">
+        <value xml:lang="en">Welcome to the Example application!</value>
+        <value xml:lang="fr">Bienvenue dans l'application exemple</value>
+        <value xml:lang="it">Benvenuto nell'Applicazione Esempi!</value>
+        <value xml:lang="ro">Bine ai venit in Aplicatia Exemple!</value>
+        <value xml:lang="ru">Добро пожаловать в учебное приложение Пример!</value>
+        <value xml:lang="th">ยินดีต้อนรับสู่ตัวอย่างโปรแกรม!</value>
+        <value xml:lang="zh">欢迎使用样例应用!</value>
+    </property>
+    <property key="FormFieldTitle_anotherDate">
+        <value xml:lang="en">Another Date</value>
+        <value xml:lang="fr">Une autre date</value>
+        <value xml:lang="it">Altra Data</value>
+        <value xml:lang="th">วันที่อื่น ๆ</value>
+        <value xml:lang="zh">另一个日期</value>
+    </property>
+    <property key="FormFieldTitle_anotherText">
+        <value xml:lang="en">Another Text</value>
+        <value xml:lang="fr">Un autre texte</value>
+        <value xml:lang="it">Altro testo</value>
+        <value xml:lang="th">ตัวหนังสืออื่น ๆ</value>
+        <value xml:lang="zh">另一个文本</value>
+    </property>
+    <property key="FormFieldTitle_displayAnotherText">
+        <value xml:lang="en">Another Text</value>
+        <value xml:lang="it">Testo alternativo</value>
+        <value xml:lang="zh">另一个文本</value>
+    </property>
+    <property key="FormFieldTitle_exampleDate">
+        <value xml:lang="en">Example Date</value>
+        <value xml:lang="fr">Exemple de date</value>
+        <value xml:lang="it">Esempio Data</value>
+        <value xml:lang="ro">Data Exemplu</value>
+        <value xml:lang="ru">Дата примера</value>
+        <value xml:lang="th">ตัวอย่างวันที่</value>
+        <value xml:lang="zh">样例日期</value>
+    </property>
+    <!-- Form Field Labels -->
+    <property key="FormFieldTitle_exampleName">
+        <value xml:lang="en">Example Name</value>
+        <value xml:lang="fr">Nom d'exemple</value>
+        <value xml:lang="it">Nome Esempio</value>
+        <value xml:lang="ro">Nume Exemplu</value>
+        <value xml:lang="ru">Имя примера</value>
+        <value xml:lang="th">ตัวอย่างชื่อ</value>
+        <value xml:lang="zh">样例名称</value>
+    </property>
+    <property key="FormFieldTitle_exampleSize">
+        <value xml:lang="en">Example Size</value>
+        <value xml:lang="fr">Exemple de taille</value>
+        <value xml:lang="it">Esempio Taglia</value>
+        <value xml:lang="ro">Marime-size Exemplu</value>
+        <value xml:lang="ru">Размер примера</value>
+        <value xml:lang="th">ตัวอย่างขนาด</value>
+        <value xml:lang="zh">样例尺寸</value>
+    </property>
+    <property key="FormFieldTitle_exampleText">
+        <value xml:lang="en">Example Text</value>
+        <value xml:lang="it">Testo esempio</value>
+        <value xml:lang="zh">样例文本</value>
+    </property>
+    <property key="PageTitleEditExample">
+        <value xml:lang="en">Edit Example</value>
+        <value xml:lang="fr">Modifier l'exemple</value>
+        <value xml:lang="it">Aggiorna Esempio</value>
+        <value xml:lang="ro">Actualizeaza Exemplu</value>
+        <value xml:lang="ru">Изменить пример</value>
+        <value xml:lang="th">แก้ไขตัวอย่าง</value>
+        <value xml:lang="zh">编辑样例</value>
+    </property>
+    <property key="PageTitleEditExampleFeature">
+        <value xml:lang="en">Edit Example Feature</value>
+        <value xml:lang="fr">Modifier la caractéristique de l'exemple</value>
+        <value xml:lang="it">Aggiorna Caratteristica Esempio</value>
+        <value xml:lang="ro">Actualizeaza Caracteristica Exemplu</value>
+        <value xml:lang="ru">Изменить особенности примера</value>
+        <value xml:lang="th">แก้ไขลักษณะตัวอย่าง</value>
+        <value xml:lang="zh">编辑样例特征</value>
+    </property>
+    <property key="PageTitleEditExampleFeatureAppls">
+        <value xml:lang="en">Edit Example Features</value>
+        <value xml:lang="fr">Modifier les caractéristiques de l'exemple</value>
+        <value xml:lang="it">Aggiorna Caratteristiche Esempio</value>
+        <value xml:lang="ro">Actualizeaza Carateristici Exemplu</value>
+        <value xml:lang="ru">Изменить особенность примера</value>
+        <value xml:lang="th">แก้ไขลักษณะตัวอย่าง</value>
+        <value xml:lang="zh">编辑样例特征</value>
+    </property>
+    <property key="PageTitleEditExampleFeatureExampleAppls">
+        <value xml:lang="en">Edit Example Feature Examples</value>
+        <value xml:lang="fr">Modifier la caractéristique exemple des exemples</value>
+        <value xml:lang="it">Aggiorna Esempio Caratteristica Esempi</value>
+        <value xml:lang="ro">Actualizeaza Exemplu Caratteristica Exemple</value>
+        <value xml:lang="ru">Изменить примеры особенностей</value>
+        <value xml:lang="th">แก้ไขตัวอย่างลักษณะตัวอย่าง</value>
+        <value xml:lang="zh">编辑样例特征的样例</value>
+    </property>
+    <property key="PageTitleEditExampleItems">
+        <value xml:lang="en">Edit Example Items</value>
+        <value xml:lang="fr">Modifier la ligne de l'exemple</value>
+        <value xml:lang="it">Aggiorna Righe Esempio</value>
+        <value xml:lang="ro">Actualizeaza Linii Exemplu</value>
+        <value xml:lang="ru">Изменить позиции примера</value>
+        <value xml:lang="th">แก้ไขสินค้าตัวอย่าง</value>
+        <value xml:lang="zh">编辑样例明细</value>
+    </property>
+    <property key="PageTitleExampleJackrabbit">
+        <value xml:lang="de">Jackrabbit</value>
+        <value xml:lang="en">Jackrabbit</value>
+    </property>
+    <!-- Page Titles -->
+    <property key="PageTitleFindExample">
+        <value xml:lang="en">Find Example</value>
+        <value xml:lang="fr">Recherche d'un exemple</value>
+        <value xml:lang="it">Ricerca Esempio</value>
+        <value xml:lang="ro">Cauta Exemplu</value>
+        <value xml:lang="ru">Найти пример</value>
+        <value xml:lang="th">ค้นหาตัวอย่าง</value>
+        <value xml:lang="zh">查找样例</value>
+    </property>
+    <property key="PageTitleFindExampleFeature">
+        <value xml:lang="en">Find Example Feature</value>
+        <value xml:lang="fr">Rechercher la caractéristique de l'exemple</value>
+        <value xml:lang="it">Ricerca Caratteristica Esempio</value>
+        <value xml:lang="ro">Cauta Caracteristica Exemplu</value>
+        <value xml:lang="ru">Найти особенность примера</value>
+        <value xml:lang="th">ค้นหาลักษณะตัวอย่าง</value>
+        <value xml:lang="zh">查找样例特征</value>
+    </property>
+    <property key="PageTitleFormWidgetExamples">
+        <value xml:lang="en">Form Widget Examples</value>
+        <value xml:lang="fr">Exemples Form Widget</value>
+        <value xml:lang="it">Esempio form widget</value>
+        <value xml:lang="th">ตัวอย่าง Widget</value>
+        <value xml:lang="zh">表单挂件样例</value>
+    </property>
+    <property key="PageTitleLookupExampleFeature">
+        <value xml:lang="en">Lookup Example Feature</value>
+        <value xml:lang="fr">Rechercher une ou des caractéristiques exemple</value>
+        <value xml:lang="it">Ricerca Caratteristica Esempio</value>
+        <value xml:lang="ro">Cauta Caracteristica Exemplu</value>
+        <value xml:lang="ru">Искать особенности примера</value>
+        <value xml:lang="th">ดูลักษณะตัวอย่าง</value>
+        <value xml:lang="zh">查找样例特征</value>
+    </property>
+    <property key="YouChangedTheSelectBoxValue">
+        <value xml:lang="de">Sie haben den Wert in der Select Box geändert.</value>
+        <value xml:lang="en">You have changed the value in the select box</value>
+    </property>
+</resource>
diff --git a/framework/example/config/config.txt b/framework/example/config/config.txt
new file mode 100644
index 0000000..115f4ac
--- /dev/null
+++ b/framework/example/config/config.txt
@@ -0,0 +1,21 @@
+#####################################################################
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#####################################################################
+
+This directory is usually placed on the classpath for configuration and
+property files.
diff --git a/framework/example/data/ExampleDemoData.xml b/framework/example/data/ExampleDemoData.xml
new file mode 100644
index 0000000..08c602f
--- /dev/null
+++ b/framework/example/data/ExampleDemoData.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+<entity-engine-xml>
+    <ExampleType exampleTypeId="REAL_WORLD" description="Real World" parentTypeId=""/>
+    <ExampleType exampleTypeId="MADE_UP" description="Made Up" parentTypeId=""/>
+    <ExampleType exampleTypeId="CONTRIVED" description="Contrived" parentTypeId="MADE_UP"/>
+    <ExampleType exampleTypeId="INSPIRED" description="Inspired" parentTypeId="MADE_UP"/>
+
+    <ExampleFeatureApplType exampleFeatureApplTypeId="REQUIRED" description="Required" parentTypeId=""/>
+    <ExampleFeatureApplType exampleFeatureApplTypeId="DESIRED" description="Desired" parentTypeId=""/>
+    <ExampleFeatureApplType exampleFeatureApplTypeId="NOT_ALLOWED" description="Not Allowed" parentTypeId=""/>
+
+    <StatusType description="Example" statusTypeId="EXAMPLE_STATUS" hasTable="N" parentTypeId=""/>
+    <StatusItem description="In Design" sequenceId="01" statusCode="IN_DESIGN" statusId="EXST_IN_DESIGN" statusTypeId="EXAMPLE_STATUS"/>
+    <StatusItem description="Defined" sequenceId="02" statusCode="DEFINED" statusId="EXST_DEFINED" statusTypeId="EXAMPLE_STATUS"/>
+    <StatusItem description="Approved" sequenceId="03" statusCode="APPROVED" statusId="EXST_APPROVED" statusTypeId="EXAMPLE_STATUS"/>
+    <StatusItem description="Implemented" sequenceId="04" statusCode="IMPLEMENTED" statusId="EXST_IMPLEMENTED" statusTypeId="EXAMPLE_STATUS"/>
+    <StatusItem description="Tested" sequenceId="05" statusCode="TESTED" statusId="EXST_TESTED" statusTypeId="EXAMPLE_STATUS"/>
+    <StatusItem description="Complete" sequenceId="06" statusCode="COMPLETE" statusId="EXST_COMPLETE" statusTypeId="EXAMPLE_STATUS"/>
+    <StatusItem description="Cancelled" sequenceId="99" statusCode="CANCELLED" statusId="EXST_CANCELLED" statusTypeId="EXAMPLE_STATUS"/>
+    <StatusValidChange condition="" statusId="EXST_IN_DESIGN" statusIdTo="EXST_DEFINED" transitionName="Definition Complete"/>
+    <StatusValidChange condition="" statusId="EXST_DEFINED" statusIdTo="EXST_APPROVED" transitionName="Approve"/>
+    <StatusValidChange condition="" statusId="EXST_APPROVED" statusIdTo="EXST_IMPLEMENTED" transitionName="Implementation Complete"/>
+    <StatusValidChange condition="" statusId="EXST_IMPLEMENTED" statusIdTo="EXST_TESTED" transitionName="Testing Complete"/>
+    <StatusValidChange condition="" statusId="EXST_TESTED" statusIdTo="EXST_COMPLETE" transitionName="Example Completed"/>
+    <StatusValidChange condition="" statusId="EXST_IN_DESIGN" statusIdTo="EXST_CANCELLED" transitionName="Cancel Example"/>
+    <StatusValidChange condition="" statusId="EXST_DEFINED" statusIdTo="EXST_CANCELLED" transitionName="Cancel Example"/>
+    <StatusValidChange condition="" statusId="EXST_APPROVED" statusIdTo="EXST_CANCELLED" transitionName="Cancel Example"/>
+    <StatusValidChange condition="" statusId="EXST_IMPLEMENTED" statusIdTo="EXST_CANCELLED" transitionName="Cancel Example"/>
+    <StatusValidChange condition="" statusId="EXST_TESTED" statusIdTo="EXST_CANCELLED" transitionName="Cancel Example"/>
+
+    <EnumerationType description="Example Feature Source" enumTypeId="EXMPL_FEAT_SOURCE" hasTable="N" parentTypeId=""/>
+    <Enumeration description="Customer" enumCode="CUSTOMER" enumId="EXFTSRC_CUSTOMER" sequenceId="01" enumTypeId="EXMPL_FEAT_SOURCE"/>
+    <Enumeration description="Partner" enumCode="PARTNER" enumId="EXFTSRC_PARTNER" sequenceId="02" enumTypeId="EXMPL_FEAT_SOURCE"/>
+    <Enumeration description="Employee" enumCode="EMPLOYEE" enumId="EXFTSRC_EMPLOYEE" sequenceId="03" enumTypeId="EXMPL_FEAT_SOURCE"/>
+
+    <Example exampleId="EX01" exampleName="Example 1" exampleTypeId="CONTRIVED" statusId="EXST_IN_DESIGN"/>
+    <Example exampleId="EX02" exampleName="Example 2" exampleTypeId="CONTRIVED" statusId="EXST_IN_DESIGN"/>
+    <Example exampleId="EX03" exampleName="Example 3" exampleTypeId="CONTRIVED" statusId="EXST_IN_DESIGN"/>
+    <Example exampleId="EX04" exampleName="Example 4" exampleTypeId="REAL_WORLD" statusId="EXST_IN_DESIGN"/>
+    <Example exampleId="EX05" exampleName="Example 5" exampleTypeId="REAL_WORLD" statusId="EXST_IN_DESIGN"/>
+    <Example exampleId="EX06" exampleName="Example 6" exampleTypeId="MADE_UP" statusId="EXST_IN_DESIGN"/>
+    <Example exampleId="EX07" exampleName="Example 7" exampleTypeId="MADE_UP" statusId="EXST_IN_DESIGN"/>
+    <Example exampleId="EX08" exampleName="Example 8" exampleTypeId="MADE_UP" statusId="EXST_IN_DESIGN"/>
+    <Example exampleId="EX09" exampleName="Example 9" exampleTypeId="MADE_UP" statusId="EXST_IN_DESIGN"/>
+    <Example exampleId="EX10" exampleName="Example 10" exampleTypeId="MADE_UP" statusId="EXST_IN_DESIGN"/>
+    <Example exampleId="EX11" exampleName="Example 11" exampleTypeId="INSPIRED" statusId="EXST_IN_DESIGN"/>
+    <Example exampleId="EX12" exampleName="Example 12" exampleTypeId="INSPIRED" statusId="EXST_IN_DESIGN"/>
+
+    <!-- example test suite -->
+    <SeleniumTestSuitePath testSuiteId="EXAMPLE_TESTSUITE" testSuiteName="example_testsuite" testSuiteType="XML" testSuitePath="framework/testtools/testdef/seleniumxml/example/example_testsuite.xml" description="test suite for example component"/>
+    <SeleniumTestSuitePath testSuiteId="EX_HTML_TESTSUITE" testSuiteName="example_html_testsuite" testSuiteType="HTML" testSuitePath="framework/example/testdef/selenium/testSuite.html" description="HTML test suite for example component"/>
+</entity-engine-xml>
diff --git a/framework/example/data/ExampleHelpData.xml b/framework/example/data/ExampleHelpData.xml
new file mode 100644
index 0000000..bb3adfa
--- /dev/null
+++ b/framework/example/data/ExampleHelpData.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+<entity-engine-xml>
+
+<!--
+    The Example help data is located in the applications/content/data/ExampleHelpData.xml file
+-->
+
+</entity-engine-xml>
diff --git a/framework/example/data/ExamplePortalSeedData.xml b/framework/example/data/ExamplePortalSeedData.xml
new file mode 100644
index 0000000..43c3742
--- /dev/null
+++ b/framework/example/data/ExamplePortalSeedData.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<entity-engine-xml>
+    <!-- PortalPortlet Seed Data: system pages -->
+    <PortalPage portalPageId="EXAMPLE" sequenceNum="0" portalPageName="Example Portal Page" description="The default example OFBiz portal page" ownerUserLoginId="_NA_"/>
+    <PortalPageColumn portalPageId="EXAMPLE" columnSeqId="00001" columnWidthPixels="400"/>
+    <PortalPageColumn portalPageId="EXAMPLE" columnSeqId="00002"/><!-- no width in pixels or percent, use the rest of the space available -->
+    <PortalPagePortlet portalPageId="EXAMPLE" portalPortletId="EXAMPLE_1" portletSeqId="00001" columnSeqId="00001" sequenceNum="0"/>
+    <PortalPagePortlet portalPageId="EXAMPLE" portalPortletId="EXAMPLE_3" portletSeqId="00001" columnSeqId="00002" sequenceNum="1"/>
+
+    <PortalPage portalPageId="EXAMPLE1" sequenceNum="100" parentPortalPageId="EXAMPLE" portalPageName="Example Portal Page 1" description="Portal page 1" ownerUserLoginId="_NA_"/>
+    <PortalPageColumn portalPageId="EXAMPLE1" columnSeqId="00001"/>
+    <PortalPagePortlet portalPageId="EXAMPLE1" portalPortletId="EXAMPLE_1" portletSeqId="00001" columnSeqId="00001" sequenceNum="1"/>
+
+    <PortalPage portalPageId="EXAMPLE2"  sequenceNum="200" parentPortalPageId="EXAMPLE" portalPageName="Example Portal Page 2" description="Portal page 2" ownerUserLoginId="_NA_"/>
+    <PortalPageColumn portalPageId="EXAMPLE2" columnSeqId="00001"/>
+    <PortalPagePortlet portalPageId="EXAMPLE2" portalPortletId="EXAMPLE_1" portletSeqId="00001" columnSeqId="00001" sequenceNum="1"/>
+</entity-engine-xml>
diff --git a/framework/example/data/ExamplePortletData.xml b/framework/example/data/ExamplePortletData.xml
new file mode 100644
index 0000000..b0a857c
--- /dev/null
+++ b/framework/example/data/ExamplePortletData.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+<entity-engine-xml>
+    <PortalPortlet portalPortletId="EXAMPLE_1" portletName="Example 1" description="Example portlet n. 1"
+        screenName="ExamplePortlet1" screenLocation="component://example/widget/example/PortletScreens.xml"
+        editFormName="ExamplePortlet1Edit" editFormLocation="component://example/widget/example/PortletEditForms.xml"
+        screenshot="/images/ofbiz_logo.gif"/>
+
+    <PortalPortlet portalPortletId="EXAMPLE_2" portletName="Example 2" description="Example portlet n. 2"
+        screenName="ExamplePortlet2" screenLocation="component://example/widget/example/PortletScreens.xml"
+        editFormName="ExamplePortlet2Edit" editFormLocation="component://example/widget/example/PortletEditForms.xml"
+        screenshot="/images/opentravelsystem_logo.jpg"/>
+
+    <PortalPortlet portalPortletId="EXAMPLE_3" portletName="Example 3" description="Example portlet n. 3"
+        screenName="ExamplePortlet3" screenLocation="component://example/widget/example/PortletScreens.xml"
+        editFormName="ExamplePortlet3Edit" editFormLocation="component://example/widget/example/PortletEditForms.xml"/>
+
+    <PortletCategory portletCategoryId="EXAMPLE" description="Example Portlet(s)"/>
+    <PortletPortletCategory portalPortletId="EXAMPLE_1" portletCategoryId="EXAMPLE"/>
+    <PortletPortletCategory portalPortletId="EXAMPLE_2" portletCategoryId="EXAMPLE"/>
+    <PortletPortletCategory portalPortletId="EXAMPLE_3" portletCategoryId="EXAMPLE"/>
+</entity-engine-xml>
diff --git a/framework/example/data/ExampleSecurityData.xml b/framework/example/data/ExampleSecurityData.xml
new file mode 100644
index 0000000..93b9fad
--- /dev/null
+++ b/framework/example/data/ExampleSecurityData.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+<entity-engine-xml>
+    <!-- Example security -->
+    <SecurityPermission description="View operations in the Example Management Screens." permissionId="EXAMPLE_VIEW"/>
+    <SecurityPermission description="Create operations in the Example Management Screens." permissionId="EXAMPLE_CREATE"/>
+    <SecurityPermission description="Update operations in the Example Management Screens." permissionId="EXAMPLE_UPDATE"/>
+    <SecurityPermission description="Delete operations in the Example Management Screens." permissionId="EXAMPLE_DELETE"/>
+    <SecurityPermission description="ALL operations in the Example Management Screens." permissionId="EXAMPLE_ADMIN"/>
+    <SecurityGroupPermission groupId="FULLADMIN" permissionId="EXAMPLE_ADMIN"/>
+    <SecurityGroupPermission groupId="FLEXADMIN" permissionId="EXAMPLE_CREATE"/>
+    <SecurityGroupPermission groupId="FLEXADMIN" permissionId="EXAMPLE_DELETE"/>
+    <SecurityGroupPermission groupId="FLEXADMIN" permissionId="EXAMPLE_UPDATE"/>
+    <SecurityGroupPermission groupId="FLEXADMIN" permissionId="EXAMPLE_VIEW"/>
+    <SecurityGroupPermission groupId="VIEWADMIN" permissionId="EXAMPLE_VIEW"/>
+    <SecurityGroupPermission groupId="BIZADMIN" permissionId="EXAMPLE_ADMIN"/>
+</entity-engine-xml>
diff --git a/framework/example/data/ExampleTypeData.xml b/framework/example/data/ExampleTypeData.xml
new file mode 100644
index 0000000..58393d4
--- /dev/null
+++ b/framework/example/data/ExampleTypeData.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+<entity-engine-xml>
+
+</entity-engine-xml>
diff --git a/framework/example/data/helpdata/HELP_EXAMPLE.xml b/framework/example/data/helpdata/HELP_EXAMPLE.xml
new file mode 100644
index 0000000..ae4fb90
--- /dev/null
+++ b/framework/example/data/helpdata/HELP_EXAMPLE.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to you 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.
+-->
+<section xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    version="5.0" xmlns:xl="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude"
+    xsi:schemaLocation="http://docbook.org/ns/docbook ../../../../applications/content/dtd/docbook.xsd"
+    xmlns="http://docbook.org/ns/docbook">
+  <title>The Example Main Help page.</title>
+  <para>
+    The Example application will allow you to discover the possibilities to create an application, with a lot of search boxes, lists and many more.</para>
+  <para>This application could be used to have an example of the bests practices in user interface development in Apache - OFBiz.</para>
+  <para>Look help for each example screen, help will explain which part of development is used in this case.</para>
+  <para>For example, if you want to see how you should do to add some help you can look to help files in data/helpdata directory in example 
+    component and data/ExempleHelpData.xml in content component.</para>
+
+  <section>
+    <title>Help file organization</title>
+    <para>Help is managed by using content component functionality.</para>
+    <para>Help can be for :
+      <itemizedlist>
+        <listitem><para>one component or sub-component, access is possible by navigation in help index tree and select it, contentId is associated to
+          HELP_ROOT with contentAssocTypeId="TREE_CHILD" ;</para></listitem>
+        <listitem><para>one screen, access is done by help icon in screen (most of time on top), contentId is search on ContentAssoc.mapKey with 
+          a value (helpTopic) build with component webSite and uri used to show this screen ;</para></listitem>
+        <listitem><para>one portlet, access is done by a link on the portalPages (which contain this portlet) help, link is a showHelp (like 
+          for a screen) with helpTopic build with "HELP_" and portletId</para></listitem>
+       <listitem><para>one portal page, access is done by help icon if parameters.portalPageId is not empty, contentId is read on PortalPage
+          (or originalPortalPage if exist) and is show on top of portlet list contain on it.</para></listitem>
+      </itemizedlist>
+    </para>
+  </section>
+
+  <section>
+    <title>Development help sub-subject</title>
+    <para>To have the complete list you should click on index button and look to example tree option, but here is a list of
+      main shortcut :
+      <itemizedlist>
+        <listitem><para>How is organize <link xl:href="showHelp?helpTopic=DOCUMENTATION_SYSTEM">The Apache OFBiz documentation system</link></para></listitem>
+        <listitem><para><link xl:href="showHelp?helpTopic=EXAMPLE_docbook">What it's possible to do in help file</link></para></listitem>
+      </itemizedlist>
+    </para>
+  </section>
+</section>
diff --git a/framework/example/data/helpdata/HELP_EXAMPLE_FR.xml b/framework/example/data/helpdata/HELP_EXAMPLE_FR.xml
new file mode 100644
index 0000000..3298c89
--- /dev/null
+++ b/framework/example/data/helpdata/HELP_EXAMPLE_FR.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to you 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.
+-->
+<section xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    version="5.0" xmlns:xl="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude"
+    xsi:schemaLocation="http://docbook.org/ns/docbook ../../../../applications/content/dtd/docbook.xsd"
+    xmlns="http://docbook.org/ns/docbook">
+    <title>Page principale de l'aide du composant Exemple</title>
+    <para>
+      L'application exemple vous permet de découvrir les possibilités pour créer une application contenant, entre autres, des
+      boîtes de recherche, des listes et beaucoup d'autres choses.
+    </para>
+    <para>
+      Cette application peut être utilisée pour avoir un aperçu des bonnes pratiques d'interface utilisateur pour OFBiz.</para>
+    <para>
+      Par exemple, si vous voulez voir comment vous pouvez ajouter des textes d'aide, vous pouvez regarder les fichiers contenus dans le
+      répertoire data/heldata dans le composant Example et dans le fichier contenu dans data/ExempleHelpData.xml au niveau de l'application
+      content
+    </para>
+
+    <section>
+      <title>Sous-menus dans l'aide</title>
+      <para>
+        Pour avoir la liste complète, cliquez sur le bouton "Index" et regardez l'arborescence de l'aide. Voici aussi une liste
+        de raccourcis :
+        <itemizedlist>
+          <listitem><para>Comment fonctionne <link xl:href="showHelp?helpTopic=DOCUMENTATION_SYSTEM">le système de documentation d'Apache OFBiz</link></para></listitem>
+          <listitem><para><link xl:href="showHelp?helpTopic=EXAMPLE_docbook">Ce qu'il est possible de faire dans les fichiers d'aide</link></para></listitem>
+        </itemizedlist>
+      </para>
+    </section>
+</section>
diff --git a/framework/example/data/helpdata/HELP_EXAMPLE_docbook.xml b/framework/example/data/helpdata/HELP_EXAMPLE_docbook.xml
new file mode 100644
index 0000000..21dbb54
--- /dev/null
+++ b/framework/example/data/helpdata/HELP_EXAMPLE_docbook.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+<section xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="5.0"
+    xmlns:xl="http://www.w3.org/1999/xlink"
+    xmlns:xi="http://www.w3.org/2001/XInclude"
+    xsi:schemaLocation="http://docbook.org/ns/docbook ../../../../applications/content/dtd/docbook.xsd"
+    xmlns="http://docbook.org/ns/docbook">
+
+    <title>Help on writing docBook documents</title>
+    <section>
+        <title>Example of an ordered list</title>
+        <para>The orderedlist will put numbers in front of each item.</para>
+        <orderedlist>
+            <listitem><para>First item of my list</para></listitem>
+            <listitem><para>Second item</para></listitem>
+            <listitem><para>Third...</para></listitem>
+            <listitem><para>4th...</para></listitem>
+            <listitem><para>and this can go longer...</para></listitem>
+        </orderedlist>
+    </section>
+    <section>
+        <title>Example of an itemized list</title>
+        <para>The itemizedlist will put a bullet in front of each item.</para>
+        <itemizedlist>
+            <listitem><para>First item of my list</para></listitem>
+            <listitem><para>Second item</para></listitem>
+            <listitem><para>Third...</para></listitem>
+            <listitem><para>4th...</para></listitem>
+            <listitem><para>and this can go longer...</para></listitem>
+        </itemizedlist>
+    </section>
+
+    <section>
+        <title>Examples of text formatting</title>
+        <caution>
+            <title>Caution title</title>
+            <para>Here is a caution text</para>
+        </caution>
+        <important>
+            <title>Important title</title>
+            <para>Here is an important text</para>
+        </important>
+        <note>
+            <title>Note title</title>
+            <para>Here is a note</para>
+        </note>
+        <tip>
+            <title>Tip title</title>
+            <para>Here is a tip</para>
+        </tip>
+        <warning>
+            <para>Here is a warning</para>
+        </warning>
+    </section>
+</section>
diff --git a/framework/example/data/helpdata/HELP_EXAMPLE_main.xml b/framework/example/data/helpdata/HELP_EXAMPLE_main.xml
new file mode 100644
index 0000000..a421dfc
--- /dev/null
+++ b/framework/example/data/helpdata/HELP_EXAMPLE_main.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to you 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.
+-->
+<section xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    version="5.0" xmlns:xl="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude"
+    xsi:schemaLocation="http://docbook.org/ns/docbook ../../../../applications/content/dtd/docbook.xsd"
+    xmlns="http://docbook.org/ns/docbook">
+    <title>The Example Main page.</title>
+    <para><link xl:href="showHelp?helpTopic=EXAMPLE">About the Example application</link></para>
+    <para>
+        In this page, you can create or search an example
+    </para>
+</section>
diff --git a/framework/example/dtd/dtd.txt b/framework/example/dtd/dtd.txt
new file mode 100644
index 0000000..de6b448
--- /dev/null
+++ b/framework/example/dtd/dtd.txt
@@ -0,0 +1,21 @@
+#####################################################################
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#####################################################################
+
+Place all DTDs / schemas which need to be included on the classpath here.
+All files located in this directory will be placed in the root of the built jar.
diff --git a/framework/example/entitydef/entitydef.txt b/framework/example/entitydef/entitydef.txt
new file mode 100644
index 0000000..70a1482
--- /dev/null
+++ b/framework/example/entitydef/entitydef.txt
@@ -0,0 +1,25 @@
+#####################################################################
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#####################################################################
+
+Entity model, Entity ECA, and Entity group definitions.
+Usually in the format of:
+
+entitymodel.xml
+entitygroup.xml
+eecas.xml
diff --git a/framework/example/entitydef/entitymodel.xml b/framework/example/entitydef/entitymodel.xml
new file mode 100644
index 0000000..fd46394
--- /dev/null
+++ b/framework/example/entitydef/entitymodel.xml
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<entitymodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/entitymodel.xsd">
+    <!-- ========================================================= -->
+    <!-- ======================== Defaults ======================= -->
+    <!-- ========================================================= -->
+    <title>Entity of an Open For Business Project Component</title>
+    <description>None</description>
+    <version>1.0</version>
+    <default-resource-name>ExampleEntityLabels</default-resource-name>
+
+    <!-- ========================================================= -->
+    <!-- ======================== Data Model ===================== -->
+    <!-- The modules in this file are as follows:                  -->
+    <!--  - org.ofbiz.example.example -->
+    <!--  - org.ofbiz.example.feature -->
+    <!-- ========================================================= -->
+
+    <!-- ========================================================= -->
+    <!-- org.ofbiz.example.example -->
+    <!-- ========================================================= -->
+
+    <entity entity-name="Example" package-name="org.ofbiz.example.example" title="Example Entity">
+        <field name="exampleId" type="id-ne"><description>primary sequenced ID</description></field>
+        <field name="exampleTypeId" type="id-ne"></field>
+        <field name="statusId" type="id-ne"></field>
+        <field name="exampleName" type="name"></field>
+        <field name="description" type="description"></field>
+        <field name="longDescription" type="very-long"></field>
+        <field name="comments" type="comment"></field>
+        <field name="exampleSize" type="numeric"></field>
+        <field name="exampleDate" type="date-time"></field>
+        <field name="anotherDate" type="date-time"></field>
+        <field name="anotherText" type="long-varchar"></field>
+        <prim-key field="exampleId"/>
+        <relation type="one" fk-name="EXMPL_TYP" rel-entity-name="ExampleType">
+            <key-map field-name="exampleTypeId"/>
+        </relation>
+        <relation type="one" fk-name="EXMPL_STTS" rel-entity-name="StatusItem">
+            <key-map field-name="statusId"/>
+        </relation>
+    </entity>
+    <entity entity-name="ExampleItem" package-name="org.ofbiz.example.example" title="Example Item Entity">
+        <field name="exampleId" type="id-ne"></field>
+        <field name="exampleItemSeqId" type="id-ne"><description>secondary sequenced ID</description></field>
+        <field name="description" type="description"></field>
+        <field name="amount" type="floating-point"></field>
+        <field name="amountUomId" type="id"></field>
+        <prim-key field="exampleId"/>
+        <prim-key field="exampleItemSeqId"/>
+        <relation type="one" fk-name="EXMPLIT_UOM" title="Amount" rel-entity-name="Uom">
+            <key-map field-name="amountUomId" rel-field-name="uomId"/>
+        </relation>
+        <relation type="one" fk-name="EXMPLIT_EXMP" rel-entity-name="Example">
+            <key-map field-name="exampleId"/>
+        </relation>
+    </entity>
+    <entity entity-name="ExampleStatus" package-name="org.ofbiz.example.example" title="Example Status Entity">
+        <field name="exampleId" type="id-ne"></field>
+        <field name="statusDate" type="date-time"></field>
+        <field name="statusEndDate" type="date-time"></field>
+        <field name="statusId" type="id-ne"></field>
+        <prim-key field="exampleId"/>
+        <prim-key field="statusDate"/>
+        <relation type="one" fk-name="EXMPLST_EXMPL" rel-entity-name="Example">
+            <key-map field-name="exampleId"/>
+        </relation>
+        <relation type="one" fk-name="EXMPLST_STTS" rel-entity-name="StatusItem">
+            <key-map field-name="statusId"/>
+        </relation>
+    </entity>
+    <entity entity-name="ExampleType"
+            package-name="org.ofbiz.example.example"
+            title="Example Type Entity">
+        <field name="exampleTypeId" type="id-ne"></field>
+        <field name="parentTypeId" type="id"></field>
+        <field name="description" type="description"></field>
+        <prim-key field="exampleTypeId"/>
+        <relation type="one" fk-name="EXMPLTP_PAR" rel-entity-name="ExampleType">
+            <key-map field-name="parentTypeId" rel-field-name="exampleTypeId"/>
+        </relation>
+    </entity>
+
+    <!-- ========================================================= -->
+    <!-- org.ofbiz.example.feature -->
+    <!-- ========================================================= -->
+
+    <entity entity-name="ExampleFeature"
+        package-name="org.ofbiz.example.feature"
+        title="Example Feature Entity">
+        <field name="exampleFeatureId" type="id-ne"><description>primary sequenced ID</description></field>
+        <field name="featureSourceEnumId" type="id-ne"></field>
+        <field name="description" type="description"></field>
+        <prim-key field="exampleFeatureId"/>
+        <relation type="one" fk-name="EXFT_ENUM" rel-entity-name="Enumeration">
+            <key-map field-name="featureSourceEnumId" rel-field-name="enumId"/>
+        </relation>
+    </entity>
+    <entity entity-name="ExampleFeatureAppl"
+        package-name="org.ofbiz.example.feature"
+        title="Example Feature Application Entity">
+        <field name="exampleId" type="id-ne"></field>
+        <field name="exampleFeatureId" type="id-ne"></field>
+        <field name="fromDate" type="date-time"></field>
+        <field name="thruDate" type="date-time"></field>
+        <field name="exampleFeatureApplTypeId" type="id-ne"></field>
+        <field name="sequenceNum" type="numeric"></field>
+        <prim-key field="exampleId"/>
+        <prim-key field="exampleFeatureId"/>
+        <prim-key field="fromDate"/>
+        <relation type="one" fk-name="EXFTAP_EXPL" rel-entity-name="Example">
+            <key-map field-name="exampleId"/>
+        </relation>
+        <relation type="one" fk-name="EXFTAP_EXFT" rel-entity-name="ExampleFeature">
+            <key-map field-name="exampleFeatureId"/>
+        </relation>
+        <relation type="one" fk-name="EXFTAP_TYP" rel-entity-name="ExampleFeatureApplType">
+            <key-map field-name="exampleFeatureApplTypeId"/>
+        </relation>
+    </entity>
+    <entity entity-name="ExampleFeatureApplType"
+        package-name="org.ofbiz.example.feature"
+        title="Example Feature Application Type Entity">
+        <field name="exampleFeatureApplTypeId" type="id-ne"></field>
+        <field name="parentTypeId" type="id"></field>
+        <field name="description" type="description"></field>
+        <prim-key field="exampleFeatureApplTypeId"/>
+        <relation type="one" fk-name="EXFTAPTP_PAR" rel-entity-name="ExampleFeatureApplType">
+            <key-map field-name="parentTypeId" rel-field-name="exampleFeatureApplTypeId"/>
+        </relation>
+    </entity>
+</entitymodel>
diff --git a/framework/example/entitydef/entitymodel_view.xml b/framework/example/entitydef/entitymodel_view.xml
new file mode 100644
index 0000000..67d305f
--- /dev/null
+++ b/framework/example/entitydef/entitymodel_view.xml
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<entitymodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/entitymodel.xsd">
+    <!-- ========================================================= -->
+    <!-- ======================== Defaults ======================= -->
+    <!-- ========================================================= -->
+    <title>Entity of an Open For Business Project Component</title>
+    <description>None</description>
+    <version>1.0</version>
+
+    <view-entity entity-name="ExampleStatusDetail" package-name="org.ofbiz.example.example">
+        <member-entity entity-alias="EXPL" entity-name="Example"/>
+        <member-entity entity-alias="EXST" entity-name="ExampleStatus"/>
+        <member-entity entity-alias="STIT" entity-name="StatusItem"/>
+        <alias-all entity-alias="EXPL">
+            <exclude field="statusId"/>
+        </alias-all>
+        <alias-all entity-alias="EXST"/>
+        <alias-all entity-alias="STIT">
+            <exclude field="description"/>
+        </alias-all>
+        <alias name="statusDescription" entity-alias="STIT" field="description"/>
+        <alias entity-alias="EXPL" name="currentStatusId" field="statusId"/>
+        <alias name="statusDelay">
+            <complex-alias operator="-">
+                <complex-alias-field entity-alias="EXST" field="statusDate"/>
+                <complex-alias-field entity-alias="EXPL" field="exampleDate"/>
+            </complex-alias>
+        </alias>
+        <view-link entity-alias="EXPL" rel-entity-alias="EXST">
+            <key-map field-name="exampleId"/>
+        </view-link>
+        <view-link entity-alias="EXST" rel-entity-alias="STIT">
+            <key-map field-name="statusId"/>
+        </view-link>
+    </view-entity>
+
+    <view-entity entity-name="ExampleStatusItem" package-name="org.ofbiz.example.example">
+        <member-entity entity-alias="SI" entity-name="StatusItem"/>
+        <alias-all entity-alias="SI"/>
+        <entity-condition>
+            <condition-expr entity-alias="SI" field-name="statusTypeId" operator="equals" value="EXAMPLE_STATUS"/>
+            <order-by field-name="sequenceId"/>
+        </entity-condition>
+    </view-entity>
+    
+    <!-- Some examples of nested views and conditions for report -->
+    <view-entity entity-name="ExampleFeatureApplAndType" package-name="org.ofbiz.example.example">
+        <member-entity entity-alias="EXFTAP" entity-name="ExampleFeatureAppl"/>
+        <member-entity entity-alias="EXFTAPTP" entity-name="ExampleFeatureApplType"/>
+        <alias-all entity-alias="EXFTAP"/>
+        <alias-all entity-alias="EXFTAPTP"/>
+        <view-link entity-alias="EXFTAP" rel-entity-alias="EXFTAPTP">
+            <key-map field-name="exampleFeatureApplTypeId"/>
+        </view-link>
+    </view-entity>
+    <view-entity entity-name="ExampleFeatureAndApplAndType" package-name="org.ofbiz.example.example">
+        <member-entity entity-alias="EXFT" entity-name="ExampleFeature"/>
+        <member-entity entity-alias="EFAAT" entity-name="ExampleFeatureApplAndType"/>
+        <alias-all entity-alias="EXFT"/>
+        <alias-all entity-alias="EFAAT">
+            <exclude field="description"/>
+        </alias-all>
+        <alias name="typeDescription" entity-alias="EFAAT" field="description"/>
+        <view-link entity-alias="EXFT" rel-entity-alias="EFAAT">
+            <key-map field-name="exampleFeatureId"/>
+        </view-link>
+    </view-entity>
+    <view-entity entity-name="ExampleFeatureAndApplFullView" package-name="org.ofbiz.example.example">
+        <member-entity entity-alias="EX" entity-name="Example"/>
+        <member-entity entity-alias="EFAAAT" entity-name="ExampleFeatureAndApplAndType"/>
+        <alias-all entity-alias="EX"/>
+        <alias-all entity-alias="EFAAAT">
+            <exclude field="description"/>
+        </alias-all>
+        <alias name="featureDescription" entity-alias="EFAAAT" field="description"/>
+        <view-link entity-alias="EX" rel-entity-alias="EFAAAT">
+            <key-map field-name="exampleId"/>
+        </view-link>
+    </view-entity>
+    <view-entity entity-name="ContrivedExamplesWithRequiredFeaturesReport" package-name="org.ofbiz.example.example">
+        <member-entity entity-alias="EFAAFV" entity-name="ExampleFeatureAndApplFullView"/>
+        <alias-all entity-alias="EFAAFV"/>
+        <entity-condition>
+            <condition-list combine="and">
+                <condition-expr field-name="exampleTypeId" value="CONTRIVED"/>
+                <condition-expr field-name="exampleFeatureApplTypeId" value="REQUIRED"/>
+            </condition-list>
+            <order-by field-name="exampleName"/>
+        </entity-condition>
+    </view-entity>
+
+    <!-- example for nested view-entity with conditions on nested views -->
+    <view-entity entity-name="ExampleFeatureApplAndTypeDesired" package-name="org.ofbiz.example.example">
+        <member-entity entity-alias="EXFTAP" entity-name="ExampleFeatureAppl"/>
+        <member-entity entity-alias="EXFTAPTP" entity-name="ExampleFeatureApplType"/>
+        <alias-all entity-alias="EXFTAP"/>
+        <alias-all entity-alias="EXFTAPTP">
+            <exclude field="description"/>
+        </alias-all>
+        <alias name="typeDescription" entity-alias="EXFTAPTP" field="description"/>
+        <view-link entity-alias="EXFTAP" rel-entity-alias="EXFTAPTP">
+            <key-map field-name="exampleFeatureApplTypeId"/>
+        </view-link>
+        <entity-condition>
+            <condition-expr field-name="exampleFeatureApplTypeId" value="DESIRED"/>
+        </entity-condition>
+    </view-entity>
+    <view-entity entity-name="AllExamplesWithDesiredCustomerFeaturesReport" package-name="org.ofbiz.example.example">
+        <member-entity entity-alias="EFAATD" entity-name="ExampleFeatureApplAndTypeDesired"/>
+        <member-entity entity-alias="EXFT" entity-name="ExampleFeature"/>
+        <member-entity entity-alias="EX" entity-name="Example"/>
+        <alias-all entity-alias="EFAATD"/>
+        <alias-all entity-alias="EXFT">
+            <exclude field="description"/>
+        </alias-all>
+        <alias-all entity-alias="EX"/>
+        <alias name="featureDescription" entity-alias="EXFT" field="description"/>
+        <view-link entity-alias="EFAATD" rel-entity-alias="EXFT">
+            <key-map field-name="exampleFeatureId"/>
+        </view-link>
+        <view-link entity-alias="EFAATD" rel-entity-alias="EX">
+            <key-map field-name="exampleId"/>
+        </view-link>
+        <entity-condition>
+            <condition-expr field-name="featureSourceEnumId" value="EXFTSRC_CUSTOMER"/>
+            <order-by field-name="exampleName"/>
+        </entity-condition>
+    </view-entity>
+    <!--example view for creating charts -->
+    <view-entity entity-name="ExampleCountByType" package-name="org.ofbiz.example.example">
+        <member-entity entity-alias="EX" entity-name="Example"/>
+        <alias entity-alias="EX" name="total" field="exampleId" function="count-distinct"/>
+        <alias entity-alias="EX" name="exampleTypeId" group-by="true"/>
+    </view-entity>
+</entitymodel>
diff --git a/framework/example/lib/lib.txt b/framework/example/lib/lib.txt
new file mode 100644
index 0000000..570b39f
--- /dev/null
+++ b/framework/example/lib/lib.txt
@@ -0,0 +1,20 @@
+#####################################################################
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#####################################################################
+
+External (thirdparty) libraries which are required for running and building this component.
diff --git a/framework/example/ofbiz-component.xml b/framework/example/ofbiz-component.xml
new file mode 100644
index 0000000..01b2357
--- /dev/null
+++ b/framework/example/ofbiz-component.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<ofbiz-component name="example"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/ofbiz-component.xsd">
+    <!-- define resource loaders; most common is to use the component resource loader -->
+    <resource-loader name="main" type="component"/>
+
+    <!-- place the config directory on the classpath to access configuration files -->
+    <classpath type="dir" location="config"/>
+    <classpath type="dir" location="dtd"/>
+
+    <!-- load single or multiple external libraries -->
+    <classpath type="jar" location="build/lib/*"/>
+
+    <!-- entity resources: model(s), eca(s), group, and data definitions -->
+    <entity-resource type="model" reader-name="main" loader="main" location="entitydef/entitymodel.xml"/>
+    <entity-resource type="model" reader-name="main" loader="main" location="entitydef/entitymodel_view.xml"/>
+    <!-- <entity-resource type="eca" reader-name="main" loader="main" location="entitydef/eecas.xml"/> -->
+    <entity-resource type="data" reader-name="seed" loader="main" location="data/ExampleTypeData.xml"/>
+    <entity-resource type="data" reader-name="seed" loader="main" location="data/ExampleSecurityData.xml"/>
+    <entity-resource type="data" reader-name="seed" loader="main" location="data/ExamplePortletData.xml"/>
+    <entity-resource type="data" reader-name="seed" loader="main" location="data/ExamplePortalSeedData.xml"/>
+    <entity-resource type="data" reader-name="seed" loader="main" location="data/ExampleHelpData.xml"/>
+    <entity-resource type="data" reader-name="demo" loader="main" location="data/ExampleDemoData.xml"/>
+
+    <!-- service resources: model(s), eca(s) and group definitions -->
+    <service-resource type="model" loader="main" location="servicedef/services.xml"/>
+    <service-resource type="eca" loader="main" location="servicedef/secas.xml"/>
+    <!--
+    <service-resource type="group" loader="main" location="servicedef/groups.xml"/>
+    -->
+
+    <test-suite loader="main" location="testdef/tests.xml"/>
+
+    <!-- web applications; will be mounted when using the embedded container -->
+    <webapp name="example"
+        title="Example"
+        menu-name="secondary"
+        server="default-server"
+        location="webapp/example"
+        base-permission="OFBTOOLS,EXAMPLE"
+        mount-point="/example"/>
+    <webapp name="birt"
+        title="BIRT"
+        server="default-server"
+        location="webapp/birt"
+        base-permission="OFBTOOLS,WEBTOOLS"
+        mount-point="/birt"
+        app-bar-display="false"/>
+        
+</ofbiz-component>
diff --git a/framework/example/script/org/ofbiz/example/ExamplePermissionServices.xml b/framework/example/script/org/ofbiz/example/ExamplePermissionServices.xml
new file mode 100644
index 0000000..387f34a
--- /dev/null
+++ b/framework/example/script/org/ofbiz/example/ExamplePermissionServices.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<simple-methods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/simple-methods.xsd">
+
+    <simple-method method-name="exampleGenericPermission" short-description="Main permission logic">
+        <set field="mainAction" from-field="parameters.mainAction"/>
+        <if-empty field="mainAction">
+            <add-error>
+                <fail-property resource="ExampleUiLabels" property="ExamplePermissionMainActionAttributeMissing"/>
+            </add-error>
+            <check-errors/>
+        </if-empty>
+        <if-has-permission permission="EXAMPLE" action="_${parameters.mainAction}">
+            <set field="hasPermission" type="Boolean" value="true"/>
+            <field-to-result field="hasPermission"/>
+            <else>
+                <property-to-field resource="ExampleUiLabels" property="ExamplePermissionError" field="failMessage"/>
+                <set field="hasPermission" type="Boolean" value="false"/>
+                <field-to-result field="hasPermission"/>
+                <field-to-result field="failMessage"/>
+            </else>
+        </if-has-permission>
+    </simple-method>
+</simple-methods>
diff --git a/framework/example/script/org/ofbiz/example/example/ExampleServices.xml b/framework/example/script/org/ofbiz/example/example/ExampleServices.xml
new file mode 100644
index 0000000..b9f0f67
--- /dev/null
+++ b/framework/example/script/org/ofbiz/example/example/ExampleServices.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<simple-methods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/simple-methods.xsd">
+    <!-- ExampleStatus methods -->
+    <simple-method method-name="createExampleStatus" short-description="create a ExampleItem">
+        <now-timestamp field="nowTimestamp"/>
+
+        <!-- find the most recent status record and set the statusEndDate -->
+        <entity-and entity-name="ExampleStatus" list="oldExampleStatusList">
+            <field-map field-name="exampleId" from-field="parameters.exampleId"/>
+            <order-by field-name="-statusDate"/>
+        </entity-and>
+        <first-from-list entry="oldExampleStatus" list="oldExampleStatusList"/>
+        <if-not-empty field="oldExampleStatus">
+            <set field="oldExampleStatus.statusEndDate" from-field="nowTimestamp"/>
+            <store-value value-field="oldExampleStatus"/>
+        </if-not-empty>
+
+        <make-value entity-name="ExampleStatus" value-field="newEntity"/>
+        <set-pk-fields map="parameters" value-field="newEntity"/>
+        <set-nonpk-fields map="parameters" value-field="newEntity"/>
+        <set field="newEntity.statusDate" from-field="nowTimestamp"/>
+        <create-value value-field="newEntity"/>
+    </simple-method>
+
+    <!-- Example ServiceTest Service -->
+    <simple-method method-name="testCreateExampleService" short-description="test the create example service" login-required="false">
+        <set field="createExampleMap.exampleTypeId" value="CONTRIVED"/>
+        <set field="createExampleMap.exampleName" value="Test Example"/>
+        <set field="createExampleMap.statusId" value="EXST_IN_DESIGN"/>
+
+        <entity-one entity-name="UserLogin" value-field="createExampleMap.userLogin" auto-field-map="false">
+            <field-map field-name="userLoginId" value="system"/>
+        </entity-one>
+
+        <call-service service-name="createExample" in-map-name="createExampleMap">
+            <result-to-field result-name="exampleId" field="exampleId"/>
+        </call-service>
+
+        <entity-one entity-name="Example" value-field="example"/>
+
+        <assert>
+            <not><if-empty field="example"/></not>
+            <if-compare-field field="example.exampleTypeId" to-field="createExampleMap.exampleTypeId" operator="equals"/>
+            <if-compare-field field="example.exampleName" to-field="createExampleMap.exampleName" operator="equals"/>
+            <if-compare-field field="example.statusId" to-field="createExampleMap.statusId" operator="equals"/>
+        </assert>
+
+        <check-errors/>
+    </simple-method>
+</simple-methods>
diff --git a/framework/example/script/script.txt b/framework/example/script/script.txt
new file mode 100644
index 0000000..b364991
--- /dev/null
+++ b/framework/example/script/script.txt
@@ -0,0 +1,20 @@
+#####################################################################
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#####################################################################
+
+The script directory is for static resources that are interpreted at run time rather than being compiled. This goes on the classpath, but does not get built or put into a JAR file.
diff --git a/framework/example/servicedef/secas.xml b/framework/example/servicedef/secas.xml
new file mode 100644
index 0000000..8343a07
--- /dev/null
+++ b/framework/example/servicedef/secas.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<service-eca xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/service-eca.xsd">
+    <eca service="createExample" event="return">
+        <action service="createExampleStatus" mode="sync"/>
+    </eca>
+    <eca service="updateExample" event="return">
+        <condition-field field-name="statusId" operator="not-equals" to-field-name="oldStatusId"/>
+        <action service="createExampleStatus" mode="sync"/>
+    </eca>
+</service-eca>
diff --git a/framework/example/servicedef/servicedef.txt b/framework/example/servicedef/servicedef.txt
new file mode 100644
index 0000000..bcb5846
--- /dev/null
+++ b/framework/example/servicedef/servicedef.txt
@@ -0,0 +1,25 @@
+#####################################################################
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#####################################################################
+
+Service definitions including group and eca definitions.
+Usually formatted as:
+
+services.xml
+groups.xml
+secas.xml
diff --git a/framework/example/servicedef/services.xml b/framework/example/servicedef/services.xml
new file mode 100644
index 0000000..b9be4ea
--- /dev/null
+++ b/framework/example/servicedef/services.xml
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<services xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/services.xsd">
+    <description>Example Services</description>
+    <vendor>OFBiz</vendor>
+    <version>1.0</version>
+
+    <!-- Example & Related Services -->
+    <service name="createExample" default-entity-name="Example" engine="entity-auto" invoke="create" auth="true">
+        <description>Create a Example</description>
+        <permission-service service-name="exampleGenericPermission" main-action="CREATE"/>
+        <auto-attributes include="pk" mode="OUT" optional="false"/>
+        <auto-attributes include="nonpk" mode="IN" optional="true"/>
+        <override name="exampleTypeId" optional="false"/>
+        <override name="statusId" optional="false"/>
+        <override name="exampleName" optional="false"/>
+    </service>
+    <service name="updateExample" default-entity-name="Example" engine="entity-auto" invoke="update" auth="true">
+        <description>Update a Example</description>
+        <permission-service service-name="exampleGenericPermission" main-action="UPDATE"/>
+        <auto-attributes include="pk" mode="IN" optional="false"/>
+        <auto-attributes include="nonpk" mode="IN" optional="true"/>
+        <attribute name="oldStatusId" type="String" mode="OUT" optional="false"/>
+    </service>
+    <service name="deleteExample" default-entity-name="Example" engine="entity-auto" invoke="delete" auth="true">
+        <description>Delete a Example</description>
+        <permission-service service-name="exampleGenericPermission" main-action="DELETE"/>
+        <auto-attributes include="pk" mode="IN" optional="false"/>
+    </service>
+    <service name="createExampleStatus" default-entity-name="ExampleStatus" engine="simple"
+            location="component://example/script/org/ofbiz/example/example/ExampleServices.xml" invoke="createExampleStatus" auth="true">
+        <description>Create a ExampleStatus</description>
+        <permission-service service-name="exampleGenericPermission" main-action="CREATE"/>
+        <auto-attributes include="all" mode="IN" optional="false">
+            <exclude field-name="statusDate"/>
+            <exclude field-name="statusEndDate"/>
+        </auto-attributes>
+    </service>
+
+    <service name="createExampleItem" default-entity-name="ExampleItem" engine="entity-auto" invoke="create" auth="true">
+        <description>Create a ExampleItem</description>
+        <permission-service service-name="exampleGenericPermission" main-action="CREATE"/>
+        <auto-attributes include="pk" mode="IN" optional="false"/>
+        <auto-attributes include="nonpk" mode="IN" optional="true"/>
+        <override name="exampleItemSeqId" mode="OUT"/> <!-- make this OUT rather than IN, we will automatically generate the next sub-sequence ID -->
+        <override name="description" optional="false"/>
+    </service>
+    <service name="updateExampleItem" default-entity-name="ExampleItem" engine="entity-auto" invoke="update" auth="true">
+        <description>Update a ExampleItem</description>
+        <permission-service service-name="exampleGenericPermission" main-action="UPDATE"/>
+        <auto-attributes include="pk" mode="IN" optional="false"/>
+        <auto-attributes include="nonpk" mode="IN" optional="true"/>
+    </service>
+    <service name="deleteExampleItem" default-entity-name="ExampleItem" engine="entity-auto" invoke="delete" auth="true">
+        <description>Delete a ExampleItem</description>
+        <permission-service service-name="exampleGenericPermission" main-action="DELETE"/>
+        <auto-attributes include="pk" mode="IN" optional="false"/>
+    </service>
+
+    <!-- ExampleFeature Services -->
+    <service name="createExampleFeature" default-entity-name="ExampleFeature" engine="entity-auto" invoke="create" auth="true">
+        <description>Create a ExampleFeature</description>
+        <permission-service service-name="exampleGenericPermission" main-action="CREATE"/>
+        <auto-attributes include="pk" mode="OUT" optional="false"/>
+        <auto-attributes include="nonpk" mode="IN" optional="true"/>
+        <override name="description" optional="false"/>
+    </service>
+    <service name="updateExampleFeature" default-entity-name="ExampleFeature" engine="entity-auto" invoke="update" auth="true">
+        <description>Update a ExampleFeature</description>
+        <permission-service service-name="exampleGenericPermission" main-action="UPDATE"/>
+        <auto-attributes include="pk" mode="IN" optional="false"/>
+        <auto-attributes include="nonpk" mode="IN" optional="true"/>
+    </service>
+    <service name="deleteExampleFeature" default-entity-name="ExampleFeature" engine="entity-auto" invoke="delete" auth="true">
+        <description>Delete a ExampleFeature</description>
+        <permission-service service-name="exampleGenericPermission" main-action="DELETE"/>
+        <auto-attributes include="pk" mode="IN" optional="false"/>
+    </service>
+
+    <service name="createExampleFeatureAppl" default-entity-name="ExampleFeatureAppl" engine="entity-auto" invoke="create" auth="true">
+        <description>Create a ExampleFeatureAppl</description>
+        <permission-service service-name="exampleGenericPermission" main-action="CREATE"/>
+        <auto-attributes include="pk" mode="IN" optional="false"/>
+        <auto-attributes include="nonpk" mode="IN" optional="true"/>
+        <override name="fromDate" optional="true"/>
+    </service>
+    <service name="updateExampleFeatureAppl" default-entity-name="ExampleFeatureAppl" engine="entity-auto" invoke="update" auth="true">
+        <description>Update a ExampleFeatureAppl</description>
+        <permission-service service-name="exampleGenericPermission" main-action="UPDATE"/>
+        <auto-attributes include="pk" mode="IN" optional="false"/>
+        <auto-attributes include="nonpk" mode="IN" optional="true"/>
+    </service>
+    <service name="deleteExampleFeatureAppl" default-entity-name="ExampleFeatureAppl" engine="entity-auto" invoke="delete" auth="true">
+        <description>Delete a ExampleFeatureAppl</description>
+        <permission-service service-name="exampleGenericPermission" main-action="DELETE"/>
+        <auto-attributes include="pk" mode="IN" optional="false"/>
+    </service>
+
+    <!-- Permission Services -->
+    <service name="exampleGenericPermission" engine="simple"
+             location="component://example/script/org/ofbiz/example/ExamplePermissionServices.xml" invoke="exampleGenericPermission">
+        <implements service="permissionInterface"/>
+    </service>
+
+    <!-- Example ServiceTest Service -->
+    <service name="testCreateExampleService" engine="simple"
+             location="component://example/script/org/ofbiz/example/example/ExampleServices.xml" invoke="testCreateExampleService">
+        <implements service="testServiceInterface"/>
+    </service>
+</services>
diff --git a/framework/example/src/org/ofbiz/example/ExamplePrintServices.java b/framework/example/src/org/ofbiz/example/ExamplePrintServices.java
new file mode 100644
index 0000000..28239f1
--- /dev/null
+++ b/framework/example/src/org/ofbiz/example/ExamplePrintServices.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ *******************************************************************************/
+package org.ofbiz.example;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.Map;
+
+import javax.print.Doc;
+import javax.print.DocFlavor;
+import javax.print.DocPrintJob;
+import javax.print.PrintException;
+import javax.print.PrintService;
+import javax.print.PrintServiceLookup;
+import javax.print.SimpleDoc;
+import javax.print.attribute.HashPrintRequestAttributeSet;
+import javax.print.attribute.PrintRequestAttributeSet;
+import javax.print.attribute.standard.Copies;
+import javax.print.attribute.standard.Sides;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.stream.StreamSource;
+
+import javolution.util.FastMap;
+
+import org.apache.fop.apps.FOPException;
+import org.apache.fop.apps.Fop;
+import org.apache.fop.apps.MimeConstants;
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.GeneralException;
+import org.ofbiz.service.DispatchContext;
+import org.ofbiz.service.ServiceUtil;
+import org.ofbiz.webapp.view.ApacheFopWorker;
+import org.ofbiz.widget.html.HtmlScreenRenderer;
+import org.ofbiz.widget.screen.ScreenRenderer;
+import org.xml.sax.SAXException;
+
+public class ExamplePrintServices {
+    public static final String module = ExamplePrintServices.class.getName();
+
+    private static HtmlScreenRenderer htmlScreenRenderer = new HtmlScreenRenderer();
+
+    public static Map<String, Object> printReportPdf(DispatchContext dctx, Map<String, ? extends Object> context) {
+        String screenLocation = "component://example/widget/example/ExampleReportScreens.xml";
+        String reportScreenName = "ExampleReport";
+        Map<String, Object> workContext = FastMap.newInstance();
+        workContext.putAll(context);
+
+        // render a screen to get the XML document
+        Writer reportWriter = new StringWriter();
+        ScreenRenderer reportScreenRenderer = new ScreenRenderer(reportWriter, null, htmlScreenRenderer);
+        reportScreenRenderer.populateContextForService(dctx, workContext);
+
+        // put the exampleId in the screen context, is a parameter coming into the service
+        //reportScreenRenderer.getContext().put("exampleId", context.get("exampleId"));
+
+        try {
+            reportScreenRenderer.render(screenLocation, reportScreenName);
+        } catch (GeneralException e) {
+            String errMsg = "General error rendering screen [" + screenLocation + "]: " + e.toString();
+            Debug.logError(e, errMsg, module);
+            return ServiceUtil.returnError(errMsg);
+        } catch (IOException e) {
+            String errMsg = "IO error rendering screen [" + screenLocation + "]: " + e.toString();
+            Debug.logError(e, errMsg, module);
+            return ServiceUtil.returnError(errMsg);
+        } catch (SAXException e) {
+            String errMsg = "SAX (XML parse) error rendering screen [" + screenLocation + "]: " + e.toString();
+            Debug.logError(e, errMsg, module);
+            return ServiceUtil.returnError(errMsg);
+        } catch (ParserConfigurationException e) {
+            String errMsg = "Parser configuration error rendering screen [" + screenLocation + "]: " + e.toString();
+            Debug.logError(e, errMsg, module);
+            return ServiceUtil.returnError(errMsg);
+        }
+
+        // set the input source (XSL-FO) and generate the PDF
+        StreamSource src = new StreamSource(new StringReader(reportWriter.toString()));
+
+        // create the output stream for the generation
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+        try {
+            Fop fop = ApacheFopWorker.createFopInstance(out, MimeConstants.MIME_PDF);
+            ApacheFopWorker.transform(src, null, fop);
+        } catch (FOPException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+
+
+        /*
+        // set the content type and length
+        response.setContentType("application/pdf");
+        response.setContentLength(out.size());
+
+        // write to the browser
+        try {
+            out.writeTo(response.getOutputStream());
+            response.getOutputStream().flush();
+        } catch (IOException e) {
+            throw new ViewHandlerException("Unable write to browser OutputStream", e);
+        }
+        */
+
+        DocFlavor docFlavor = DocFlavor.BYTE_ARRAY.PDF;
+        Doc myDoc = new SimpleDoc(out.toByteArray(), docFlavor, null);
+        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
+        aset.add(new Copies(1));
+        //aset.add(MediaSize.A4);
+        aset.add(Sides.ONE_SIDED);
+
+        PrintService[] services = PrintServiceLookup.lookupPrintServices(docFlavor, aset);
+        if (services.length > 0) {
+            DocPrintJob job = services[0].createPrintJob();
+            try {
+                job.print(myDoc, aset);
+            } catch (PrintException pe) {
+                String errMsg = "Unable to print PDF from XSL-FO: " + pe.toString();
+                Debug.logError(pe, errMsg, module);
+                return ServiceUtil.returnError(errMsg);
+            }
+        }
+
+        return ServiceUtil.returnSuccess();
+    }
+}
diff --git a/framework/example/src/org/ofbiz/example/JackrabbitEvents.java b/framework/example/src/org/ofbiz/example/JackrabbitEvents.java
new file mode 100644
index 0000000..9b05608
--- /dev/null
+++ b/framework/example/src/org/ofbiz/example/JackrabbitEvents.java
@@ -0,0 +1,482 @@
+package org.ofbiz.example;

+

+import java.io.IOException;

+import java.io.InputStream;

+import java.util.ArrayList;

+import java.util.Calendar;

+import java.util.GregorianCalendar;

+import java.util.List;

+import java.util.Map;

+

+import javax.jcr.ItemExistsException;

+import javax.jcr.Node;

+import javax.jcr.NodeIterator;

+import javax.jcr.PathNotFoundException;

+import javax.jcr.RepositoryException;

+import javax.jcr.Session;

+import javax.jcr.ValueFormatException;

+import javax.jcr.nodetype.NodeType;

+import javax.servlet.http.HttpServletRequest;

+import javax.servlet.http.HttpServletResponse;

+

+import javolution.util.FastMap;

+import net.sf.json.JSONArray;

+import net.sf.json.JSONObject;

+

+import org.apache.commons.fileupload.FileItem;

+import org.apache.commons.fileupload.FileUploadException;

+import org.apache.commons.fileupload.disk.DiskFileItemFactory;

+import org.apache.commons.fileupload.servlet.ServletFileUpload;

+import org.apache.commons.io.IOUtils;

+import org.apache.jackrabbit.ocm.exception.ObjectContentManagerException;

+import org.ofbiz.base.util.Debug;

+import org.ofbiz.base.util.FileUtil;

+import org.ofbiz.base.util.StringUtil;

+import org.ofbiz.base.util.UtilGenerics;

+import org.ofbiz.base.util.UtilHttp;

+import org.ofbiz.base.util.UtilValidate;

+import org.ofbiz.entity.GenericValue;

+import org.ofbiz.jcr.access.JcrRepositoryAccessor;

+import org.ofbiz.jcr.access.jackrabbit.JackrabbitRepositoryAccessor;

+import org.ofbiz.jcr.api.JcrDataHelper;

+import org.ofbiz.jcr.api.JcrFileHelper;

+import org.ofbiz.jcr.api.jackrabbit.JackrabbitArticleHelper;

+import org.ofbiz.jcr.api.jackrabbit.JackrabbitFileHelper;

+import org.ofbiz.jcr.orm.OfbizRepositoryMapping;

+import org.ofbiz.jcr.orm.jackrabbit.JackrabbitArticle;

+import org.ofbiz.jcr.orm.jackrabbit.JackrabbitFile;

+import org.ofbiz.jcr.orm.jackrabbit.JackrabbitFolder;

+import org.ofbiz.jcr.orm.jackrabbit.JackrabbitHierarchyNode;

+import org.ofbiz.jcr.util.jackrabbit.JcrUtilJackrabbit;

+

+public class JackrabbitEvents {

+

+    public static final String module = JackrabbitEvents.class.getName();

+

+    /**

+     *

+     * @param request

+     * @param response

+     * @return

+     */

+    public static String addNewTextMessageToJcrRepository(HttpServletRequest request, HttpServletResponse response) {

+        GenericValue userLogin = (GenericValue) request.getSession().getAttribute("userLogin");

+        JcrDataHelper articleHelper = new JackrabbitArticleHelper(userLogin);

+

+        String contentPath = request.getParameter("path");

+        String language = request.getParameter("msgLocale");

+        String title = request.getParameter("title");

+        Calendar pubDate = new GregorianCalendar(); // TODO

+        String content = request.getParameter("message");

+

+        try {

+            articleHelper.storeContentInRepository(contentPath, language, title, content, pubDate);

+        } catch (ObjectContentManagerException e) {

+            Debug.logError(e, module);

+            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());

+            return "error";

+        } catch (ItemExistsException e) {

+            Debug.logError(e, module);

+            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());

+            return "error";

+        } finally {

+            articleHelper.closeContentSession();

+        }

+

+        return "success";

+    }

+

+    /**

+     *

+     * @param request

+     * @param response

+     * @return

+     */

+    public static String scanRepositoryStructure(HttpServletRequest request, HttpServletResponse response) {

+        GenericValue userLogin = (GenericValue) request.getSession().getAttribute("userLogin");

+        try {

+            List<Map<String, String>> listIt = JcrUtilJackrabbit.getRepositoryNodes(userLogin, "");

+            request.setAttribute("listIt", listIt);

+        } catch (RepositoryException e) {

+            Debug.logError(e, module);

+            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());

+            return "error";

+        }

+

+        return "success";

+    }

+

+    /**

+     *

+     * @param request

+     * @param response

+     * @return

+     */

+    public static String getNodeContent(HttpServletRequest request, HttpServletResponse response) {

+        GenericValue userLogin = (GenericValue) request.getSession().getAttribute("userLogin");

+

+        String contentPath = request.getParameter("path");

+

+        String version = request.getParameter("versions");

+        String language = request.getParameter("language");

+

+        if (UtilValidate.isEmpty(contentPath)) {

+            String msg = "A node path is missing, please pass the path to the node which should be read from the repository."; // TODO

+            Debug.logError(msg, module);

+            request.setAttribute("_ERROR_MESSAGE_", msg);

+            return "error";

+        }

+

+        JcrDataHelper articleHelper = new JackrabbitArticleHelper(userLogin);

+        JackrabbitArticle ormArticle = null;

+        try {

+            if (UtilValidate.isEmpty(version)) {

+                ormArticle = articleHelper.readContentFromRepository(contentPath, language);

+            } else {

+                ormArticle = articleHelper.readContentFromRepository(contentPath, language, version);

+            }

+        } catch (ClassCastException e) {

+            Debug.logError(e, module);

+            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());

+            return "error";

+        } catch (PathNotFoundException e) {

+            Debug.logError(e, module);

+            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());

+            return "error";

+        }

+

+        request.setAttribute("path", ormArticle.getPath());

+        request.setAttribute("language", ormArticle.getLanguage());

+        request.setAttribute("title", ormArticle.getTitle());

+        request.setAttribute("version", ormArticle.getVersion());

+        request.setAttribute("versionList", articleHelper.getVersionListForCurrentArticle());

+        request.setAttribute("languageList", articleHelper.getAvailableLanguageList());

+        request.setAttribute("createDate", ormArticle.getCreationDate());

+        request.setAttribute("content", ormArticle.getContent());

+

+        return "success";

+    }

+

+    /**

+     *

+     * @param request

+     * @param response

+     * @return

+     */

+    public static String updateRepositoryData(HttpServletRequest request, HttpServletResponse response) {

+        GenericValue userLogin = (GenericValue) request.getSession().getAttribute("userLogin");

+

+        String contentPath = request.getParameter("path");

+        JcrDataHelper articleHelper = new JackrabbitArticleHelper(userLogin);

+

+        JackrabbitArticle ormArticle = null;

+        try {

+            ormArticle = articleHelper.readContentFromRepository(contentPath);

+        } catch (ClassCastException e1) {

+            Debug.logError(e1, module);

+            request.setAttribute("_ERROR_MESSAGE_", e1.getMessage());

+            return "error";

+        } catch (PathNotFoundException e1) {

+            Debug.logError(e1, module);

+            request.setAttribute("_ERROR_MESSAGE_", e1.getMessage());

+            return "error";

+        }

+

+        ormArticle.setTitle(request.getParameter("title"));

+        ormArticle.setContent(request.getParameter("content"));

+

+        try {

+            articleHelper.updateContentInRepository(ormArticle);

+        } catch (ObjectContentManagerException e) {

+            Debug.logError(e, module);

+            request.setAttribute("_ERROR_MESSAGE_", e.toString());

+        } catch (RepositoryException e) {

+            Debug.logError(e, module);

+            request.setAttribute("_ERROR_MESSAGE_", e.toString());

+        } finally {

+            articleHelper.closeContentSession();

+        }

+

+        return "success";

+    }

+

+    /**

+     *

+     * @param request

+     * @param response

+     * @return

+     */

+    public static String removeRepositoryNode(HttpServletRequest request, HttpServletResponse response) {

+        GenericValue userLogin = (GenericValue) request.getSession().getAttribute("userLogin");

+

+        String contentPath = request.getParameter("path");

+

+        JcrDataHelper helper = new JackrabbitArticleHelper(userLogin);

+        helper.removeContentObject(contentPath);

+

+        return "success";

+    }

+

+    /**

+     *

+     * @param request

+     * @param response

+     * @return

+     */

+    public static String uploadFileData(HttpServletRequest request, HttpServletResponse response) {

+        GenericValue userLogin = (GenericValue) request.getSession().getAttribute("userLogin");

+        ServletFileUpload fu = new ServletFileUpload(new DiskFileItemFactory(10240, FileUtil.getFile("runtime/tmp")));

+        List<FileItem> list = null;

+        Map<String, String> passedParams = FastMap.newInstance();

+

+        try {

+            list = UtilGenerics.checkList(fu.parseRequest(request));

+        } catch (FileUploadException e) {

+            Debug.logError(e, module);

+            request.setAttribute("_ERROR_MESSAGE_", e.toString());

+            return "error";

+        }

+

+        byte[] file = null;

+        for (FileItem fi : list) {

+            String fieldName = fi.getFieldName();

+

+            if (fi.isFormField()) {

+                String fieldStr = fi.getString();

+                passedParams.put(fieldName, fieldStr);

+            } else if (fieldName.startsWith("fileData")) {

+                passedParams.put("completeFileName", fi.getName());

+                file = fi.get();

+            }

+        }

+

+        JcrFileHelper fileHelper = new JackrabbitFileHelper(userLogin);

+

+        try {

+

+            fileHelper.storeContentInRepository(file, passedParams.get("completeFileName"), passedParams.get("path"));

+

+        } catch (ObjectContentManagerException e) {

+            Debug.logError(e, module);

+            request.setAttribute("_ERROR_MESSAGE_", e.toString());

+        } catch (ItemExistsException e) {

+            Debug.logError(e, module);

+            request.setAttribute("_ERROR_MESSAGE_", e.toString());

+        } catch (RepositoryException e) {

+            Debug.logError(e, module);

+            request.setAttribute("_ERROR_MESSAGE_", e.toString());

+        } finally {

+            fileHelper.closeContentSession();

+        }

+

+        return "success";

+    }

+

+    /**

+     * Creates the FILE Tree as JSON Object

+     *

+     * @param request

+     * @param response

+     * @return

+     */

+    public static String getRepositoryFileTree(HttpServletRequest request, HttpServletResponse response) {

+        GenericValue userLogin = (GenericValue) request.getSession().getAttribute("userLogin");

+

+        JcrRepositoryAccessor repositoryAccess = new JackrabbitRepositoryAccessor(userLogin);

+        try {

+            JSONArray fileTree = repositoryAccess.getJsonFileTree();

+            request.setAttribute("fileTree", StringUtil.wrapString(fileTree.toString()));

+        } catch (RepositoryException e) {

+            Debug.logError(e, module);

+            request.setAttribute("dataTree", new JSONArray());

+            request.setAttribute("_ERROR_MESSAGE_", e.toString());

+            return "error";

+        } finally {

+            repositoryAccess.closeAccess();

+        }

+

+        return "success";

+    }

+

+    /**

+     * Creates the DATA (TEXT) Tree as JSON Object

+     *

+     * @param request

+     * @param response

+     * @return

+     */

+    public static String getRepositoryDataTree(HttpServletRequest request, HttpServletResponse response) {

+        GenericValue userLogin = (GenericValue) request.getSession().getAttribute("userLogin");

+

+        JackrabbitRepositoryAccessor repositoryAccess = new JackrabbitRepositoryAccessor(userLogin);

+        try {

+            JSONArray fileTree = repositoryAccess.getJsonDataTree();

+            request.setAttribute("dataTree", StringUtil.wrapString(fileTree.toString()));

+        } catch (RepositoryException e) {

+            Debug.logError(e, module);

+            request.setAttribute("dataTree", new JSONArray());

+            request.setAttribute("_ERROR_MESSAGE_", e.toString());

+            repositoryAccess.closeAccess();

+            return "error";

+        }

+

+        List<String> contentList = new ArrayList<String>();

+        Map<String, List<String>> languageList = FastMap.newInstance();

+        Session session = repositoryAccess.getSession();

+        Node root;

+        try {

+            root = session.getRootNode();

+            getContentList(root, contentList);

+        } catch (RepositoryException e) {

+            Debug.logError(e, module);

+            request.setAttribute("_ERROR_MESSAGE_", e.toString());

+            repositoryAccess.closeAccess();

+            return "error";

+        } finally {

+        }

+

+        try {

+            for (String path : contentList) {

+                Node parent = session.getNode(path);

+                NodeIterator ni = parent.getNodes();

+                List<String> language = new ArrayList<String>();

+                while (ni.hasNext()) {

+                    Node t = ni.nextNode();

+                    if (t.hasProperty("localized") && t.getProperty("localized").getBoolean()) {

+                        String l = t.getPath();

+                        language.add(l.substring(l.lastIndexOf("/") + 1));

+                    }

+                }

+                languageList.put(path, language);

+            }

+        } catch (ValueFormatException e) {

+            Debug.logError(e, module);

+        } catch (PathNotFoundException e) {

+            Debug.logError(e, module);

+        } catch (RepositoryException e) {

+            Debug.logError(e, module);

+        } finally {

+            repositoryAccess.closeAccess();

+        }

+

+        request.setAttribute("contentList", contentList);

+        JSONObject jo = new JSONObject();

+        jo.putAll(languageList);

+        request.setAttribute("languageList", jo);

+

+        return "success";

+    }

+

+    public static String getFileFromRepository(HttpServletRequest request, HttpServletResponse response) {

+        GenericValue userLogin = (GenericValue) request.getSession().getAttribute("userLogin");

+

+        String contentPath = request.getParameter("path");

+

+        if (UtilValidate.isEmpty(contentPath)) {

+            String msg = "A node path is missing, please pass the path to the node which should be read from the repository."; // TODO

+            Debug.logError(msg, module);

+            request.setAttribute("_ERROR_MESSAGE_", msg);

+            return "error";

+        }

+

+        JcrFileHelper fileHelper = new JackrabbitFileHelper(userLogin);

+        JackrabbitHierarchyNode orm = null;

+        try {

+            orm = fileHelper.getRepositoryContent(contentPath);

+        } catch (ClassCastException e1) {

+            Debug.logError(e1, module);

+            request.setAttribute("_ERROR_MESSAGE_", e1.getMessage());

+            return "error";

+        } catch (PathNotFoundException e1) {

+            Debug.logError(e1, module);

+            request.setAttribute("_ERROR_MESSAGE_", e1.getMessage());

+            return "error";

+        }

+

+        if (fileHelper.isFileContent()) {

+            JackrabbitFile file = (JackrabbitFile) orm;

+            InputStream fileStream = file.getResource().getData();

+

+            String fileName = file.getPath();

+            if (fileName.indexOf("/") != -1) {

+                fileName = fileName.substring(fileName.indexOf("/") + 1);

+            }

+

+            try {

+                UtilHttp.streamContentToBrowser(response, IOUtils.toByteArray(fileStream), file.getResource().getMimeType(), fileName);

+            } catch (IOException e) {

+                Debug.logError(e, module);

+                request.setAttribute("_ERROR_MESSAGE_", e.getMessage());

+                return "error";

+            }

+        } else {

+            Debug.logWarning("This content is no file content, the content is from the type: " + orm.getClass().getName(), module);

+        }

+        return "success";

+    }

+

+    public static String getFileInformation(HttpServletRequest request, HttpServletResponse response) {

+        GenericValue userLogin = (GenericValue) request.getSession().getAttribute("userLogin");

+        String contentPath = request.getParameter("path");

+

+        JcrFileHelper fileHelper = new JackrabbitFileHelper(userLogin);

+        OfbizRepositoryMapping orm;

+        try {

+            orm = fileHelper.getRepositoryContent(contentPath);

+        } catch (ClassCastException e) {

+            Debug.logError(e, module);

+            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());

+            return "error";

+        } catch (PathNotFoundException e) {

+            Debug.logError(e, module);

+            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());

+            return "error";

+        }

+

+        // Here we can differentiate between a file or folder content

+        if (fileHelper.isFileContent()) {

+            JackrabbitFile file = (JackrabbitFile) orm;

+            request.setAttribute("fileName", file.getPath());

+            request.setAttribute("fileLastModified", file.getResource().getLastModified().getTime());

+            request.setAttribute("fileMimeType", file.getResource().getMimeType());

+            request.setAttribute("fileCreationDate", file.getCreationDate().getTime());

+        } else if (fileHelper.isFolderContent()) {

+            JackrabbitFolder folder = (JackrabbitFolder) orm;

+            request.setAttribute("fileName", folder.getPath());

+            request.setAttribute("fileCreationDate", folder.getCreationDate().getTime());

+        }

+

+        return "success";

+    }

+

+    public static String queryRepositoryData(HttpServletRequest request, HttpServletResponse response) {

+        GenericValue userLogin = (GenericValue) request.getSession().getAttribute("userLogin");

+

+        String searchQuery = request.getParameter("queryData");

+

+        JcrDataHelper helper = new JackrabbitArticleHelper(userLogin);

+

+        try {

+            request.setAttribute("queryResult", helper.queryData(searchQuery));

+        } catch (RepositoryException e) {

+            Debug.logError(e, module);

+            request.setAttribute("_ERROR_MESSAGE_", e.getMessage());

+            return "error";

+        }

+

+        return "success";

+    }

+

+    private static void getContentList(Node startNode, List<String> contentList) throws RepositoryException {

+        NodeIterator ni = startNode.getNodes();

+        while (ni.hasNext()) {

+            Node tmpNode = ni.nextNode();

+            if (tmpNode.getPrimaryNodeType().isNodeType(NodeType.NT_UNSTRUCTURED) && (!tmpNode.hasProperty("localized") || !tmpNode.getProperty("localized").getBoolean())) {

+                contentList.add(tmpNode.getPath());

+                if (tmpNode.hasNodes()) {

+                    getContentList(tmpNode, contentList);

+                }

+            }

+        }

+    }

+}
\ No newline at end of file
diff --git a/framework/example/src/src.txt b/framework/example/src/src.txt
new file mode 100644
index 0000000..b8f9e6c
--- /dev/null
+++ b/framework/example/src/src.txt
@@ -0,0 +1,20 @@
+#####################################################################
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#####################################################################
+
+All source code related to the component.
\ No newline at end of file
diff --git a/framework/example/testdef/assertdata/TestUserLoginData.xml b/framework/example/testdef/assertdata/TestUserLoginData.xml
new file mode 100644
index 0000000..435d304
--- /dev/null
+++ b/framework/example/testdef/assertdata/TestUserLoginData.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<entity-engine-xml>
+    <UserLogin userLoginId="system" enabled="N" isSystem="Y"/>
+    <UserLogin userLoginId="anonymous" enabled="N"/>
+    <UserLogin userLoginId="admin" currentPassword="{SHA}47ca69ebb4bdc9ae0adec130880165d2cc05db1a"/>
+</entity-engine-xml>
+
diff --git a/framework/example/testdef/selenium/NewExample.html b/framework/example/testdef/selenium/NewExample.html
new file mode 100644
index 0000000..9b3c72c
--- /dev/null
+++ b/framework/example/testdef/selenium/NewExample.html
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you 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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head profile="http://selenium-ide.openqa.org/profiles/test-case">
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<link rel="selenium.base" href="" />
+<title>NewExample</title>
+</head>
+<body>
+<table cellpadding="1" cellspacing="1" border="1">
+<thead>
+<tr><td rowspan="1" colspan="3">NewFeature</td></tr>
+</thead><tbody>
+<tr>
+	<td>open</td>
+	<td>/example/control/setSessionLocale?newLocale=en</td>
+	<td></td>
+</tr>
+<tr>
+	<td>open</td>
+	<td>/example/control/logout</td>
+	<td></td>
+</tr>
+<tr>
+	<td>type</td>
+	<td>USERNAME</td>
+	<td>admin</td>
+</tr>
+<tr>
+	<td>type</td>
+	<td>PASSWORD</td>
+	<td>ofbiz</td>
+</tr>
+<tr>
+	<td>clickAndWait</td>
+	<td>//input[@value='Login']</td>
+	<td></td>
+</tr>
+<tr>
+	<td>assertTitle</td>
+	<td>OFBiz: Example: Find Example</td>
+	<td></td>
+</tr>
+<tr>
+	<td>open</td>
+	<td>/example/control/FindExample?portalPageId=Example</td>
+	<td></td>
+</tr>
+<tr>
+	<td>waitForTextPresent</td>
+	<td>New Example</td>
+	<td></td>
+</tr>
+<tr>
+	<td>click</td>
+	<td>link=New Example</td>
+	<td></td>
+</tr>
+<tr>
+	<td>waitForElementPresent</td>
+	<td>EditExample_statusId</td>
+	<td></td>
+</tr>
+<tr>
+	<td>select</td>
+	<td>EditExample_statusId</td>
+	<td>label=Defined</td>
+</tr>
+<tr>
+	<td>type</td>
+	<td>EditExample_exampleName</td>
+	<td>New Example 1</td>
+</tr>
+<tr>
+	<td>type</td>
+	<td>EditExample_description</td>
+	<td>This is a description</td>
+</tr>
+<tr>
+	<td>type</td>
+	<td>EditExample_longDescription</td>
+	<td>Long description goes here</td>
+</tr>
+<tr>
+	<td>type</td>
+	<td>EditExample_comments</td>
+	<td>comments go here</td>
+</tr>
+<tr>
+	<td>type</td>
+	<td>EditExample_exampleSize</td>
+	<td>10</td>
+</tr>
+<tr>
+	<td>click</td>
+	<td>//button[@class='ui-datepicker-trigger'][1]</td>
+	<td></td>
+</tr>
+<tr>
+	<td>click</td>
+	<td>//button[contains(text(),'Now')]</td>
+	<td></td>
+</tr>
+<tr>
+	<td>click</td>
+	<td>//button[contains(text(),'Done')]</td>
+	<td></td>
+</tr>
+<tr>
+	<td>select</td>
+	<td>EditExample_anotherText</td>
+	<td>label=Contrived</td>
+</tr>
+<tr>
+	<td>clickAndWait</td>
+	<td>submitButton</td>
+	<td></td>
+</tr>
+<tr>
+	<td>waitForElementPresent</td>
+	<td>//div[@id='search-results']//a[@class='buttontext']</td>
+	<td></td>
+</tr>
+<tr>
+	<td>clickAndWait</td>
+	<td>//div[@id='search-results']//a[@class='buttontext']</td>
+	<td></td>
+</tr>
+<tr>
+	<td>clickAndWait</td>
+	<td>link=Items</td>
+	<td></td>
+</tr>
+<tr>
+	<td>type</td>
+	<td>description</td>
+	<td>Item 1</td>
+</tr>
+<tr>
+	<td>type</td>
+	<td>amount</td>
+	<td>100</td>
+</tr>
+<tr>
+	<td>select</td>
+	<td>amountUomId</td>
+	<td>label=Weight: Stone (st)</td>
+</tr>
+<tr>
+	<td>clickAndWait</td>
+	<td>//input[@name='submitButton' and @value='Add']</td>
+	<td></td>
+</tr>
+<tr>
+	<td>assertConfirmation</td>
+	<td>Do you confirm ?</td>
+	<td></td>
+</tr>
+<tr>
+	<td>clickAndWait</td>
+	<td>link=Example</td>
+	<td></td>
+</tr>
+<tr>
+	<td>open</td>
+	<td>/example/control/logout</td>
+	<td></td>
+</tr>
+</tbody></table>
+</body>
+</html>
diff --git a/framework/example/testdef/selenium/testSuite.html b/framework/example/testdef/selenium/testSuite.html
new file mode 100644
index 0000000..66fe1c4
--- /dev/null
+++ b/framework/example/testdef/selenium/testSuite.html
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you 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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <meta content="text/html; charset=UTF-8" http-equiv="content-type" />
+  <title>Test Suite</title>
+</head>
+<body>
+<table id="suiteTable" cellpadding="1" cellspacing="1" border="1" class="selenium"><tbody>
+<tr><td><b>Test Suite</b></td></tr>
+<tr><td><a href="NewExample.html">new example</a></td></tr>
+</tbody></table>
+</body>
+</html>
diff --git a/framework/example/testdef/tests.xml b/framework/example/testdef/tests.xml
new file mode 100644
index 0000000..0f27320
--- /dev/null
+++ b/framework/example/testdef/tests.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<test-suite suite-name="example-tests"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/test-suite.xsd">
+
+    <test-case case-name="userLoginEntityXmlAssert">
+        <entity-xml action="assert" entity-xml-url="component://example/testdef/assertdata/TestUserLoginData.xml"/>
+    </test-case>
+    <test-case case-name="testCreateExampleService Through Service Engine">
+        <service-test service-name="testCreateExampleService"/>
+    </test-case>
+    <test-case case-name="testCreateExampleService Direct Simple Method">
+        <simple-method-test location="component://example/script/org/ofbiz/example/example/ExampleServices.xml" name="testCreateExampleService"/>
+    </test-case>
+</test-suite>
diff --git a/framework/example/webapp/appheader.ftl b/framework/example/webapp/appheader.ftl
new file mode 100644
index 0000000..7a31ca1
--- /dev/null
+++ b/framework/example/webapp/appheader.ftl
@@ -0,0 +1,44 @@
+<#--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<#assign selected = headerItem?default("void")>
+<div id="app-navigation">
+  <ul>
+    <li>
+      <h2>${uiLabelMap.ExampleApplication}</h2>
+      <ul>
+      <#if userLogin?has_content>
+        <li <#if selected = "${uiLabelMap.ExampleExample}"> class="selected"</#if>><a href="<@ofbizUrl>FindExample?portalPageId=${uiLabelMap.ExampleExample}</@ofbizUrl>">${uiLabelMap.ExampleExample}</a></li>
+        <li <#if selected = "${uiLabelMap.ExampleFeature}"> class="selected"</#if>><a href="<@ofbizUrl>FindExampleFeature?portalPageId=${uiLabelMap.ExampleFeature}</@ofbizUrl>">${uiLabelMap.ExampleFeature}</a></li>
+        <li <#if selected = "${uiLabelMap.ExampleFormWidgetExamples}"> class="selected"</#if>><a href="<@ofbizUrl>FormWidgetExamples?portalPageId=${uiLabelMap.ExampleFormWidgetExamples}</@ofbizUrl>">${uiLabelMap.ExampleFormWidgetExamples}</a></li>
+        <li <#if selected = "${uiLabelMap.ExampleAjaxExamples}"> class="selected"</#if>><a href="<@ofbizUrl>authview/findExampleAjax?portalPageId=${uiLabelMap.ExampleAjaxExamples}</@ofbizUrl>">${uiLabelMap.ExampleAjaxExamples}</a></li>
+        <#if portalPages?has_content>
+            <#list portalPages as page>
+              <#if page.portalPageName?has_content>
+                <li<#if selected = "${page.portalPageId}"> class="selected"</#if>><a href="<@ofbizUrl>showPortalPage?portalPageId=${page.portalPageId}</@ofbizUrl>"><#if page.portalPageName?exists>${page.portalPageName}<#else>?</#if></a></li>
+              </#if>
+            </#list>
+        </#if>
+        <li class="opposed"><a href="<@ofbizUrl>ManagePortalPages?parentPortalPageId=EXAMPLE</@ofbizUrl>">${uiLabelMap.CommonDashboard}</a></li>
+      </#if>
+      </ul>
+    </li>
+  </ul>
+  <br class="clear" />
+</div>
diff --git a/framework/example/webapp/birt/WEB-INF/birt.tld b/framework/example/webapp/birt/WEB-INF/birt.tld
new file mode 100644
index 0000000..f00d7e8
--- /dev/null
+++ b/framework/example/webapp/birt/WEB-INF/birt.tld
@@ -0,0 +1,1175 @@
+<?xml version='1.0' encoding='ISO-8859-1' ?>

+<!DOCTYPE taglib

+    PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"

+    "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

+<!--

+Licensed to the Apache Software Foundation (ASF) under one

+or more contributor license agreements.  See the NOTICE file

+distributed with this work for additional information

+regarding copyright ownership.  The ASF licenses this file

+to you 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.

+-->

+<taglib>

+    <tlib-version>1.0</tlib-version>

+    <jsp-version>1.2</jsp-version>

+    <short-name>BIRT Tag Library</short-name>

+    <uri>http://www.eclipse.org/birt/taglibs/birt.tld</uri>

+    <description>

+        This Tag Library makes user develope JSP with BIRT Viewer component easily.

+    </description>

+    

+    <!--**********************************************-->

+    <!--             Viewer Tag                       -->

+    <!--**********************************************-->

+    <tag>

+        <name>viewer</name>

+        <tag-class>org.eclipse.birt.report.taglib.ViewerTag</tag-class>

+        <body-content>JSP</body-content>

+        <description>

+            The viewer tag is to specify how to import and control BIRT Report Viewer into JSP page.

+            This tag will use Ajax framework to retrieve report content.

+        </description>

+

+        <attribute>

+            <name>id</name>

+            <required>true</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the current viewer id. It should be unique.

+                It can contain number,letter or underline.

+            </description>            

+        </attribute>    

+

+        <attribute>

+            <name>pattern</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies which servlet pattern to be used to preview report.

+                Default value is frameset.

+                ( frameset or run )

+            </description>

+        </attribute>

+                        

+        <attribute>

+            <name>baseURL</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies base URL of BIRT viewer.

+                Default to the current context.

+            </description>

+        </attribute>

+        

+        <attribute>

+            <name>title</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report title displayed at the top.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>isHostPage</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether the viewer occupies the whole page.

+                Default to false.

+            </description>

+        </attribute>

+

+       <attribute>

+            <name>scrolling </name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the IFrame style "scrolling ".

+                If isHostPage is true, ignore this attribute.

+                ( auto | yes | no )

+            </description>

+        </attribute>

+

+       <attribute>

+            <name>position</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the style "position" of report container.

+                If isHostPage is true, ignore this attribute.

+                ( static | absolute | fixed | relative )

+            </description>

+        </attribute>

+

+       <attribute>

+            <name>style</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the style of report container.

+                If isHostPage is true, ignore this attribute.

+            </description>

+        </attribute>

+                        

+        <attribute>

+            <name>height</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the height of report container in pixels.

+                If isHostPage is true, ignore this attribute.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>width</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the width of report container in pixels.

+                If isHostPage is true, ignore this attribute.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>top</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the top of report container in pixels.

+                If isHostPage is true, ignore this attribute.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>left</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                 Sets the left of report container in pixels.

+                 If isHostPage is true, ignore this attribute.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>frameborder</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                 Specifies whether displays the iframe border.

+                Default to no. 

+                If isHostPage is true, ignore this attribute.

+                ( Yes | No )

+            </description>

+        </attribute>

+                        

+        <attribute>

+            <name>reportDesign</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report design file name.

+                ( Absolute path, relative path or URL )

+            </description>    

+        </attribute>        

+

+        <attribute>

+            <name>reportDocument</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report document file name. 

+                Noted: only support "file:" URL format.

+                ( Absolute path, relative path or URL ) 

+            </description>    

+        </attribute>        

+

+        <attribute>

+            <name>reportletId</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the instance id of reportlet.

+                The "reportDocument" attribute should be required.

+                Noted: frameset pattern doesn't support reportlet.

+            </description>    

+        </attribute>

+                

+        <attribute>

+            <name>bookmark</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the targeted bookmark name.

+            </description>            

+        </attribute>

+        

+        <attribute>

+            <name>locale</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the Locale information.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>timeZone</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies a time zone id. For example: "America/Los_Angeles" or "GMT+1" or "GMT+01:00".

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>svg</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether supports the SVG output format or not.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>format</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the output format of report.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>emitterId</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the emitter id for the report output.

+            </description>            

+        </attribute>

+        

+        <attribute>

+            <name>pageOverflow</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the page overflow setting for the PDF format.

+                One of the following values:

+                0 for "auto", 1 for "actual size", 2 for "fit to page". 

+            </description>            

+        </attribute>

+        

+        <attribute>

+            <name>rtl</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether supports rtl page or not.

+            </description>            

+        </attribute>

+                

+        <attribute>

+            <name>pageNum</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies output page number when render document file.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>pageRange</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies page range when render document file.

+            </description>            

+        </attribute>

+                                

+        <attribute>

+            <name>resourceFolder</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the referenced resource folder.

+                Default value is defined in web.xml.

+            </description>            

+        </attribute>

+                                            

+        <attribute>

+            <name>forceOverwriteDocument</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether forces to overwrite the generated document.

+                If allowPageBreak is false,ignore this attribute.

+                Default value is defined in web.xml.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>showTitle</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether shows the report title.

+                Default to true.

+            </description>            

+        </attribute>

+        

+        <attribute>

+            <name>showToolBar</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether shows the toolbar.

+                Default to true.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>showNavigationBar</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether shows the Navigation Bar.

+                If allowPageBreak is false,ignore this attribute.

+                Default to true.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>showParameterPage</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether show the parameter dialog or not.

+                Default to true.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>isReportlet</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether render reportlet by bookmark.

+                Default to false.

+            </description>            

+        </attribute>

+        

+    </tag>

+

+     <!--**********************************************-->

+    <!--             Report Tag                       -->

+    <!--**********************************************-->

+    <tag>

+        <name>report</name>

+        <tag-class>org.eclipse.birt.report.taglib.ReportTag</tag-class>

+        <body-content>JSP</body-content>

+        <description>

+            The report tag can provide fast report preview without Ajax framework. 

+            The report content can be output to web browser directly.

+        </description>

+

+        <attribute>

+            <name>id</name>

+            <required>true</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the current viewer id. It should be unique.

+                It can contain number,letter or underline.

+            </description>            

+        </attribute>    

+                

+        <attribute>

+            <name>baseURL</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies base URL of BIRT viewer.

+                Default to the current context.

+                If report container is DIV, ignore this attribute.

+            </description>

+        </attribute>

+        

+        <attribute>

+            <name>isHostPage</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether the viewer occupies the whole page.

+                Default to false.

+            </description>

+        </attribute>

+

+       <attribute>

+            <name>scrolling </name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the DIV/IFrame style "scrolling ".

+                If isHostPage is true, ignore this attribute.

+                ( auto | yes | no )

+            </description>

+        </attribute>

+

+       <attribute>

+            <name>position</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the style "position" of report container.

+                If isHostPage is true, ignore this attribute.

+                ( static | absolute | fixed | relative )

+            </description>

+        </attribute>

+

+       <attribute>

+            <name>style</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the style of report container.

+                If isHostPage is true, ignore this attribute.

+            </description>

+        </attribute>

+                        

+        <attribute>

+            <name>height</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the height of report container in pixels.

+                If isHostPage is true, ignore this attribute.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>width</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the width of report container in pixels.

+                If isHostPage is true, ignore this attribute.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>top</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the top of report container in pixels.

+                If isHostPage is true, ignore this attribute.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>left</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                 Sets the left of report container in pixels.

+                 If isHostPage is true, ignore this attribute.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>frameborder</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                 Specifies whether displays the iframe border.

+                 Available when user IFrame.

+                Default to no.

+                ( Yes | No )

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>reportDesign</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report design file name.

+                ( Absolute path, relative path or URL )

+            </description>    

+        </attribute>        

+

+        <attribute>

+            <name>reportDocument</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report document file name. 

+                Noted: only support "file:" URL format.

+                ( Absolute path, relative path or URL ) 

+            </description>    

+        </attribute>

+

+        <attribute>

+            <name>reportletId</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the instance id of reportlet.

+                The "reportDocument" attribute should be required.

+            </description>    

+        </attribute>

+                            

+        <attribute>

+            <name>bookmark</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the targeted bookmark name.

+            </description>            

+        </attribute>

+        

+        <attribute>

+            <name>locale</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the Locale information.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>timeZone</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies a time zone id. For example: "America/Los_Angeles" or "GMT+1" or "GMT+01:00".

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>svg</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether supports the SVG output format or not.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>format</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the output format of report.

+            </description>            

+        </attribute>

+        

+        <attribute>

+            <name>emitterId</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the emitter id for the report output.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>pageOverflow</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the page overflow setting for the PDF format.

+                One of the following values:

+                0 for "auto", 1 for "actual size", 2 for "fit to page". 

+            </description>            

+        </attribute>

+        

+        <attribute>

+            <name>rtl</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether supports rtl page or not.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>showParameterPage</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether show the parameter dialog or not.

+                Default to true.

+                If report container is DIV, ignore this attribute.

+            </description>            

+        </attribute>

+                                                

+        <attribute>

+            <name>resourceFolder</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the referenced resource folder.

+                Default value is defined in web.xml.

+            </description>            

+        </attribute>            

+                                    

+        <attribute>

+            <name>reportContainer</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies iframe or div as report container.

+                Default to iframe.

+                ( iframe | div )

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>pageNum</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies output page number when render document file.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>pageRange</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies page range when render document file.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>isReportlet</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether render reportlet by bookmark.

+                Default to false.

+            </description>            

+        </attribute>

+                

+    </tag>    

+    

+    <!--**********************************************-->

+    <!--             Report Parameter Tag             -->

+    <!--**********************************************-->

+     <tag>

+        <name>param</name>

+        <tag-class>org.eclipse.birt.report.taglib.ParamTag</tag-class>

+        <body-content>JSP</body-content>

+        <description>

+            The param tag specifies the parameters defined in report design file.

+        </description>

+        <attribute>

+            <name>name</name>

+            <required>true</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report parameter name.

+            </description>

+        </attribute>

+        <attribute>

+            <name>pattern</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report parameter pattern format.

+            </description>

+        </attribute>     

+        <attribute>

+            <name>value</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report parameter value. If doesn't set, value is null.

+            </description>

+        </attribute>

+        <attribute>

+            <name>displayText</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report parameter display text.

+            </description>

+        </attribute>

+        <attribute>

+            <name>delim</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the delimiter for multiple values.

+                Defaults to pipe "|".

+            </description>

+        </attribute>

+        <attribute>

+            <name>isLocale</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether the report parameter value is a locale/format related string.

+            </description>

+        </attribute>

+     </tag>   

+

+    <!--**********************************************-->

+    <!--             Report Parameter Value Tag       -->

+    <!--**********************************************-->

+     <tag>

+        <name>value</name>

+        <tag-class>org.eclipse.birt.report.taglib.ParamValueTag</tag-class>        

+        <body-content>JSP</body-content>

+        <description>

+            The param value tag specifies multiple values for a given param tag.

+        </description>

+        <attribute>

+            <name>value</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report parameter value. If doesn't set, value is null.

+            </description>

+        </attribute>

+        <attribute>

+            <name>displayText</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report parameter display text.

+            </description>

+        </attribute>

+     </tag>   

+     

+    <!--**********************************************-->

+    <!--             ParameterPage Tag                -->

+    <!--**********************************************-->

+    <tag>

+        <name>parameterPage</name>

+        <tag-class>org.eclipse.birt.report.taglib.RequesterTag</tag-class>

+        <body-content>JSP</body-content>

+        <description>

+            The parameterPage tag can help developers to display BIRT parameter page or create a user-defined parameter page.

+            This tag can collect these parameters and submit to BIRT servlet to handle request.

+        </description>

+        

+        <attribute>

+            <name>id</name>

+            <required>true</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the parameter page id.It should be unique.

+                It can contain number,letter or underline.                

+            </description>            

+        </attribute>    

+        

+        <attribute>

+            <name>name</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the parameter page name. 

+                If attribute 'isCustom' is true, this name should be required and unique.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>isCustom</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether uses the user-defined parameter page.

+                If false, use the BIRT parameter dialog.

+                Default to false.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>title</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report title displayed at the top.

+            </description>

+        </attribute>

+                        

+          <attribute>

+            <name>baseURL</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies base URL of BIRT viewer. 

+                Default to the current context.

+            </description>

+        </attribute>

+        

+        <attribute>

+            <name>scrolling </name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the DIV/IFrame style "scrolling ".

+                ( auto | yes | no )

+            </description>

+        </attribute>

+        

+       <attribute>

+            <name>position</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the style "position" of parameter page.

+                ( static | absolute | fixed | relative )

+            </description>

+        </attribute>

+

+       <attribute>

+            <name>style</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the style of parameter page.

+            </description>

+        </attribute>

+                        

+        <attribute>

+            <name>height</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the height of parameter page in pixels.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>width</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the width of parameter page in pixels.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>top</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the top of parameter page in pixels.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>left</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                 Sets the left of parameter page in pixels.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>frameborder</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                 Specifies whether displays the iframe border.

+                Default to no.

+                If set "isCustom" to true, ignore this attribute.

+                ( Yes | No )

+            </description>

+        </attribute>

+                        

+        <attribute>

+            <name>reportDesign</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report design file name.

+                ( Absolute path, relative path or URL )

+            </description>    

+        </attribute>        

+

+        <attribute>

+            <name>reportDocument</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report document file name. 

+                Noted: only support "file:" URL format.

+                ( Absolute path, relative path or URL ) 

+            </description>    

+        </attribute>        

+

+        <attribute>

+            <name>reportletId</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the instance id of reportlet.

+                The "reportDocument" attribute should be required.

+                Noted: frameset pattern doesn't support reportlet.

+            </description>    

+        </attribute>

+

+        <attribute>

+            <name>pattern</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the servlet pattern for request submit. 

+                BIRT supports three patterns: frameset, run and preview. 

+                Can refer to the user-defined servlet pattern.

+                Default to frameset.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>target</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the target window for request submit.

+            </description>            

+        </attribute>

+                        

+        <attribute>

+            <name>bookmark</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the targeted bookmark name.

+            </description>            

+        </attribute>

+        

+        <attribute>

+            <name>locale</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the Locale information.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>timeZone</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies a time zone id. For example: "America/Los_Angeles" or "GMT+1" or "GMT+01:00".

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>svg</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether supports the SVG output format or not.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>format</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the output format of report.

+            </description>            

+        </attribute>

+        

+        <attribute>

+            <name>emitterId</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the emitter id for the report output.

+            </description>            

+        </attribute>

+        

+        <attribute>

+            <name>pageOverflow</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the page overflow setting for the PDF format.

+                One of the following values:

+                0 for "auto", 1 for "actual size", 2 for "fit to page". 

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>rtl</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether supports rtl page or not.

+            </description>            

+        </attribute>

+                            

+        <attribute>

+            <name>resourceFolder</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the referenced resource folder.

+                Default value is defined in web.xml.

+            </description>            

+        </attribute>            

+                                

+        <attribute>

+            <name>forceOverwriteDocument</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether forces to overwrite the generated document.

+                If allowPageBreak is false,ignore this attribute.

+                Default value is defined in web.xml.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>showTitle</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether shows the report title.

+                Default to true.

+            </description>            

+        </attribute>

+        

+        <attribute>

+            <name>showToolBar</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether shows the toolbar.

+                Default to true.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>showNavigationBar</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether shows the Navigation Bar.

+                If allowPageBreak is false,ignore this attribute.

+                Default to true.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>isReportlet</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether render reportlet by bookmark.

+                Default to false.

+            </description>            

+        </attribute>

+                        

+    </tag>

+

+    <!--**********************************************-->

+    <!--      Report Parameter Definition Tag         -->

+    <!--**********************************************-->

+     <tag>

+        <name>paramDef</name>

+        <tag-class>org.eclipse.birt.report.taglib.ParamDefTag</tag-class>

+        <body-content>JSP</body-content>

+        <description>

+            The param tag is used to generate html code for defined parameter in ParameterPage tag.

+        </description>

+        <attribute>

+            <name>id</name>

+            <required>true</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the id of parameter control.It should be unique.

+                It can contain number,letter or underline.

+            </description>

+        </attribute>

+        <attribute>

+            <name>name</name>

+            <required>true</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report parameter name.

+            </description>

+        </attribute>

+        <attribute>

+            <name>pattern</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report parameter pattern format.

+                It is used to parse defined parameter value string.

+            </description>

+        </attribute>     

+        <attribute>

+            <name>value</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report parameter value. If doesn't set, use default value.

+            </description>

+        </attribute>

+        <attribute>

+            <name>displayText</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report parameter display text.

+            </description>

+        </attribute>

+        <attribute>

+            <name>isLocale</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether the report parameter value is a locale/format related string.

+                It is used to parse defined parameter value string.

+            </description>

+        </attribute>

+        <attribute>

+            <name>title</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the title attribute of parameter control.

+            </description>

+        </attribute>        

+        <attribute>

+            <name>cssClass</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the css class attribute of parameter control.

+            </description>

+        </attribute>

+        <attribute>

+            <name>style</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the parameter control style.

+            </description>

+        </attribute>        

+     </tag>                

+</taglib>
\ No newline at end of file
diff --git a/framework/example/webapp/birt/WEB-INF/controller.xml b/framework/example/webapp/birt/WEB-INF/controller.xml
new file mode 100644
index 0000000..64a0329
--- /dev/null
+++ b/framework/example/webapp/birt/WEB-INF/controller.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<!--

+Licensed to the Apache Software Foundation (ASF) under one

+or more contributor license agreements.  See the NOTICE file

+distributed with this work for additional information

+regarding copyright ownership.  The ASF licenses this file

+to you 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.

+-->

+

+<site-conf xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/site-conf.xsd">

+    <!-- The controller elements that are common to all OFBiz components

+         can be found in the following xml file. A component can override the

+         elements found in the common-controller.xml file. -->

+    <include location="component://common/webcommon/WEB-INF/common-controller.xml"/>

+    

+    <description>Birt Component Site Configuration File</description>

+    

+    <!--

+      These can be used to return the reports as views; make sure the classes are compiled and available

+        <handler name="datavision" type="view" class="org.ofbiz.webapp.view.DataVisionViewHandler"/>

+        <handler name="jasperreportspdf" type="view" class="org.ofbiz.webapp.view.JasperReportsPdfViewHandler"/>

+        <handler name="jasperreportsxml" type="view" class="org.ofbiz.webapp.view.JasperReportsXmlViewHandler"/>

+    -->

+

+    <!-- Events to run on every request before security (chains exempt) -->

+    <!--

+    <preprocessor>

+    </preprocessor>

+    -->

+    <!-- Events to run on every request after all other processing (chains exempt) -->

+    <!--

+    <postprocessor>

+        <event type="java" path="org.ofbiz.webapp.event.TestEvent" invoke="test"/>

+    </postprocessor>

+    -->

+

+    <!-- Request Mappings -->

+    <request-map uri="main">

+        <security https="true" auth="true"/>

+        <response name="success" type="view" value="main"/>

+    </request-map>

+    <request-map uri="Report">

+        <security https="true" auth="true"/>

+        <response name="success" type="view" value="Report"/>

+    </request-map>

+    <request-map uri="Mail">

+        <security https="true" auth="true"/>

+        <response name="success" type="view" value="Mail"/>

+    </request-map>

+    <request-map uri="sendBirtMail">

+        <security https="true" auth="true"/>

+        <event type="service" invoke="sendBirtMail"/>

+        <response name="success" type="view" value="Mail"/>

+        <response name="error" type="view" value="Mail"/>

+    </request-map>

+    <request-map uri="ViewHandler">

+        <security https="true" auth="true"/>

+        <response name="success" type="view" value="ViewHandler"/>

+    </request-map>

+

+    <request-map uri="chartReport">

+        <security https="true" auth="true"/>

+        <response name="success" type="view" value="chartReport"/>

+    </request-map>

+    <request-map uri="chartViewHandler">

+        <security https="true" auth="true"/>

+        <response name="success" type="view" value="chartViewHandler"/>

+    </request-map>

+

+    <!-- end of request mappings -->

+

+    <!-- View Mappings -->

+    <view-map name="main" type="screen" page="component://example/widget/example/BirtScreens.xml#main"/>

+    <view-map name="Report" type="screen" page="component://example/widget/example/BirtScreens.xml#Report"/>

+    <view-map name="chartReport" type="screen" page="component://example/widget/example/BirtScreens.xml#chartReport"/>

+    <view-map name="Mail" type="screen" page="component://example/widget/example/BirtScreens.xml#EditMail"/>

+    

+    <!-- Supported Content Types -->

+    <!--

+        text/html

+        application/pdf

+        application/vnd.ms-excel

+        application/vnd.ms-word

+        application/vnd.ms-powerpoint

+     -->

+    <view-map name="ViewHandler" type="birt" page="component://example/webapp/birt/report/example.rptdesign" content-type="application/pdf"/>

+    <view-map name="chartViewHandler" type="birt" page="component://example/webapp/birt/report/chart.rptdesign" content-type="application/pdf"/>

+    <!-- end of view mappings -->

+</site-conf>

diff --git a/framework/example/webapp/birt/WEB-INF/server-config.wsdd b/framework/example/webapp/birt/WEB-INF/server-config.wsdd
new file mode 100644
index 0000000..768e790
--- /dev/null
+++ b/framework/example/webapp/birt/WEB-INF/server-config.wsdd
@@ -0,0 +1,970 @@
+<!--

+Licensed to the Apache Software Foundation (ASF) under one

+or more contributor license agreements.  See the NOTICE file

+distributed with this work for additional information

+regarding copyright ownership.  The ASF licenses this file

+to you 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.

+-->

+<!-- Use this file to deploy some handlers/chains and services      -->

+<!-- Two ways to do this:                                           -->

+<!--   java org.apache.axis.client.AdminClient deploy.wsdd          -->

+<!--      after the axis server is running                          -->

+<!-- or                                                             -->

+<!--   java org.apache.axis.utils.Admin client|server deploy.wsdd   -->

+<!--      from the same directory that the Axis engine runs         -->

+

+<deployment

+    xmlns="http://xml.apache.org/axis/wsdd/"

+    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

+

+    <globalConfiguration>

+        <parameter

+             name="adminPassword"

+             value="admin"/>

+        <parameter

+             name="sendMultiRefs"

+             value="true"/>

+        <parameter

+             name="sendXsiTypes"

+             value="true"/>

+        <parameter

+             name="attachments.implementation"

+             value="org.apache.axis.attachments.AttachmentsImpl"/>

+        <parameter

+             name="sendXMLDeclaration"

+             value="true"/>

+        <parameter

+             name="axis.sendMinimizedElements"

+             value="true"/>

+        <requestFlow>

+            <handler

+                 type="java:org.apache.axis.handlers.JWSHandler">

+                <parameter

+                     name="scope"

+                     value="session"/>

+            </handler>

+            <handler

+                 type="java:org.apache.axis.handlers.JWSHandler">

+                <parameter

+                     name="scope"

+                     value="request"/>

+                <parameter

+                     name="extension"

+                     value=".jwr"/>

+            </handler>

+        </requestFlow>

+    </globalConfiguration>

+    <handler

+         name="LocalResponder"

+         type="java:org.apache.axis.transport.local.LocalResponder"/>

+    <handler

+         name="URLMapper"

+         type="java:org.apache.axis.handlers.http.URLMapper"/>

+    <handler

+         name="Authenticate"

+         type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>

+

+

+  <service name="BirtSoapPort" provider="java:RPC" style="document" use="literal">

+      <parameter name="wsdlTargetNamespace" value="http://schemas.eclipse.org/birt/wsdl"/>

+      <parameter name="wsdlServiceElement" value="BirtViewerAPI"/>

+      <parameter name="schemaQualified" value="http://schemas.eclipse.org/birt"/>

+      <parameter name="wsdlServicePort" value="BirtSoapPort"/>

+      <parameter name="className" value="org.eclipse.birt.report.soapengine.endpoint.BirtSoapBindingImpl"/>

+      <parameter name="wsdlPortType" value="BirtSoapPort"/>

+      <parameter name="typeMappingVersion" value="1.2"/>

+      <operation name="getUpdatedObjects" qname="getUpdatedObjects" returnQName="retNS:GetUpdatedObjectsResponse" xmlns:retNS="http://schemas.eclipse.org/birt" returnType="rtns:GetUpdatedObjectsResponse" xmlns:rtns="http://schemas.eclipse.org/birt" >

+        <parameter qname="pns:GetUpdatedObjects" xmlns:pns="http://schemas.eclipse.org/birt" type="tns:GetUpdatedObjects" xmlns:tns="http://schemas.eclipse.org/birt"/>

+      </operation>

+      <parameter name="allowedMethods" value="getUpdatedObjects"/>

+

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:ColumnProperties"

+        type="java:org.eclipse.birt.report.soapengine.api.ColumnProperties"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:DataSet"

+        type="java:org.eclipse.birt.report.soapengine.api.DataSet"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:GetUpdatedObjects"

+        type="java:org.eclipse.birt.report.soapengine.api.GetUpdatedObjects"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:File"

+        type="java:org.eclipse.birt.report.soapengine.api.File"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:TOC"

+        type="java:org.eclipse.birt.report.soapengine.api.TOC"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:IOInfoList"

+        type="java:org.eclipse.birt.report.soapengine.api.IOInfoList"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:NumberCategoryChoice"

+        type="java:org.eclipse.birt.report.soapengine.api.NumberCategoryChoice"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:JoinCondition"

+        type="java:org.eclipse.birt.report.soapengine.api.JoinCondition"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:ChartAppearance"

+        type="java:org.eclipse.birt.report.soapengine.api.ChartAppearance"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:ReportId"

+        type="java:org.eclipse.birt.report.soapengine.api.ReportId"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:DataSource"

+        type="java:org.eclipse.birt.report.soapengine.api.DataSource"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:FormatRuleEffect"

+        type="java:org.eclipse.birt.report.soapengine.api.FormatRuleEffect"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:Data"

+        type="java:org.eclipse.birt.report.soapengine.api.Data"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:CategoryChoice"

+        type="java:org.eclipse.birt.report.soapengine.api.CategoryChoice"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:FilterList"

+        type="java:org.eclipse.birt.report.soapengine.api.FilterList"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:SelectionList"

+        type="java:org.eclipse.birt.report.soapengine.api.SelectionList"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:TableLayout"

+        type="java:org.eclipse.birt.report.soapengine.api.TableLayout"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:AggregateSetting"

+        type="java:org.eclipse.birt.report.soapengine.api.AggregateSetting"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:BRDExpression"

+        type="java:org.eclipse.birt.report.soapengine.api.BRDExpression"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:Alignment"

+        type="java:org.eclipse.birt.report.soapengine.api.Alignment"

+        serializer="org.apache.axis.encoding.ser.EnumSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.EnumDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:JoinDefinition"

+        type="java:org.eclipse.birt.report.soapengine.api.JoinDefinition"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:CellDefinition"

+        type="java:org.eclipse.birt.report.soapengine.api.CellDefinition"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:ReportElementList"

+        type="java:org.eclipse.birt.report.soapengine.api.ReportElementList"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:ChartLabels"

+        type="java:org.eclipse.birt.report.soapengine.api.ChartLabels"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:ColumnDefinitionGroup"

+        type="java:org.eclipse.birt.report.soapengine.api.ColumnDefinitionGroup"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:FilterExpression"

+        type="java:org.eclipse.birt.report.soapengine.api.FilterExpression"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:ConditionLineList"

+        type="java:org.eclipse.birt.report.soapengine.api.ConditionLineList"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:DataSetDefinition"

+        type="java:org.eclipse.birt.report.soapengine.api.DataSetDefinition"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:ThemeList"

+        type="java:org.eclipse.birt.report.soapengine.api.ThemeList"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:SortDefinitionList"

+        type="java:org.eclipse.birt.report.soapengine.api.SortDefinitionList"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:BindingList"

+        type="java:org.eclipse.birt.report.soapengine.api.BindingList"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:DataField"

+        type="java:org.eclipse.birt.report.soapengine.api.DataField"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:GroupDetail"

+        type="java:org.eclipse.birt.report.soapengine.api.GroupDetail"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:TableGroups"

+        type="java:org.eclipse.birt.report.soapengine.api.TableGroups"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:UpdateDialog"

+        type="java:org.eclipse.birt.report.soapengine.api.UpdateDialog"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:GetUpdatedObjectsResponse"

+        type="java:org.eclipse.birt.report.soapengine.api.GetUpdatedObjectsResponse"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:IOReference"

+        type="java:org.eclipse.birt.report.soapengine.api.IOReference"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:Export"

+        type="java:org.eclipse.birt.report.soapengine.api.Export"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:ExportCriteria"

+        type="java:org.eclipse.birt.report.soapengine.api.ExportCriteria"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:ConditionLine"

+        type="java:org.eclipse.birt.report.soapengine.api.ConditionLine"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:Font"

+        type="java:org.eclipse.birt.report.soapengine.api.Font"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:TableSectionContextMenuState"

+        type="java:org.eclipse.birt.report.soapengine.api.TableSectionContextMenuState"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:ToolbarState"

+        type="java:org.eclipse.birt.report.soapengine.api.ToolbarState"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:FormatRuleSet"

+        type="java:org.eclipse.birt.report.soapengine.api.FormatRuleSet"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:Vector"

+        type="java:org.eclipse.birt.report.soapengine.api.Vector"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:FilterClause"

+        type="java:org.eclipse.birt.report.soapengine.api.FilterClause"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:ResultSet"

+        type="java:org.eclipse.birt.report.soapengine.api.ResultSet"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:ReportElement"

+        type="java:org.eclipse.birt.report.soapengine.api.ReportElement"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:JoinMetadata"

+        type="java:org.eclipse.birt.report.soapengine.api.JoinMetadata"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:IOList"

+        type="java:org.eclipse.birt.report.soapengine.api.IOList"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:RepositoryPathSegment"

+        type="java:org.eclipse.birt.report.soapengine.api.RepositoryPathSegment"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:SortingDirection"

+        type="java:org.eclipse.birt.report.soapengine.api.SortingDirection"

+        serializer="org.apache.axis.encoding.ser.EnumSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.EnumDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:Operation"

+        type="java:org.eclipse.birt.report.soapengine.api.Operation"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:ReportParameterList"

+        type="java:org.eclipse.birt.report.soapengine.api.ReportParameterList"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:S_Info"

+        type="java:org.eclipse.birt.report.soapengine.api.S_Info"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:Oprand"

+        type="java:org.eclipse.birt.report.soapengine.api.Oprand"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:FormatRuleCondition"

+        type="java:org.eclipse.birt.report.soapengine.api.FormatRuleCondition"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:IOField"

+        type="java:org.eclipse.birt.report.soapengine.api.IOField"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:Filter"

+        type="java:org.eclipse.birt.report.soapengine.api.Filter"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:ChartProperties"

+        type="java:org.eclipse.birt.report.soapengine.api.ChartProperties"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:TableSections"

+        type="java:org.eclipse.birt.report.soapengine.api.TableSections"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:Update"

+        type="java:org.eclipse.birt.report.soapengine.api.Update"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:Column"

+        type="java:org.eclipse.birt.report.soapengine.api.Column"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:FormatRule"

+        type="java:org.eclipse.birt.report.soapengine.api.FormatRule"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:FileSearch"

+        type="java:org.eclipse.birt.report.soapengine.api.FileSearch"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:FilterType"

+        type="java:org.eclipse.birt.report.soapengine.api.FilterType"

+        serializer="org.apache.axis.encoding.ser.EnumSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.EnumDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:FileList"

+        type="java:org.eclipse.birt.report.soapengine.api.FileList"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:SortDefinition"

+        type="java:org.eclipse.birt.report.soapengine.api.SortDefinition"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:UpdateData"

+        type="java:org.eclipse.birt.report.soapengine.api.UpdateData"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:>ReportId>Type"

+        type="java:org.eclipse.birt.report.soapengine.api.ReportIdType"

+        serializer="org.apache.axis.encoding.ser.EnumSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.EnumDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:TableRowInfo"

+        type="java:org.eclipse.birt.report.soapengine.api.TableRowInfo"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:TableContextMenuState"

+        type="java:org.eclipse.birt.report.soapengine.api.TableContextMenuState"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:JoinList"

+        type="java:org.eclipse.birt.report.soapengine.api.JoinList"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:TableColContextMenuState"

+        type="java:org.eclipse.birt.report.soapengine.api.TableColContextMenuState"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:ChartDataBinding"

+        type="java:org.eclipse.birt.report.soapengine.api.ChartDataBinding"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:UpdateContent"

+        type="java:org.eclipse.birt.report.soapengine.api.UpdateContent"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:DataSetList"

+        type="java:org.eclipse.birt.report.soapengine.api.DataSetList"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:DataFieldFolder"

+        type="java:org.eclipse.birt.report.soapengine.api.DataFieldFolder"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:G_Info"

+        type="java:org.eclipse.birt.report.soapengine.api.G_Info"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:AvailableOperation"

+        type="java:org.eclipse.birt.report.soapengine.api.AvailableOperation"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:DesignState"

+        type="java:org.eclipse.birt.report.soapengine.api.DesignState"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:RepositoryPathSegmentList"

+        type="java:org.eclipse.birt.report.soapengine.api.RepositoryPathSegmentList"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:Theme"

+        type="java:org.eclipse.birt.report.soapengine.api.Theme"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:BoundDataColumn"

+        type="java:org.eclipse.birt.report.soapengine.api.BoundDataColumn"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:AggregateDefinition"

+        type="java:org.eclipse.birt.report.soapengine.api.AggregateDefinition"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:Binding"

+        type="java:org.eclipse.birt.report.soapengine.api.Binding"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:Format"

+        type="java:org.eclipse.birt.report.soapengine.api.Format"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:TableLayoutList"

+        type="java:org.eclipse.birt.report.soapengine.api.TableLayoutList"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:SelectItemChoice"

+        type="java:org.eclipse.birt.report.soapengine.api.SelectItemChoice"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:NumberCategoryChoiceList"

+        type="java:org.eclipse.birt.report.soapengine.api.NumberCategoryChoiceList"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:ChartLocation"

+        type="java:org.eclipse.birt.report.soapengine.api.ChartLocation"

+        serializer="org.apache.axis.encoding.ser.EnumSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.EnumDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:ResultSets"

+        type="java:org.eclipse.birt.report.soapengine.api.ResultSets"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:CategoryChoiceList"

+        type="java:org.eclipse.birt.report.soapengine.api.CategoryChoiceList"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:ReportParameter"

+        type="java:org.eclipse.birt.report.soapengine.api.ReportParameter"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:IOFieldList"

+        type="java:org.eclipse.birt.report.soapengine.api.IOFieldList"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:Page"

+        type="java:org.eclipse.birt.report.soapengine.api.Page"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:AxisDataBinding"

+        type="java:org.eclipse.birt.report.soapengine.api.AxisDataBinding"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:BoundDataColumnList"

+        type="java:org.eclipse.birt.report.soapengine.api.BoundDataColumnList"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:ChartType"

+        type="java:org.eclipse.birt.report.soapengine.api.ChartType"

+        serializer="org.apache.axis.encoding.ser.EnumSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.EnumDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:DataSourceList"

+        type="java:org.eclipse.birt.report.soapengine.api.DataSourceList"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:FileBrowsing"

+        type="java:org.eclipse.birt.report.soapengine.api.FileBrowsing"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:CascadeParameter"

+        type="java:org.eclipse.birt.report.soapengine.api.CascadeParameter"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:ColumnDefinition"

+        type="java:org.eclipse.birt.report.soapengine.api.ColumnDefinition"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+      <typeMapping

+        xmlns:ns="http://schemas.eclipse.org/birt"

+        qname="ns:SectionDefinition"

+        type="java:org.eclipse.birt.report.soapengine.api.SectionDefinition"

+        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

+        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

+        encodingStyle=""

+      />

+<namespace>http://schemas.eclipse.org/birt</namespace>

+  </service>

+    

+    <service

+         name="AdminService"

+         provider="java:MSG">

+        <parameter

+             name="allowedMethods"

+             value="AdminService"/>

+        <parameter

+             name="enableRemoteAdmin"

+             value="false"/>

+        <parameter

+             name="className"

+             value="org.apache.axis.utils.Admin"/>

+        <namespace>http://xml.apache.org/axis/wsdd/</namespace>

+    </service>

+    

+    <service

+         name="Version"

+         provider="java:RPC">

+        <parameter

+             name="allowedMethods"

+             value="getVersion"/>

+        <parameter

+             name="className"

+             value="org.apache.axis.Version"/>

+    </service>

+    

+    <transport

+         name="http">

+        <requestFlow>

+            <handler

+                 type="URLMapper"/>

+            <handler

+                 type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>

+        </requestFlow>

+    </transport>

+    

+    <transport

+         name="local">

+        <responseFlow>

+            <handler

+                 type="LocalResponder"/>

+        </responseFlow>

+    </transport>

+</deployment>

diff --git a/framework/example/webapp/birt/WEB-INF/web.xml b/framework/example/webapp/birt/WEB-INF/web.xml
new file mode 100644
index 0000000..0705c7e
--- /dev/null
+++ b/framework/example/webapp/birt/WEB-INF/web.xml
@@ -0,0 +1,292 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

+<!--

+Licensed to the Apache Software Foundation (ASF) under one

+or more contributor license agreements.  See the NOTICE file

+distributed with this work for additional information

+regarding copyright ownership.  The ASF licenses this file

+to you 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.

+-->

+

+<web-app>

+    <display-name>Open For Business - BIRT Component</display-name>

+    <description>BIRT Component of the Open For Business Project</description>

+    

+    <context-param>

+        <param-name>localDispatcherName</param-name><param-value>birt</param-value>

+        <description>A unique name used to identify/recognize the local dispatcher for the Service Engine</description>

+    </context-param>    

+    <context-param>

+        <param-name>entityDelegatorName</param-name><param-value>default</param-value>

+        <description>The Name of the Entity Delegator to use, defined in entityengine.xml</description>

+    </context-param>

+    <context-param>

+        <param-name>mainDecoratorLocation</param-name>

+        <param-value>component://example/widget/example/CommonScreens.xml</param-value>

+        <description>The location of the main-decorator screen to use for this webapp; referred to as a context variable in screen def XML files.</description>

+    </context-param>

+    <context-param>

+        <param-name>widgetVerbose</param-name>

+        <param-value>false</param-value>

+        <description>Enable widget boundary comments. See org.ofbiz.widget.ModelWidget.widgetBoundaryCommentsEnabled().</description>

+    </context-param>

+    <context-param>

+        <param-name>compressHTML</param-name>

+        <param-value>false</param-value>

+        <description>Remove unnecessary whitespace from HTML output.</description>

+    </context-param>

+    

+    <!-- Default locale setting.-->

+    <context-param>

+        <param-name>BIRT_VIEWER_LOCALE</param-name>

+        <param-value>en-US</param-value>

+    </context-param>

+    

+    <!-- 

+        Default timezone setting.

+        Examples: "Europe/Paris", "GMT+1".

+        Defaults to the container's timezone.       

+     -->

+    <context-param>

+        <param-name>BIRT_VIEWER_TIMEZONE</param-name>

+        <param-value></param-value>

+    </context-param>

+    

+    <!--

+        Report resources directory for preview. Defaults to ${birt home}

+    -->

+    <context-param>

+        <param-name>BIRT_VIEWER_WORKING_FOLDER</param-name>

+        <param-value>${ofbiz.home}/runtime/tempfiles</param-value>

+    </context-param>

+    

+    <!--

+        Temporary document files directory. Defaults to ${birt home}/documents

+    -->

+    <context-param>

+        <param-name>BIRT_VIEWER_DOCUMENT_FOLDER</param-name>

+        <param-value>${ofbiz.home}/runtime/tempfiles/documents</param-value>

+    </context-param>

+    

+    <!--

+        Flag whether the report resources can only be accessed under the

+        working folder. Defaults to true

+    -->

+    <context-param>

+        <param-name>WORKING_FOLDER_ACCESS_ONLY</param-name>

+        <param-value>true</param-value>

+    </context-param>

+    

+    <!--

+        Temporary image/chart directory. Defaults to ${birt home}/report/images

+    -->

+    <context-param>

+        <param-name>BIRT_VIEWER_IMAGE_DIR</param-name>

+        <param-value>${ofbiz.home}/runtime/tempfiles/images</param-value>

+    </context-param>

+    

+    <!-- Engine log directory. Defaults to ${birt home}/logs -->

+    <context-param>

+        <param-name>BIRT_VIEWER_LOG_DIR</param-name>

+        <param-value>${ofbiz.home}/runtime/logs</param-value>

+    </context-param>

+    

+    <!-- Report engine log level -->

+    <context-param>

+        <param-name>BIRT_VIEWER_LOG_LEVEL</param-name>

+        <param-value>WARNING</param-value>

+    </context-param>

+    

+    <!--

+        Directory where to store all the birt report script libraries (JARs).

+        Defaults to ${birt home}/scriptlib

+    -->

+    <context-param>

+        <param-name>BIRT_VIEWER_SCRIPTLIB_DIR</param-name>

+        <param-value>${ofbiz.home}/framework/birt/lib/scriptlib</param-value>

+    </context-param>

+    

+    <!-- Resource location directory. Defaults to ${birt home} -->

+    <context-param>

+        <param-name>BIRT_RESOURCE_PATH</param-name>

+        <param-value>${ofbiz.home}/runtime/tempfiles</param-value>

+    </context-param>

+    

+    <!-- Preview report rows limit. An empty value means no limit. -->

+    <context-param>

+        <param-name>BIRT_VIEWER_MAX_ROWS</param-name>

+        <param-value></param-value>

+    </context-param>

+    

+    <!--

+        Max cube fetch levels limit for report preview (Only used when

+        previewing a report design file using the preview pattern)

+    -->

+    <context-param>

+        <param-name>BIRT_VIEWER_MAX_CUBE_ROWLEVELS</param-name>

+        <param-value></param-value>

+    </context-param>

+    <context-param>

+        <param-name>BIRT_VIEWER_MAX_CUBE_COLUMNLEVELS</param-name>

+        <param-value></param-value>

+    </context-param>

+

+    <!-- Memory size in MB for creating a cube. -->

+    <context-param>

+        <param-name>BIRT_VIEWER_CUBE_MEMORY_SIZE</param-name>

+        <param-value></param-value>

+    </context-param>

+

+    <!-- Defines the BIRT viewer configuration file -->

+    <context-param>

+        <param-name>BIRT_VIEWER_CONFIG_FILE</param-name>

+        <param-value>WEB-INF/viewer.properties</param-value>

+    </context-param>

+

+    <!--

+        Flag whether to allow server-side printing. Possible values are "ON"

+        and "OFF". Defaults to "ON".

+    -->

+    <context-param>

+        <param-name>BIRT_VIEWER_PRINT_SERVERSIDE</param-name>

+        <param-value>ON</param-value>

+    </context-param>

+

+    <!--

+        Flag whether to force browser-optimized HTML output. Defaults to true

+    -->

+    <context-param>

+        <param-name>HTML_ENABLE_AGENTSTYLE_ENGINE</param-name>

+        <param-value>true</param-value>

+    </context-param>

+

+    <!--

+        Filename generator class/factory to use for the exported reports.

+    -->

+    <context-param>

+        <param-name>BIRT_FILENAME_GENERATOR_CLASS</param-name>

+        <param-value>org.eclipse.birt.report.utility.filename.DefaultFilenameGenerator</param-value>

+    </context-param>

+    

+    <filter>

+        <filter-name>ContextFilter</filter-name>

+        <display-name>ContextFilter</display-name>

+        <filter-class>org.ofbiz.webapp.control.ContextFilter</filter-class>

+        <init-param><param-name>disableContextSecurity</param-name><param-value>N</param-value></init-param>

+        <init-param>

+            <param-name>allowedPaths</param-name>

+            <param-value>/error:/control:/select:/index.html:/index.jsp:/default.html:/default.jsp:/images:/includes/maincss.css:/frameset:/run:/preview:/download:/parameter:/document:/output:/extract:/webcontent:/CancelTask.jsp</param-value>

+        </init-param>

+        <init-param><param-name>errorCode</param-name><param-value>403</param-value></init-param>

+        <init-param><param-name>redirectPath</param-name><param-value>/control/main</param-value></init-param>        

+    </filter>

+    <!--

+        Viewer Filter used to set the request character encoding to UTF-8.

+    -->

+    <filter>

+        <filter-name>ViewerFilter</filter-name>

+        <filter-class>org.eclipse.birt.report.filter.ViewerFilter</filter-class>

+    </filter>

+    

+    <filter-mapping><filter-name>ContextFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

+    <filter-mapping>

+        <filter-name>ViewerFilter</filter-name>

+        <servlet-name>ViewerServlet</servlet-name>

+    </filter-mapping>

+    <filter-mapping>

+        <filter-name>ViewerFilter</filter-name>

+        <servlet-name>EngineServlet</servlet-name>

+    </filter-mapping> 

+

+    <listener><listener-class>org.ofbiz.webapp.control.ControlEventListener</listener-class></listener>

+    <listener><listener-class>org.ofbiz.webapp.control.LoginEventListener</listener-class></listener>

+    <!-- NOTE: not all app servers support mounting implementations of the HttpSessionActivationListener interface -->

+    <!-- <listener><listener-class>org.ofbiz.webapp.control.ControlActivationEventListener</listener-class></listener> -->

+

+    <!-- Viewer HttpSession Listener -->

+    <listener>

+        <listener-class>org.eclipse.birt.report.listener.ViewerHttpSessionListener</listener-class>

+    </listener>

+  

+    <servlet>

+        <servlet-name>ControlServlet</servlet-name>

+        <display-name>ControlServlet</display-name>

+        <description>Main Control Servlet</description>

+        <servlet-class>org.ofbiz.webapp.control.ControlServlet</servlet-class>

+        <load-on-startup>1</load-on-startup>

+    </servlet>

+    <!-- Viewer Servlet, Supports SOAP -->

+    <!--

+    <servlet>

+        <servlet-name>ViewerServlet</servlet-name>

+        <servlet-class>org.ofbiz.birt.report.servlet.BirtViewerServlet</servlet-class>

+    </servlet>

+    -->

+    <!-- Engine Servlet -->

+    <servlet>

+        <servlet-name>EngineServlet</servlet-name>

+        <servlet-class>org.ofbiz.birt.report.servlet.BirtEngineServlet</servlet-class>

+    </servlet>

+    <servlet-mapping><servlet-name>ControlServlet</servlet-name><url-pattern>/control/*</url-pattern></servlet-mapping>

+    

+    <!--

+    <servlet-mapping>

+        <servlet-name>ViewerServlet</servlet-name>

+        <url-pattern>/frameset</url-pattern>

+    </servlet-mapping>

+    

+    <servlet-mapping>

+        <servlet-name>ViewerServlet</servlet-name>

+        <url-pattern>/run</url-pattern>

+    </servlet-mapping>

+    -->

+    

+    <servlet-mapping>

+        <servlet-name>EngineServlet</servlet-name>

+        <url-pattern>/preview</url-pattern>

+    </servlet-mapping>

+

+    <servlet-mapping>

+        <servlet-name>EngineServlet</servlet-name>

+        <url-pattern>/download</url-pattern>

+    </servlet-mapping>

+

+    <servlet-mapping>

+        <servlet-name>EngineServlet</servlet-name>

+        <url-pattern>/parameter</url-pattern>

+    </servlet-mapping>  

+

+    <servlet-mapping>

+        <servlet-name>EngineServlet</servlet-name>

+        <url-pattern>/document</url-pattern>

+    </servlet-mapping>  

+

+    <servlet-mapping>

+        <servlet-name>EngineServlet</servlet-name>

+        <url-pattern>/output</url-pattern>

+    </servlet-mapping>  

+    

+    <servlet-mapping>

+        <servlet-name>EngineServlet</servlet-name>

+        <url-pattern>/extract</url-pattern>

+    </servlet-mapping>

+

+    <session-config><session-timeout>60</session-timeout><!-- in minutes --></session-config>

+

+    <welcome-file-list>

+        <welcome-file>index.jsp</welcome-file>

+        <welcome-file>index.html</welcome-file>

+        <welcome-file>index.htm</welcome-file>

+    </welcome-file-list>

+</web-app>

diff --git a/framework/example/webapp/birt/birt/chartReport.ftl b/framework/example/webapp/birt/birt/chartReport.ftl
new file mode 100644
index 0000000..08e7b5f
--- /dev/null
+++ b/framework/example/webapp/birt/birt/chartReport.ftl
@@ -0,0 +1,30 @@
+<#--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<#assign birt = JspTaglibs["/WEB-INF/birt.tld"]/>
+
+<@birt.report id="birtReport"
+    reportDesign="component://example/webapp/birt/report/chart.rptdesign"
+    baseURL="/birt"
+    height="700"
+    width="900"
+    format="html"
+    isHostPage="false"
+    pageNum="2">
+</@birt.report>
\ No newline at end of file
diff --git a/framework/example/webapp/birt/birt/report.ftl b/framework/example/webapp/birt/birt/report.ftl
new file mode 100644
index 0000000..ff22cb9
--- /dev/null
+++ b/framework/example/webapp/birt/birt/report.ftl
@@ -0,0 +1,30 @@
+<#--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<#assign birt = JspTaglibs["/WEB-INF/birt.tld"]/>
+
+<@birt.report id="birtReport"
+    reportDesign="component://example/webapp/birt/report/example.rptdesign"
+    baseURL="/birt"
+    height="700"
+    width="900"
+    format="html"
+    isHostPage="false"
+    pageNum="2">
+</@birt.report>
\ No newline at end of file
diff --git a/framework/example/webapp/birt/error/error.jsp b/framework/example/webapp/birt/error/error.jsp
new file mode 100644
index 0000000..522a238
--- /dev/null
+++ b/framework/example/webapp/birt/error/error.jsp
@@ -0,0 +1,52 @@
+<%--

+Licensed to the Apache Software Foundation (ASF) under one

+or more contributor license agreements.  See the NOTICE file

+distributed with this work for additional information

+regarding copyright ownership.  The ASF licenses this file

+to you 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.

+--%>

+<%@ page import="org.ofbiz.base.util.*" %>

+<html>

+<head>

+<title>Open For Business Message</title>

+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

+</head>

+

+<% String errorMsg = (String) request.getAttribute("_ERROR_MESSAGE_"); %>

+

+<body bgcolor="#FFFFFF">

+<div align="center">

+  <br/>

+  <table width="100%" border="1" height="200">

+    <tr>

+      <td>

+        <table width="100%" border="0" height="200">

+          <tr bgcolor="#CC6666"> 

+            <td height="45"> 

+              <div align="center"><font face="Verdana, Arial, Helvetica, sans-serif" size="4" color="#FFFFFF"><b>:ERROR MESSAGE:</b></font></div>

+            </td>

+          </tr>

+          <tr> 

+            <td>

+              <div align="left"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><%=UtilFormatOut.replaceString(errorMsg, "\n", "<br/>")%></font></div>

+            </td>

+          </tr>

+        </table>

+      </td>

+    </tr>

+  </table>

+</div>

+<div align="center"></div>

+</body>

+</html>

diff --git a/framework/example/webapp/birt/index.jsp b/framework/example/webapp/birt/index.jsp
new file mode 100644
index 0000000..9d916ea
--- /dev/null
+++ b/framework/example/webapp/birt/index.jsp
@@ -0,0 +1,19 @@
+<%--

+Licensed to the Apache Software Foundation (ASF) under one

+or more contributor license agreements.  See the NOTICE file

+distributed with this work for additional information

+regarding copyright ownership.  The ASF licenses this file

+to you 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.

+--%>

+<%response.sendRedirect("control/main");%>

diff --git a/framework/example/webapp/birt/report/chart.rptdesign b/framework/example/webapp/birt/report/chart.rptdesign
new file mode 100644
index 0000000..97c2884
--- /dev/null
+++ b/framework/example/webapp/birt/report/chart.rptdesign
@@ -0,0 +1,2185 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+<report xmlns="http://www.eclipse.org/birt/2005/design" version="3.2.21" id="1">
+    <property name="createdBy">Eclipse BIRT Designer Version 2.6.0.v20100531 Build &lt;2.6.0.v20100609-1613></property>
+    <property name="units">in</property>
+    <method name="initialize"><![CDATA[importPackage(Packages.org.ofbiz.base.util)
+
+module = "chart.rptdesign";]]></method>
+    <property name="iconFile">/templates/blank_report.gif</property>
+    <property name="bidiLayoutOrientation">ltr</property>
+    <data-sources>
+        <script-data-source name="OFBiz" id="8"/>
+    </data-sources>
+    <data-sets>
+        <script-data-set name="Example" id="9">
+            <list-property name="resultSetHints">
+                <structure>
+                    <property name="position">1</property>
+                    <property name="name">exampleTypeId</property>
+                    <property name="dataType">string</property>
+                </structure>
+                <structure>
+                    <property name="position">2</property>
+                    <property name="name">total</property>
+                    <property name="dataType">string</property>
+                </structure>
+            </list-property>
+            <list-property name="columnHints">
+                <structure>
+                    <property name="columnName">exampleTypeId</property>
+                    <text-property name="displayName">exampleTypeId</text-property>
+                </structure>
+                <structure>
+                    <property name="columnName">total</property>
+                    <text-property name="displayName">total</text-property>
+                </structure>
+            </list-property>
+            <structure name="cachedMetaData">
+                <list-property name="resultSet">
+                    <structure>
+                        <property name="position">1</property>
+                        <property name="name">exampleTypeId</property>
+                        <property name="dataType">string</property>
+                    </structure>
+                    <structure>
+                        <property name="position">2</property>
+                        <property name="name">total</property>
+                        <property name="dataType">string</property>
+                    </structure>
+                </list-property>
+            </structure>
+            <property name="dataSource">OFBiz</property>
+            <method name="open"><![CDATA[examples = null;
+try {
+    examples = delegator.findList("ExampleCountByType", null, null, null, null, false);
+} catch (e) {
+    Debug.logError(e, module);
+}
+totalRow = 0;
+countOfRow = 0;
+if (examples) {
+    totalRow = examples.size() + 1;
+}]]></method>
+            <method name="fetch"><![CDATA[if (countOfRow == totalRow - 1) return false;
+
+example = examples.get(countOfRow);
+total = example.getString("total");
+exampleTypeId = example.getString("exampleTypeId");
+
+row["total"] = total;
+row["exampleTypeId"] = exampleTypeId;
+
+countOfRow ++;
+return true;]]></method>
+        </script-data-set>
+    </data-sets>
+    <styles>
+        <style name="report" id="4">
+            <property name="fontFamily">sans-serif</property>
+            <property name="fontSize">10pt</property>
+        </style>
+        <style name="crosstab-cell" id="5">
+            <property name="borderBottomColor">#CCCCCC</property>
+            <property name="borderBottomStyle">solid</property>
+            <property name="borderBottomWidth">1pt</property>
+            <property name="borderLeftColor">#CCCCCC</property>
+            <property name="borderLeftStyle">solid</property>
+            <property name="borderLeftWidth">1pt</property>
+            <property name="borderRightColor">#CCCCCC</property>
+            <property name="borderRightStyle">solid</property>
+            <property name="borderRightWidth">1pt</property>
+            <property name="borderTopColor">#CCCCCC</property>
+            <property name="borderTopStyle">solid</property>
+            <property name="borderTopWidth">1pt</property>
+        </style>
+        <style name="crosstab" id="6">
+            <property name="borderBottomColor">#CCCCCC</property>
+            <property name="borderBottomStyle">solid</property>
+            <property name="borderBottomWidth">1pt</property>
+            <property name="borderLeftColor">#CCCCCC</property>
+            <property name="borderLeftStyle">solid</property>
+            <property name="borderLeftWidth">1pt</property>
+            <property name="borderRightColor">#CCCCCC</property>
+            <property name="borderRightStyle">solid</property>
+            <property name="borderRightWidth">1pt</property>
+            <property name="borderTopColor">#CCCCCC</property>
+            <property name="borderTopStyle">solid</property>
+            <property name="borderTopWidth">1pt</property>
+        </style>
+    </styles>
+    <page-setup>
+        <simple-master-page name="Simple MasterPage" id="2">
+            <page-footer>
+                <text id="3">
+                    <property name="contentType">html</property>
+                    <text-property name="content"><![CDATA[<value-of>new Date()</value-of>]]></text-property>
+                </text>
+            </page-footer>
+        </simple-master-page>
+    </page-setup>
+    <body>
+        <table id="32">
+            <property name="dataSet">Example</property>
+            <list-property name="boundDataColumns">
+                <structure>
+                    <property name="name">exampleTypeId</property>
+                    <text-property name="displayName">exampleTypeId</text-property>
+                    <expression name="expression" type="javascript">dataSetRow["exampleTypeId"]</expression>
+                    <property name="dataType">string</property>
+                </structure>
+                <structure>
+                    <property name="name">total</property>
+                    <text-property name="displayName">total</text-property>
+                    <expression name="expression" type="javascript">dataSetRow["total"]</expression>
+                    <property name="dataType">string</property>
+                </structure>
+            </list-property>
+            <column id="42"/>
+            <column id="43"/>
+            <header>
+                <row id="33">
+                    <cell id="34">
+                        <label id="44">
+                            <text-property name="text">exampleTypeId</text-property>
+                        </label>
+                    </cell>
+                    <cell id="35">
+                        <label id="47">
+                            <text-property name="text">total</text-property>
+                        </label>
+                    </cell>
+                </row>
+            </header>
+            <detail>
+                <row id="36">
+                    <cell id="37">
+                        <data id="45">
+                            <property name="whiteSpace">nowrap</property>
+                            <property name="resultSetColumn">exampleTypeId</property>
+                        </data>
+                    </cell>
+                    <cell id="38">
+                        <data id="48">
+                            <property name="whiteSpace">nowrap</property>
+                            <property name="resultSetColumn">total</property>
+                        </data>
+                    </cell>
+                </row>
+            </detail>
+            <footer>
+                <row id="39">
+                    <cell id="40"/>
+                    <cell id="41"/>
+                </row>
+            </footer>
+        </table>
+        <extended-item extensionName="Chart" id="49">
+            <xml-property name="xmlRepresentation"><![CDATA[<model:ChartWithAxes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:attribute="http://www.birt.eclipse.org/ChartModelAttribute" xmlns:data="http://www.birt.eclipse.org/ChartModelData" xmlns:layout="http://www.birt.eclipse.org/ChartModelLayout" xmlns:model="http://www.birt.eclipse.org/ChartModel" xmlns:type="http://www.birt.eclipse.org/ChartModelType">
+  <Version>2.5.1</Version>
+  <Type>Bar Chart</Type>
+  <SubType>Side-by-side</SubType>
+  <Block>
+    <Children xsi:type="layout:TitleBlock">
+      <Bounds>
+        <Left>0.0</Left>
+        <Top>0.0</Top>
+        <Width>0.0</Width>
+        <Height>0.0</Height>
+      </Bounds>
+      <Insets>
+        <Top>3.0</Top>
+        <Left>3.0</Left>
+        <Bottom>3.0</Bottom>
+        <Right>3.0</Right>
+      </Insets>
+      <Row>-1</Row>
+      <Column>-1</Column>
+      <Rowspan>-1</Rowspan>
+      <Columnspan>-1</Columnspan>
+      <Outline>
+        <Style>Solid</Style>
+        <Thickness>1</Thickness>
+        <Color>
+          <Transparency>255</Transparency>
+          <Red>0</Red>
+          <Green>0</Green>
+          <Blue>0</Blue>
+        </Color>
+        <Visible>false</Visible>
+      </Outline>
+      <Visible>true</Visible>
+      <Label>
+        <Caption>
+          <Value>Bar Chart</Value>
+          <Font>
+            <Size>16.0</Size>
+            <Bold>true</Bold>
+            <Alignment>
+              <horizontalAlignment>Center</horizontalAlignment>
+              <verticalAlignment>Center</verticalAlignment>
+            </Alignment>
+          </Font>
+        </Caption>
+        <Background xsi:type="attribute:ColorDefinition">
+          <Transparency>0</Transparency>
+          <Red>255</Red>
+          <Green>255</Green>
+          <Blue>255</Blue>
+        </Background>
+        <Outline>
+          <Style>Solid</Style>
+          <Thickness>1</Thickness>
+          <Color>
+            <Transparency>255</Transparency>
+            <Red>0</Red>
+            <Green>0</Green>
+            <Blue>0</Blue>
+          </Color>
+        </Outline>
+        <Insets>
+          <Top>0.0</Top>
+          <Left>2.0</Left>
+          <Bottom>0.0</Bottom>
+          <Right>3.0</Right>
+        </Insets>
+        <Visible>true</Visible>
+      </Label>
+    </Children>
+    <Children xsi:type="layout:Plot">
+      <Bounds>
+        <Left>0.0</Left>
+        <Top>0.0</Top>
+        <Width>0.0</Width>
+        <Height>0.0</Height>
+      </Bounds>
+      <Insets>
+        <Top>3.0</Top>
+        <Left>3.0</Left>
+        <Bottom>3.0</Bottom>
+        <Right>3.0</Right>
+      </Insets>
+      <Row>-1</Row>
+      <Column>-1</Column>
+      <Rowspan>-1</Rowspan>
+      <Columnspan>-1</Columnspan>
+      <Outline>
+        <Style>Solid</Style>
+        <Thickness>1</Thickness>
+        <Color>
+          <Transparency>255</Transparency>
+          <Red>0</Red>
+          <Green>0</Green>
+          <Blue>0</Blue>
+        </Color>
+        <Visible>false</Visible>
+      </Outline>
+      <Visible>true</Visible>
+      <HorizontalSpacing>5</HorizontalSpacing>
+      <VerticalSpacing>5</VerticalSpacing>
+      <ClientArea>
+        <Outline>
+          <Style>Solid</Style>
+          <Thickness>0</Thickness>
+          <Color>
+            <Transparency>255</Transparency>
+            <Red>0</Red>
+            <Green>0</Green>
+            <Blue>0</Blue>
+          </Color>
+          <Visible>false</Visible>
+        </Outline>
+        <Insets>
+          <Top>0.0</Top>
+          <Left>0.0</Left>
+          <Bottom>0.0</Bottom>
+          <Right>0.0</Right>
+        </Insets>
+      </ClientArea>
+    </Children>
+    <Children xsi:type="layout:Legend">
+      <Bounds>
+        <Left>0.0</Left>
+        <Top>0.0</Top>
+        <Width>0.0</Width>
+        <Height>0.0</Height>
+      </Bounds>
+      <Insets>
+        <Top>3.0</Top>
+        <Left>3.0</Left>
+        <Bottom>3.0</Bottom>
+        <Right>3.0</Right>
+      </Insets>
+      <Row>-1</Row>
+      <Column>-1</Column>
+      <Rowspan>-1</Rowspan>
+      <Columnspan>-1</Columnspan>
+      <Outline>
+        <Style>Solid</Style>
+        <Thickness>1</Thickness>
+        <Color>
+          <Transparency>255</Transparency>
+          <Red>0</Red>
+          <Green>0</Green>
+          <Blue>0</Blue>
+        </Color>
+        <Visible>false</Visible>
+      </Outline>
+      <Visible>false</Visible>
+      <ClientArea>
+        <Outline>
+          <Style>Solid</Style>
+          <Thickness>0</Thickness>
+          <Color>
+            <Transparency>255</Transparency>
+            <Red>0</Red>
+            <Green>0</Green>
+            <Blue>0</Blue>
+          </Color>
+          <Visible>false</Visible>
+        </Outline>
+        <Insets>
+          <Top>2.0</Top>
+          <Left>2.0</Left>
+          <Bottom>2.0</Bottom>
+          <Right>2.0</Right>
+        </Insets>
+      </ClientArea>
+      <Text>
+        <Value></Value>
+        <Font>
+          <Alignment/>
+        </Font>
+      </Text>
+      <Orientation>Vertical</Orientation>
+      <Direction>Top_Bottom</Direction>
+      <Separator>
+        <Style>Solid</Style>
+        <Thickness>1</Thickness>
+        <Color>
+          <Transparency>255</Transparency>
+          <Red>0</Red>
+          <Green>0</Green>
+          <Blue>0</Blue>
+        </Color>
+        <Visible>true</Visible>
+      </Separator>
+      <Position>Right</Position>
+      <ItemType>Series</ItemType>
+      <Title>
+        <Caption>
+          <Value></Value>
+          <Font>
+            <Alignment/>
+          </Font>
+        </Caption>
+        <Background xsi:type="attribute:ColorDefinition">
+          <Transparency>0</Transparency>
+          <Red>255</Red>
+          <Green>255</Green>
+          <Blue>255</Blue>
+        </Background>
+        <Outline>
+          <Style>Solid</Style>
+          <Thickness>1</Thickness>
+          <Color>
+            <Transparency>255</Transparency>
+            <Red>0</Red>
+            <Green>0</Green>
+            <Blue>0</Blue>
+          </Color>
+          <Visible>false</Visible>
+        </Outline>
+        <Insets>
+          <Top>0.0</Top>
+          <Left>2.0</Left>
+          <Bottom>0.0</Bottom>
+          <Right>3.0</Right>
+        </Insets>
+        <Visible>false</Visible>
+      </Title>
+      <TitlePosition>Above</TitlePosition>
+    </Children>
+    <Bounds>
+      <Left>0.0</Left>
+      <Top>0.0</Top>
+      <Width>212.0</Width>
+      <Height>130.0</Height>
+    </Bounds>
+    <Insets>
+      <Top>3.0</Top>
+      <Left>3.0</Left>
+      <Bottom>3.0</Bottom>
+      <Right>3.0</Right>
+    </Insets>
+    <Row>-1</Row>
+    <Column>-1</Column>
+    <Rowspan>-1</Rowspan>
+    <Columnspan>-1</Columnspan>
+    <Outline>
+      <Style>Solid</Style>
+      <Thickness>1</Thickness>
+      <Color>
+        <Transparency>255</Transparency>
+        <Red>0</Red>
+        <Green>0</Green>
+        <Blue>0</Blue>
+      </Color>
+      <Visible>false</Visible>
+    </Outline>
+    <Visible>true</Visible>
+  </Block>
+  <Dimension>Two_Dimensional</Dimension>
+  <Units>Points</Units>
+  <SeriesThickness>10.0</SeriesThickness>
+  <ExtendedProperties>
+    <Name>enable.area.alt</Name>
+    <Value>false</Value>
+  </ExtendedProperties>
+  <SampleData>
+    <BaseSampleData>
+      <DataSetRepresentation>A, B, C</DataSetRepresentation>
+    </BaseSampleData>
+    <OrthogonalSampleData>
+      <DataSetRepresentation>5,4,12</DataSetRepresentation>
+      <SeriesDefinitionIndex>0</SeriesDefinitionIndex>
+    </OrthogonalSampleData>
+  </SampleData>
+  <Interactivity/>
+  <EmptyMessage>
+    <Caption>
+      <Value>This chart contains no data.</Value>
+      <Font>
+        <Alignment>
+          <horizontalAlignment>Center</horizontalAlignment>
+          <verticalAlignment>Center</verticalAlignment>
+        </Alignment>
+      </Font>
+    </Caption>
+    <Background xsi:type="attribute:ColorDefinition">
+      <Transparency>64</Transparency>
+      <Red>127</Red>
+      <Green>127</Green>
+      <Blue>127</Blue>
+    </Background>
+    <Outline>
+      <Color>
+        <Transparency>128</Transparency>
+        <Red>127</Red>
+        <Green>127</Green>
+        <Blue>127</Blue>
+      </Color>
+      <Visible>true</Visible>
+    </Outline>
+    <Insets>
+      <Top>10.0</Top>
+      <Left>10.0</Left>
+      <Bottom>10.0</Bottom>
+      <Right>10.0</Right>
+    </Insets>
+    <Visible>false</Visible>
+  </EmptyMessage>
+  <Axes>
+    <Type>Text</Type>
+    <Title>
+      <Caption>
+        <Value>X-Axis Title</Value>
+        <Font>
+          <Size>14.0</Size>
+          <Bold>true</Bold>
+          <Alignment>
+            <horizontalAlignment>Center</horizontalAlignment>
+            <verticalAlignment>Center</verticalAlignment>
+          </Alignment>
+        </Font>
+      </Caption>
+      <Background xsi:type="attribute:ColorDefinition">
+        <Transparency>0</Transparency>
+        <Red>255</Red>
+        <Green>255</Green>
+        <Blue>255</Blue>
+      </Background>
+      <Outline>
+        <Style>Solid</Style>
+        <Thickness>1</Thickness>
+        <Color>
+          <Transparency>255</Transparency>
+          <Red>0</Red>
+          <Green>0</Green>
+          <Blue>0</Blue>
+        </Color>
+      </Outline>
+      <Insets>
+        <Top>0.0</Top>
+        <Left>2.0</Left>
+        <Bottom>0.0</Bottom>
+        <Right>3.0</Right>
+      </Insets>
+      <Visible>false</Visible>
+    </Title>
+    <TitlePosition>Below</TitlePosition>
+    <AssociatedAxes>
+      <Type>Linear</Type>
+      <Title>
+        <Caption>
+          <Value>Y-Axis Title</Value>
+          <Font>
+            <Size>14.0</Size>
+            <Bold>true</Bold>
+            <Alignment>
+              <horizontalAlignment>Center</horizontalAlignment>
+              <verticalAlignment>Center</verticalAlignment>
+            </Alignment>
+            <Rotation>90.0</Rotation>
+          </Font>
+        </Caption>
+        <Background xsi:type="attribute:ColorDefinition">
+          <Transparency>0</Transparency>
+          <Red>255</Red>
+          <Green>255</Green>
+          <Blue>255</Blue>
+        </Background>
+        <Outline>
+          <Style>Solid</Style>
+          <Thickness>1</Thickness>
+          <Color>
+            <Transparency>255</Transparency>
+            <Red>0</Red>
+            <Green>0</Green>
+            <Blue>0</Blue>
+          </Color>
+        </Outline>
+        <Insets>
+          <Top>0.0</Top>
+          <Left>2.0</Left>
+          <Bottom>0.0</Bottom>
+          <Right>3.0</Right>
+        </Insets>
+        <Visible>false</Visible>
+      </Title>
+      <TitlePosition>Left</TitlePosition>
+      <SeriesDefinitions>
+        <Query>
+          <Definition></Definition>
+        </Query>
+        <SeriesPalette>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>80</Red>
+            <Green>166</Green>
+            <Blue>218</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>242</Red>
+            <Green>88</Green>
+            <Blue>106</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>232</Red>
+            <Green>172</Green>
+            <Blue>57</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>128</Red>
+            <Green>255</Green>
+            <Blue>128</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>64</Red>
+            <Green>128</Green>
+            <Blue>128</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>128</Red>
+            <Green>128</Green>
+            <Blue>192</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>170</Red>
+            <Green>85</Green>
+            <Blue>85</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>128</Red>
+            <Green>128</Green>
+            <Blue>0</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>192</Red>
+            <Green>192</Green>
+            <Blue>192</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>255</Red>
+            <Green>255</Green>
+            <Blue>128</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>128</Red>
+            <Green>192</Green>
+            <Blue>128</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>7</Red>
+            <Green>146</Green>
+            <Blue>94</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>0</Red>
+            <Green>128</Green>
+            <Blue>255</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>255</Red>
+            <Green>128</Green>
+            <Blue>192</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>0</Red>
+            <Green>255</Green>
+            <Blue>255</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>255</Red>
+            <Green>128</Green>
+            <Blue>128</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>0</Red>
+            <Green>128</Green>
+            <Blue>192</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>128</Red>
+            <Green>128</Green>
+            <Blue>192</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>255</Red>
+            <Green>0</Green>
+            <Blue>255</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>128</Red>
+            <Green>64</Green>
+            <Blue>64</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>255</Red>
+            <Green>128</Green>
+            <Blue>64</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>80</Red>
+            <Green>240</Green>
+            <Blue>120</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>0</Red>
+            <Green>64</Green>
+            <Blue>128</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>128</Red>
+            <Green>0</Green>
+            <Blue>64</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>255</Red>
+            <Green>0</Green>
+            <Blue>128</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>128</Red>
+            <Green>128</Green>
+            <Blue>64</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>128</Red>
+            <Green>128</Green>
+            <Blue>128</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>255</Red>
+            <Green>128</Green>
+            <Blue>255</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>0</Red>
+            <Green>64</Green>
+            <Blue>0</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>0</Red>
+            <Green>0</Green>
+            <Blue>0</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>255</Red>
+            <Green>255</Green>
+            <Blue>255</Blue>
+          </Entries>
+          <Entries xsi:type="attribute:ColorDefinition">
+            <Transparency>255</Transparency>
+            <Red>255</Red>
+            <Green>128</Green>
+            <Blue>0</Blue>
+          </Entries>
+        </SeriesPalette>
+        <Series xsi:type="type:BarSeries">
+          <Visible>true</Visible>
+          <Label>
+            <Caption>
+              <Value></Value>
+              <Font>
+                <Alignment/>
+              </Font>
+            </Caption>
+            <Background xsi:type="attribute:ColorDefinition">
+              <Transparency>0</Transparency>
+              <Red>255</Red>
+              <Green>255</Green>
+              <Blue>255</Blue>
+            </Background>
+            <Outline>
+              <Style>Solid</Style>
+              <Thickness>1</Thickness>
+              <Color>
+                <Transparency>255</Transparency>
+                <Red>0</Red>
+                <Green>0</Green>
+                <Blue>0</Blue>
+              </Color>
+              <Visible>false</Visible>
+            </Outline>
+            <Insets>
+              <Top>0.0</Top>
+              <Left>2.0</Left>
+              <Bottom>0.0</Bottom>
+              <Right>3.0</Right>
+            </Insets>
+            <Visible>false</Visible>
+          </Label>
+          <DataDefinition>
+            <Definition>row[&quot;total&quot;]</Definition>
+            <Grouping>
+              <GroupType>Text</GroupType>
+              <AggregateExpression>Sum</AggregateExpression>
+            </Grouping>
+          </DataDefinition>
+          <SeriesIdentifier>Series 1</SeriesIdentifier>
+          <DataPoint>
+            <Components>
+              <Type>Orthogonal_Value</Type>
+            </Components>
+            <Separator>, </Separator>
+          </DataPoint>
+          <LabelPosition>Outside</LabelPosition>
+          <Stacked>false</Stacked>
+          <Riser>Rectangle</Riser>
+        </Series>
+        <Grouping>
+          <GroupType>Text</GroupType>
+          <AggregateExpression>Sum</AggregateExpression>
+        </Grouping>
+      </SeriesDefinitions>
+      <Orientation>Vertical</Orientation>
+      <LineAttributes>
+        <Style>Solid</Style>
+        <Thickness>1</Thickness>
+        <Visible>true</Visible>
+      </LineAttributes>
+      <Label>
+        <Caption>
+          <Value></Value>
+          <Font>
+            <Alignment/>
+          </Font>
+        </Caption>
+        <Background xsi:type="attribute:ColorDefinition">
+          <Transparency>0</Transparency>
+          <Red>255</Red>
+          <Green>255</Green>
+          <Blue>255</Blue>
+        </Background>
+        <Outline>
+          <Style>Solid</Style>
+          <Thickness>1</Thickness>
+          <Color>
+            <Transparency>255</Transparency>
+            <Red>0</Red>
+            <Green>0</Green>
+            <Blue>0</Blue>
+          </Color>
+        </Outline>
+        <Insets>
+          <Top>0.0</Top>
+          <Left>2.0</Left>
+          <Bottom>0.0</Bottom>
+          <Right>3.0</Right>
+        </Insets>
+        <Visible>true</Visible>
+      </Label>
+      <LabelPosition>Left</LabelPosition>
+      <MajorGrid>
+        <LineAttributes>
+          <Style>Solid</Style>
+          <Thickness>1</Thickness>
+          <Color>
+            <Transparency>255</Transparency>
+            <Red>196</Red>
+            <Green>196</Green>
+            <Blue>196</Blue>
+          </Color>
+          <Visible>false</Visible>
+        </LineAttributes>
+        <TickStyle>Across</TickStyle>
+        <TickAttributes>
+          <Style>Solid</Style>
+          <Thickness>1</Thickness>
+          <Color>
+            <Transparency>255</Transparency>
+            <Red>196</Red>
+            <Green>196</Green>
+            <Blue>196</Blue>
+          </Color>
+          <Visible>true</Visible>
+        </TickAttributes>
+      </MajorGrid>
+      <MinorGrid>
+        <LineAttributes>
+          <Style>Solid</Style>
+          <Thickness>1</Thickness>
+          <Color>
+            <Transparency>255</Transparency>
+            <Red>225</Red>
+            <Green>225</Green>
+            <Blue>225</Blue>
+          </Color>
+          <Visible>false</Visible>
+        </LineAttributes>
+        <TickStyle>Across</TickStyle>
+        <TickAttributes>
+          <Style>Solid</Style>
+          <Thickness>1</Thickness>
+          <Color>
+            <Transparency>255</Transparency>
+            <Red>225</Red>
+            <Green>225</Green>
+            <Blue>225</Blue>
+          </Color>
+          <Visible>false</Visible>
+        </TickAttributes>
+      </MinorGrid>
+      <Scale>
+        <MinorGridsPerUnit>5</MinorGridsPerUnit>
+      </Scale>
+      <Origin>
+        <Type>Min</Type>
+        <Value xsi:type="data:NumberDataElement">
+          <Value>0.0</Value>
+        </Value>
+      </Origin>
+      <PrimaryAxis>true</PrimaryAxis>
+      <Percent>false</Percent>
+    </AssociatedAxes>
+    <SeriesDefinitions>
+      <Query>
+        <Definition></Definition>
+      </Query>
+      <SeriesPalette>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>80</Red>
+          <Green>166</Green>
+          <Blue>218</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>242</Red>
+          <Green>88</Green>
+          <Blue>106</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>232</Red>
+          <Green>172</Green>
+          <Blue>57</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>128</Red>
+          <Green>255</Green>
+          <Blue>128</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>64</Red>
+          <Green>128</Green>
+          <Blue>128</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>128</Red>
+          <Green>128</Green>
+          <Blue>192</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>170</Red>
+          <Green>85</Green>
+          <Blue>85</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>128</Red>
+          <Green>128</Green>
+          <Blue>0</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>192</Red>
+          <Green>192</Green>
+          <Blue>192</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>255</Red>
+          <Green>255</Green>
+          <Blue>128</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>128</Red>
+          <Green>192</Green>
+          <Blue>128</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>7</Red>
+          <Green>146</Green>
+          <Blue>94</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>0</Red>
+          <Green>128</Green>
+          <Blue>255</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>255</Red>
+          <Green>128</Green>
+          <Blue>192</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>0</Red>
+          <Green>255</Green>
+          <Blue>255</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>255</Red>
+          <Green>128</Green>
+          <Blue>128</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>0</Red>
+          <Green>128</Green>
+          <Blue>192</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>128</Red>
+          <Green>128</Green>
+          <Blue>192</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>255</Red>
+          <Green>0</Green>
+          <Blue>255</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>128</Red>
+          <Green>64</Green>
+          <Blue>64</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>255</Red>
+          <Green>128</Green>
+          <Blue>64</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>80</Red>
+          <Green>240</Green>
+          <Blue>120</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>0</Red>
+          <Green>64</Green>
+          <Blue>128</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>128</Red>
+          <Green>0</Green>
+          <Blue>64</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>255</Red>
+          <Green>0</Green>
+          <Blue>128</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>128</Red>
+          <Green>128</Green>
+          <Blue>64</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>128</Red>
+          <Green>128</Green>
+          <Blue>128</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>255</Red>
+          <Green>128</Green>
+          <Blue>255</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>0</Red>
+          <Green>64</Green>
+          <Blue>0</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>0</Red>
+          <Green>0</Green>
+          <Blue>0</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>255</Red>
+          <Green>255</Green>
+          <Blue>255</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>255</Red>
+          <Green>128</Green>
+          <Blue>0</Blue>
+        </Entries>
+      </SeriesPalette>
+      <Series>
+        <Visible>true</Visible>
+        <Label>
+          <Caption>
+            <Value></Value>
+            <Font>
+              <Alignment/>
+            </Font>
+          </Caption>
+          <Background xsi:type="attribute:ColorDefinition">
+            <Transparency>0</Transparency>
+            <Red>255</Red>
+            <Green>255</Green>
+            <Blue>255</Blue>
+          </Background>
+          <Outline>
+            <Style>Solid</Style>
+            <Thickness>1</Thickness>
+            <Color>
+              <Transparency>255</Transparency>
+              <Red>0</Red>
+              <Green>0</Green>
+              <Blue>0</Blue>
+            </Color>
+            <Visible>false</Visible>
+          </Outline>
+          <Insets>
+            <Top>0.0</Top>
+            <Left>2.0</Left>
+            <Bottom>0.0</Bottom>
+            <Right>3.0</Right>
+          </Insets>
+          <Visible>false</Visible>
+        </Label>
+        <DataDefinition>
+          <Definition>row[&quot;exampleTypeId&quot;]</Definition>
+        </DataDefinition>
+        <SeriesIdentifier></SeriesIdentifier>
+        <DataPoint>
+          <Components>
+            <Type>Orthogonal_Value</Type>
+          </Components>
+          <Separator>, </Separator>
+        </DataPoint>
+        <LabelPosition>Outside</LabelPosition>
+        <Stacked>false</Stacked>
+      </Series>
+      <Grouping>
+        <Enabled>true</Enabled>
+        <GroupType>Text</GroupType>
+        <AggregateExpression>Sum</AggregateExpression>
+      </Grouping>
+    </SeriesDefinitions>
+    <Orientation>Horizontal</Orientation>
+    <LineAttributes>
+      <Style>Solid</Style>
+      <Thickness>1</Thickness>
+      <Visible>true</Visible>
+    </LineAttributes>
+    <Label>
+      <Caption>
+        <Value></Value>
+        <Font>
+          <Alignment/>
+        </Font>
+      </Caption>
+      <Background xsi:type="attribute:ColorDefinition">
+        <Transparency>0</Transparency>
+        <Red>255</Red>
+        <Green>255</Green>
+        <Blue>255</Blue>
+      </Background>
+      <Outline>
+        <Style>Solid</Style>
+        <Thickness>1</Thickness>
+        <Color>
+          <Transparency>255</Transparency>
+          <Red>0</Red>
+          <Green>0</Green>
+          <Blue>0</Blue>
+        </Color>
+      </Outline>
+      <Insets>
+        <Top>0.0</Top>
+        <Left>2.0</Left>
+        <Bottom>0.0</Bottom>
+        <Right>3.0</Right>
+      </Insets>
+      <Visible>true</Visible>
+    </Label>
+    <LabelPosition>Below</LabelPosition>
+    <MajorGrid>
+      <LineAttributes>
+        <Style>Solid</Style>
+        <Thickness>1</Thickness>
+        <Color>
+          <Transparency>255</Transparency>
+          <Red>196</Red>
+          <Green>196</Green>
+          <Blue>196</Blue>
+        </Color>
+        <Visible>false</Visible>
+      </LineAttributes>
+      <TickStyle>Across</TickStyle>
+      <TickAttributes>
+        <Style>Solid</Style>
+        <Thickness>1</Thickness>
+        <Color>
+          <Transparency>255</Transparency>
+          <Red>196</Red>
+          <Green>196</Green>
+          <Blue>196</Blue>
+        </Color>
+        <Visible>true</Visible>
+      </TickAttributes>
+    </MajorGrid>
+    <MinorGrid>
+      <LineAttributes>
+        <Style>Solid</Style>
+        <Thickness>1</Thickness>
+        <Color>
+          <Transparency>255</Transparency>
+          <Red>225</Red>
+          <Green>225</Green>
+          <Blue>225</Blue>
+        </Color>
+        <Visible>false</Visible>
+      </LineAttributes>
+      <TickStyle>Across</TickStyle>
+      <TickAttributes>
+        <Style>Solid</Style>
+        <Thickness>1</Thickness>
+        <Color>
+          <Transparency>255</Transparency>
+          <Red>225</Red>
+          <Green>225</Green>
+          <Blue>225</Blue>
+        </Color>
+        <Visible>false</Visible>
+      </TickAttributes>
+    </MinorGrid>
+    <Scale>
+      <MinorGridsPerUnit>5</MinorGridsPerUnit>
+    </Scale>
+    <Origin>
+      <Type>Min</Type>
+      <Value xsi:type="data:NumberDataElement">
+        <Value>0.0</Value>
+      </Value>
+    </Origin>
+    <PrimaryAxis>true</PrimaryAxis>
+    <CategoryAxis>true</CategoryAxis>
+    <Percent>false</Percent>
+  </Axes>
+  <Orientation>Vertical</Orientation>
+  <UnitSpacing>50.0</UnitSpacing>
+  <Rotation/>
+</model:ChartWithAxes>
+]]></xml-property>
+            <property name="outputFormat">SVG</property>
+            <property name="inheritColumns">true</property>
+            <property name="dataSet">Example</property>
+            <property name="height">130pt</property>
+            <property name="width">212pt</property>
+            <list-property name="boundDataColumns">
+                <structure>
+                    <property name="name">exampleTypeId</property>
+                    <expression name="expression" type="javascript">dataSetRow["exampleTypeId"]</expression>
+                    <property name="dataType">string</property>
+                </structure>
+                <structure>
+                    <property name="name">total</property>
+                    <expression name="expression" type="javascript">dataSetRow["total"]</expression>
+                    <property name="dataType">string</property>
+                </structure>
+            </list-property>
+        </extended-item>
+        <extended-item extensionName="Chart" id="50">
+            <xml-property name="xmlRepresentation"><![CDATA[<model:ChartWithoutAxes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:attribute="http://www.birt.eclipse.org/ChartModelAttribute" xmlns:layout="http://www.birt.eclipse.org/ChartModelLayout" xmlns:model="http://www.birt.eclipse.org/ChartModel" xmlns:type="http://www.birt.eclipse.org/ChartModelType">
+  <Version>2.5.1</Version>
+  <Type>Pie Chart</Type>
+  <SubType>Standard</SubType>
+  <Block>
+    <Children xsi:type="layout:TitleBlock">
+      <Bounds>
+        <Left>0.0</Left>
+        <Top>0.0</Top>
+        <Width>0.0</Width>
+        <Height>0.0</Height>
+      </Bounds>
+      <Insets>
+        <Top>3.0</Top>
+        <Left>3.0</Left>
+        <Bottom>3.0</Bottom>
+        <Right>3.0</Right>
+      </Insets>
+      <Row>-1</Row>
+      <Column>-1</Column>
+      <Rowspan>-1</Rowspan>
+      <Columnspan>-1</Columnspan>
+      <Outline>
+        <Style>Solid</Style>
+        <Thickness>1</Thickness>
+        <Color>
+          <Transparency>255</Transparency>
+          <Red>0</Red>
+          <Green>0</Green>
+          <Blue>0</Blue>
+        </Color>
+        <Visible>false</Visible>
+      </Outline>
+      <Visible>true</Visible>
+      <Label>
+        <Caption>
+          <Value>Pie Chart</Value>
+          <Font>
+            <Size>16.0</Size>
+            <Bold>true</Bold>
+            <Alignment>
+              <horizontalAlignment>Center</horizontalAlignment>
+              <verticalAlignment>Center</verticalAlignment>
+            </Alignment>
+          </Font>
+        </Caption>
+        <Background xsi:type="attribute:ColorDefinition">
+          <Transparency>0</Transparency>
+          <Red>255</Red>
+          <Green>255</Green>
+          <Blue>255</Blue>
+        </Background>
+        <Outline>
+          <Style>Solid</Style>
+          <Thickness>1</Thickness>
+          <Color>
+            <Transparency>255</Transparency>
+            <Red>0</Red>
+            <Green>0</Green>
+            <Blue>0</Blue>
+          </Color>
+        </Outline>
+        <Insets>
+          <Top>0.0</Top>
+          <Left>2.0</Left>
+          <Bottom>0.0</Bottom>
+          <Right>3.0</Right>
+        </Insets>
+        <Visible>true</Visible>
+      </Label>
+    </Children>
+    <Children xsi:type="layout:Plot">
+      <Bounds>
+        <Left>0.0</Left>
+        <Top>0.0</Top>
+        <Width>0.0</Width>
+        <Height>0.0</Height>
+      </Bounds>
+      <Insets>
+        <Top>3.0</Top>
+        <Left>3.0</Left>
+        <Bottom>3.0</Bottom>
+        <Right>3.0</Right>
+      </Insets>
+      <Row>-1</Row>
+      <Column>-1</Column>
+      <Rowspan>-1</Rowspan>
+      <Columnspan>-1</Columnspan>
+      <Outline>
+        <Style>Solid</Style>
+        <Thickness>1</Thickness>
+        <Color>
+          <Transparency>255</Transparency>
+          <Red>0</Red>
+          <Green>0</Green>
+          <Blue>0</Blue>
+        </Color>
+        <Visible>false</Visible>
+      </Outline>
+      <Visible>true</Visible>
+      <HorizontalSpacing>5</HorizontalSpacing>
+      <VerticalSpacing>5</VerticalSpacing>
+      <ClientArea>
+        <Outline>
+          <Style>Solid</Style>
+          <Thickness>0</Thickness>
+          <Color>
+            <Transparency>255</Transparency>
+            <Red>0</Red>
+            <Green>0</Green>
+            <Blue>0</Blue>
+          </Color>
+          <Visible>false</Visible>
+        </Outline>
+        <Insets>
+          <Top>0.0</Top>
+          <Left>0.0</Left>
+          <Bottom>0.0</Bottom>
+          <Right>0.0</Right>
+        </Insets>
+      </ClientArea>
+    </Children>
+    <Children xsi:type="layout:Legend">
+      <Bounds>
+        <Left>0.0</Left>
+        <Top>0.0</Top>
+        <Width>0.0</Width>
+        <Height>0.0</Height>
+      </Bounds>
+      <Insets>
+        <Top>3.0</Top>
+        <Left>3.0</Left>
+        <Bottom>3.0</Bottom>
+        <Right>3.0</Right>
+      </Insets>
+      <Row>-1</Row>
+      <Column>-1</Column>
+      <Rowspan>-1</Rowspan>
+      <Columnspan>-1</Columnspan>
+      <Outline>
+        <Style>Solid</Style>
+        <Thickness>1</Thickness>
+        <Color>
+          <Transparency>255</Transparency>
+          <Red>0</Red>
+          <Green>0</Green>
+          <Blue>0</Blue>
+        </Color>
+        <Visible>false</Visible>
+      </Outline>
+      <Visible>true</Visible>
+      <ClientArea>
+        <Outline>
+          <Style>Solid</Style>
+          <Thickness>0</Thickness>
+          <Color>
+            <Transparency>255</Transparency>
+            <Red>0</Red>
+            <Green>0</Green>
+            <Blue>0</Blue>
+          </Color>
+          <Visible>false</Visible>
+        </Outline>
+        <Insets>
+          <Top>2.0</Top>
+          <Left>2.0</Left>
+          <Bottom>2.0</Bottom>
+          <Right>2.0</Right>
+        </Insets>
+      </ClientArea>
+      <Text>
+        <Value></Value>
+        <Font>
+          <Alignment/>
+        </Font>
+      </Text>
+      <Orientation>Vertical</Orientation>
+      <Direction>Top_Bottom</Direction>
+      <Separator>
+        <Style>Solid</Style>
+        <Thickness>1</Thickness>
+        <Color>
+          <Transparency>255</Transparency>
+          <Red>0</Red>
+          <Green>0</Green>
+          <Blue>0</Blue>
+        </Color>
+        <Visible>true</Visible>
+      </Separator>
+      <Position>Right</Position>
+      <ItemType>Categories</ItemType>
+      <Title>
+        <Caption>
+          <Value></Value>
+          <Font>
+            <Alignment/>
+          </Font>
+        </Caption>
+        <Background xsi:type="attribute:ColorDefinition">
+          <Transparency>0</Transparency>
+          <Red>255</Red>
+          <Green>255</Green>
+          <Blue>255</Blue>
+        </Background>
+        <Outline>
+          <Style>Solid</Style>
+          <Thickness>1</Thickness>
+          <Color>
+            <Transparency>255</Transparency>
+            <Red>0</Red>
+            <Green>0</Green>
+            <Blue>0</Blue>
+          </Color>
+          <Visible>false</Visible>
+        </Outline>
+        <Insets>
+          <Top>0.0</Top>
+          <Left>2.0</Left>
+          <Bottom>0.0</Bottom>
+          <Right>3.0</Right>
+        </Insets>
+        <Visible>false</Visible>
+      </Title>
+      <TitlePosition>Above</TitlePosition>
+    </Children>
+    <Bounds>
+      <Left>0.0</Left>
+      <Top>0.0</Top>
+      <Width>212.0</Width>
+      <Height>130.0</Height>
+    </Bounds>
+    <Insets>
+      <Top>3.0</Top>
+      <Left>3.0</Left>
+      <Bottom>3.0</Bottom>
+      <Right>3.0</Right>
+    </Insets>
+    <Row>-1</Row>
+    <Column>-1</Column>
+    <Rowspan>-1</Rowspan>
+    <Columnspan>-1</Columnspan>
+    <Outline>
+      <Style>Solid</Style>
+      <Thickness>1</Thickness>
+      <Color>
+        <Transparency>255</Transparency>
+        <Red>0</Red>
+        <Green>0</Green>
+        <Blue>0</Blue>
+      </Color>
+      <Visible>false</Visible>
+    </Outline>
+    <Visible>true</Visible>
+  </Block>
+  <Dimension>Two_Dimensional</Dimension>
+  <Units>Points</Units>
+  <SeriesThickness>10.0</SeriesThickness>
+  <GridColumnCount>0</GridColumnCount>
+  <ExtendedProperties>
+    <Name>enable.area.alt</Name>
+    <Value>false</Value>
+  </ExtendedProperties>
+  <SampleData>
+    <BaseSampleData>
+      <DataSetRepresentation>'A','B','C','D','E'</DataSetRepresentation>
+    </BaseSampleData>
+    <OrthogonalSampleData>
+      <DataSetRepresentation>6,4,12,8,10</DataSetRepresentation>
+      <SeriesDefinitionIndex>0</SeriesDefinitionIndex>
+    </OrthogonalSampleData>
+  </SampleData>
+  <Interactivity>
+    <Enable>true</Enable>
+    <LegendBehavior>None</LegendBehavior>
+  </Interactivity>
+  <EmptyMessage>
+    <Caption>
+      <Value>This chart contains no data.</Value>
+      <Font>
+        <Alignment>
+          <horizontalAlignment>Center</horizontalAlignment>
+          <verticalAlignment>Center</verticalAlignment>
+        </Alignment>
+      </Font>
+    </Caption>
+    <Background xsi:type="attribute:ColorDefinition">
+      <Transparency>64</Transparency>
+      <Red>127</Red>
+      <Green>127</Green>
+      <Blue>127</Blue>
+    </Background>
+    <Outline>
+      <Color>
+        <Transparency>128</Transparency>
+        <Red>127</Red>
+        <Green>127</Green>
+        <Blue>127</Blue>
+      </Color>
+      <Visible>true</Visible>
+    </Outline>
+    <Insets>
+      <Top>10.0</Top>
+      <Left>10.0</Left>
+      <Bottom>10.0</Bottom>
+      <Right>10.0</Right>
+    </Insets>
+    <Visible>false</Visible>
+  </EmptyMessage>
+  <SeriesDefinitions>
+    <Query>
+      <Definition></Definition>
+    </Query>
+    <SeriesPalette>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>80</Red>
+        <Green>166</Green>
+        <Blue>218</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>242</Red>
+        <Green>88</Green>
+        <Blue>106</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>232</Red>
+        <Green>172</Green>
+        <Blue>57</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>128</Red>
+        <Green>255</Green>
+        <Blue>128</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>64</Red>
+        <Green>128</Green>
+        <Blue>128</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>128</Red>
+        <Green>128</Green>
+        <Blue>192</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>170</Red>
+        <Green>85</Green>
+        <Blue>85</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>128</Red>
+        <Green>128</Green>
+        <Blue>0</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>192</Red>
+        <Green>192</Green>
+        <Blue>192</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>255</Red>
+        <Green>255</Green>
+        <Blue>128</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>128</Red>
+        <Green>192</Green>
+        <Blue>128</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>7</Red>
+        <Green>146</Green>
+        <Blue>94</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>0</Red>
+        <Green>128</Green>
+        <Blue>255</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>255</Red>
+        <Green>128</Green>
+        <Blue>192</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>0</Red>
+        <Green>255</Green>
+        <Blue>255</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>255</Red>
+        <Green>128</Green>
+        <Blue>128</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>0</Red>
+        <Green>128</Green>
+        <Blue>192</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>128</Red>
+        <Green>128</Green>
+        <Blue>192</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>255</Red>
+        <Green>0</Green>
+        <Blue>255</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>128</Red>
+        <Green>64</Green>
+        <Blue>64</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>255</Red>
+        <Green>128</Green>
+        <Blue>64</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>80</Red>
+        <Green>240</Green>
+        <Blue>120</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>0</Red>
+        <Green>64</Green>
+        <Blue>128</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>128</Red>
+        <Green>0</Green>
+        <Blue>64</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>255</Red>
+        <Green>0</Green>
+        <Blue>128</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>128</Red>
+        <Green>128</Green>
+        <Blue>64</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>128</Red>
+        <Green>128</Green>
+        <Blue>128</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>255</Red>
+        <Green>128</Green>
+        <Blue>255</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>0</Red>
+        <Green>64</Green>
+        <Blue>0</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>0</Red>
+        <Green>0</Green>
+        <Blue>0</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>255</Red>
+        <Green>255</Green>
+        <Blue>255</Blue>
+      </Entries>
+      <Entries xsi:type="attribute:ColorDefinition">
+        <Transparency>255</Transparency>
+        <Red>255</Red>
+        <Green>128</Green>
+        <Blue>0</Blue>
+      </Entries>
+    </SeriesPalette>
+    <SeriesDefinitions>
+      <Query>
+        <Definition></Definition>
+      </Query>
+      <SeriesPalette>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>80</Red>
+          <Green>166</Green>
+          <Blue>218</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>242</Red>
+          <Green>88</Green>
+          <Blue>106</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>232</Red>
+          <Green>172</Green>
+          <Blue>57</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>128</Red>
+          <Green>255</Green>
+          <Blue>128</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>64</Red>
+          <Green>128</Green>
+          <Blue>128</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>128</Red>
+          <Green>128</Green>
+          <Blue>192</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>170</Red>
+          <Green>85</Green>
+          <Blue>85</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>128</Red>
+          <Green>128</Green>
+          <Blue>0</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>192</Red>
+          <Green>192</Green>
+          <Blue>192</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>255</Red>
+          <Green>255</Green>
+          <Blue>128</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>128</Red>
+          <Green>192</Green>
+          <Blue>128</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>7</Red>
+          <Green>146</Green>
+          <Blue>94</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>0</Red>
+          <Green>128</Green>
+          <Blue>255</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>255</Red>
+          <Green>128</Green>
+          <Blue>192</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>0</Red>
+          <Green>255</Green>
+          <Blue>255</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>255</Red>
+          <Green>128</Green>
+          <Blue>128</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>0</Red>
+          <Green>128</Green>
+          <Blue>192</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>128</Red>
+          <Green>128</Green>
+          <Blue>192</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>255</Red>
+          <Green>0</Green>
+          <Blue>255</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>128</Red>
+          <Green>64</Green>
+          <Blue>64</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>255</Red>
+          <Green>128</Green>
+          <Blue>64</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>80</Red>
+          <Green>240</Green>
+          <Blue>120</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>0</Red>
+          <Green>64</Green>
+          <Blue>128</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>128</Red>
+          <Green>0</Green>
+          <Blue>64</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>255</Red>
+          <Green>0</Green>
+          <Blue>128</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>128</Red>
+          <Green>128</Green>
+          <Blue>64</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>128</Red>
+          <Green>128</Green>
+          <Blue>128</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>255</Red>
+          <Green>128</Green>
+          <Blue>255</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>0</Red>
+          <Green>64</Green>
+          <Blue>0</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>0</Red>
+          <Green>0</Green>
+          <Blue>0</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>255</Red>
+          <Green>255</Green>
+          <Blue>255</Blue>
+        </Entries>
+        <Entries xsi:type="attribute:ColorDefinition">
+          <Transparency>255</Transparency>
+          <Red>255</Red>
+          <Green>128</Green>
+          <Blue>0</Blue>
+        </Entries>
+      </SeriesPalette>
+      <Series xsi:type="type:PieSeries">
+        <Visible>true</Visible>
+        <Label>
+          <Caption>
+            <Value></Value>
+            <Font>
+              <Alignment/>
+            </Font>
+          </Caption>
+          <Background xsi:type="attribute:ColorDefinition">
+            <Transparency>0</Transparency>
+            <Red>255</Red>
+            <Green>255</Green>
+            <Blue>255</Blue>
+          </Background>
+          <Outline>
+            <Style>Solid</Style>
+            <Thickness>1</Thickness>
+            <Color>
+              <Transparency>255</Transparency>
+              <Red>0</Red>
+              <Green>0</Green>
+              <Blue>0</Blue>
+            </Color>
+            <Visible>false</Visible>
+          </Outline>
+          <Insets>
+            <Top>0.0</Top>
+            <Left>2.0</Left>
+            <Bottom>0.0</Bottom>
+            <Right>3.0</Right>
+          </Insets>
+          <Visible>true</Visible>
+        </Label>
+        <DataDefinition>
+          <Definition>row[&quot;total&quot;]</Definition>
+          <Grouping>
+            <GroupType>Text</GroupType>
+            <AggregateExpression>Sum</AggregateExpression>
+          </Grouping>
+        </DataDefinition>
+        <SeriesIdentifier></SeriesIdentifier>
+        <DataPoint>
+          <Components>
+            <Type>Orthogonal_Value</Type>
+          </Components>
+          <Separator>, </Separator>
+        </DataPoint>
+        <LabelPosition>Outside</LabelPosition>
+        <Stacked>false</Stacked>
+        <Explosion>0</Explosion>
+        <Title>
+          <Caption>
+            <Value></Value>
+            <Font>
+              <Size>16.0</Size>
+              <Bold>true</Bold>
+              <Alignment/>
+            </Font>
+          </Caption>
+          <Background xsi:type="attribute:ColorDefinition">
+            <Transparency>0</Transparency>
+            <Red>255</Red>
+            <Green>255</Green>
+            <Blue>255</Blue>
+          </Background>
+          <Outline>
+            <Style>Solid</Style>
+            <Thickness>1</Thickness>
+            <Color>
+              <Transparency>255</Transparency>
+              <Red>0</Red>
+              <Green>0</Green>
+              <Blue>0</Blue>
+            </Color>
+          </Outline>
+          <Insets>
+            <Top>0.0</Top>
+            <Left>2.0</Left>
+            <Bottom>0.0</Bottom>
+            <Right>3.0</Right>
+          </Insets>
+          <Visible>true</Visible>
+        </Title>
+        <TitlePosition>Below</TitlePosition>
+        <LeaderLineAttributes>
+          <Style>Solid</Style>
+          <Thickness>1</Thickness>
+          <Visible>true</Visible>
+        </LeaderLineAttributes>
+        <LeaderLineStyle>Fixed_Length</LeaderLineStyle>
+        <LeaderLineLength>10.0</LeaderLineLength>
+      </Series>
+      <Grouping>
+        <GroupType>Text</GroupType>
+        <AggregateExpression>Sum</AggregateExpression>
+      </Grouping>
+    </SeriesDefinitions>
+    <Series>
+      <Visible>true</Visible>
+      <Label>
+        <Caption>
+          <Value></Value>
+          <Font>
+            <Alignment/>
+          </Font>
+        </Caption>
+        <Background xsi:type="attribute:ColorDefinition">
+          <Transparency>0</Transparency>
+          <Red>255</Red>
+          <Green>255</Green>
+          <Blue>255</Blue>
+        </Background>
+        <Outline>
+          <Style>Solid</Style>
+          <Thickness>1</Thickness>
+          <Color>
+            <Transparency>255</Transparency>
+            <Red>0</Red>
+            <Green>0</Green>
+            <Blue>0</Blue>
+          </Color>
+          <Visible>false</Visible>
+        </Outline>
+        <Insets>
+          <Top>0.0</Top>
+          <Left>2.0</Left>
+          <Bottom>0.0</Bottom>
+          <Right>3.0</Right>
+        </Insets>
+        <Visible>false</Visible>
+      </Label>
+      <DataDefinition>
+        <Definition>row[&quot;exampleTypeId&quot;]</Definition>
+      </DataDefinition>
+      <SeriesIdentifier></SeriesIdentifier>
+      <DataPoint>
+        <Components>
+          <Type>Orthogonal_Value</Type>
+        </Components>
+        <Separator>, </Separator>
+      </DataPoint>
+      <LabelPosition>Outside</LabelPosition>
+      <Stacked>false</Stacked>
+    </Series>
+    <Grouping>
+      <Enabled>true</Enabled>
+      <GroupType>Text</GroupType>
+      <AggregateExpression>Sum</AggregateExpression>
+    </Grouping>
+  </SeriesDefinitions>
+</model:ChartWithoutAxes>
+]]></xml-property>
+            <property name="outputFormat">SVG</property>
+            <property name="inheritColumns">true</property>
+            <property name="dataSet">Example</property>
+            <property name="height">130pt</property>
+            <property name="width">212pt</property>
+            <list-property name="boundDataColumns">
+                <structure>
+                    <property name="name">exampleTypeId</property>
+                    <expression name="expression" type="javascript">dataSetRow["exampleTypeId"]</expression>
+                    <property name="dataType">string</property>
+                </structure>
+                <structure>
+                    <property name="name">total</property>
+                    <expression name="expression" type="javascript">dataSetRow["total"]</expression>
+                    <property name="dataType">string</property>
+                </structure>
+            </list-property>
+        </extended-item>
+    </body>
+</report>
diff --git a/framework/example/webapp/birt/report/example.rptdesign b/framework/example/webapp/birt/report/example.rptdesign
new file mode 100644
index 0000000..418b992
--- /dev/null
+++ b/framework/example/webapp/birt/report/example.rptdesign
@@ -0,0 +1,230 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+<report xmlns="http://www.eclipse.org/birt/2005/design" version="3.2.21" id="1">
+    <property name="createdBy">Eclipse BIRT Designer Version 2.6.0.v20100531 Build &lt;2.6.0.v20100609-1613></property>
+    <property name="units">in</property>
+    <method name="initialize"><![CDATA[importPackage(Packages.org.ofbiz.base.util)
+
+module = "example.rptdesign";]]></method>
+    <property name="iconFile">/templates/blank_report.gif</property>
+    <property name="bidiLayoutOrientation">ltr</property>
+    <data-sources>
+        <script-data-source name="OFBiz" id="8"/>
+    </data-sources>
+    <data-sets>
+        <script-data-set name="Example" id="9">
+            <list-property name="resultSetHints">
+                <structure>
+                    <property name="position">0</property>
+                    <property name="name">exampleId</property>
+                    <property name="dataType">string</property>
+                </structure>
+                <structure>
+                    <property name="position">1</property>
+                    <property name="name">exampleTypeId</property>
+                    <property name="dataType">string</property>
+                </structure>
+                <structure>
+                    <property name="position">2</property>
+                    <property name="name">exampleName</property>
+                    <property name="dataType">string</property>
+                </structure>
+            </list-property>
+            <list-property name="columnHints">
+                <structure>
+                    <property name="columnName">exampleId</property>
+                    <text-property name="displayName">exampleId</text-property>
+                </structure>
+                <structure>
+                    <property name="columnName">exampleTypeId</property>
+                    <text-property name="displayName">exampleTypeId</text-property>
+                </structure>
+                <structure>
+                    <property name="columnName">exampleName</property>
+                    <text-property name="displayName">exampleName</text-property>
+                </structure>
+            </list-property>
+            <structure name="cachedMetaData">
+                <list-property name="resultSet">
+                    <structure>
+                        <property name="position">1</property>
+                        <property name="name">exampleId</property>
+                        <property name="dataType">string</property>
+                    </structure>
+                    <structure>
+                        <property name="position">2</property>
+                        <property name="name">exampleTypeId</property>
+                        <property name="dataType">string</property>
+                    </structure>
+                    <structure>
+                        <property name="position">3</property>
+                        <property name="name">exampleName</property>
+                        <property name="dataType">string</property>
+                    </structure>
+                </list-property>
+            </structure>
+            <property name="dataSource">OFBiz</property>
+            <method name="open"><![CDATA[examples = null;
+try {
+    examples = delegator.findList("Example", null, null, null, null, false);
+} catch (e) {
+    Debug.logError(e, module);
+}
+totalRow = 0;
+countOfRow = 0;
+if (examples) {
+    totalRow = examples.size();
+}]]></method>
+            <method name="fetch"><![CDATA[if (countOfRow == totalRow - 1) return false;
+
+example = examples.get(countOfRow);
+exampleId = example.getString("exampleId");
+exampleTypeId = example.getString("exampleTypeId");
+exampleName = example.getString("exampleName");
+
+row["exampleId"] = exampleId;
+row["exampleTypeId"] = exampleTypeId;
+row["exampleName"] = exampleName;
+
+countOfRow ++;
+return true;]]></method>
+        </script-data-set>
+    </data-sets>
+    <styles>
+        <style name="report" id="4">
+            <property name="fontFamily">sans-serif</property>
+            <property name="fontSize">10pt</property>
+        </style>
+        <style name="crosstab-cell" id="5">
+            <property name="borderBottomColor">#CCCCCC</property>
+            <property name="borderBottomStyle">solid</property>
+            <property name="borderBottomWidth">1pt</property>
+            <property name="borderLeftColor">#CCCCCC</property>
+            <property name="borderLeftStyle">solid</property>
+            <property name="borderLeftWidth">1pt</property>
+            <property name="borderRightColor">#CCCCCC</property>
+            <property name="borderRightStyle">solid</property>
+            <property name="borderRightWidth">1pt</property>
+            <property name="borderTopColor">#CCCCCC</property>
+            <property name="borderTopStyle">solid</property>
+            <property name="borderTopWidth">1pt</property>
+        </style>
+        <style name="crosstab" id="6">
+            <property name="borderBottomColor">#CCCCCC</property>
+            <property name="borderBottomStyle">solid</property>
+            <property name="borderBottomWidth">1pt</property>
+            <property name="borderLeftColor">#CCCCCC</property>
+            <property name="borderLeftStyle">solid</property>
+            <property name="borderLeftWidth">1pt</property>
+            <property name="borderRightColor">#CCCCCC</property>
+            <property name="borderRightStyle">solid</property>
+            <property name="borderRightWidth">1pt</property>
+            <property name="borderTopColor">#CCCCCC</property>
+            <property name="borderTopStyle">solid</property>
+            <property name="borderTopWidth">1pt</property>
+        </style>
+    </styles>
+    <page-setup>
+        <simple-master-page name="Simple MasterPage" id="2">
+            <page-footer>
+                <text id="3">
+                    <property name="contentType">html</property>
+                    <text-property name="content"><![CDATA[<value-of>new Date()</value-of>]]></text-property>
+                </text>
+            </page-footer>
+        </simple-master-page>
+    </page-setup>
+    <body>
+        <table id="10">
+            <property name="dataSet">Example</property>
+            <list-property name="boundDataColumns">
+                <structure>
+                    <property name="name">exampleId</property>
+                    <text-property name="displayName">exampleId</text-property>
+                    <expression name="expression" type="javascript">dataSetRow["exampleId"]</expression>
+                    <property name="dataType">string</property>
+                </structure>
+                <structure>
+                    <property name="name">exampleTypeId</property>
+                    <text-property name="displayName">exampleTypeId</text-property>
+                    <expression name="expression" type="javascript">dataSetRow["exampleTypeId"]</expression>
+                    <property name="dataType">string</property>
+                </structure>
+                <structure>
+                    <property name="name">exampleName</property>
+                    <text-property name="displayName">exampleName</text-property>
+                    <expression name="expression">dataSetRow["exampleName"]</expression>
+                    <property name="dataType">string</property>
+                </structure>
+            </list-property>
+            <column id="29"/>
+            <column id="30"/>
+            <column id="31"/>
+            <header>
+                <row id="11">
+                    <property name="backgroundColor">#BFBFBF</property>
+                    <property name="fontWeight">bold</property>
+                    <property name="textAlign">center</property>
+                    <cell id="12">
+                        <label id="13">
+                            <text-property name="text">exampleId</text-property>
+                        </label>
+                    </cell>
+                    <cell id="14">
+                        <label id="15">
+                            <text-property name="text">exampleTypeId</text-property>
+                        </label>
+                    </cell>
+                    <cell id="16">
+                        <label id="17">
+                            <text-property name="text">exampleName</text-property>
+                        </label>
+                    </cell>
+                </row>
+            </header>
+            <detail>
+                <row id="18">
+                    <cell id="19">
+                        <data id="20">
+                            <property name="resultSetColumn">exampleId</property>
+                        </data>
+                    </cell>
+                    <cell id="21">
+                        <data id="22">
+                            <property name="resultSetColumn">exampleTypeId</property>
+                        </data>
+                    </cell>
+                    <cell id="23">
+                        <data id="24">
+                            <property name="resultSetColumn">exampleName</property>
+                        </data>
+                    </cell>
+                </row>
+            </detail>
+            <footer>
+                <row id="25">
+                    <cell id="26"/>
+                    <cell id="27"/>
+                    <cell id="28"/>
+                </row>
+            </footer>
+        </table>
+    </body>
+</report>
diff --git a/framework/example/webapp/example/WEB-INF/actions/includes/FindExampleFeatures.groovy b/framework/example/webapp/example/WEB-INF/actions/includes/FindExampleFeatures.groovy
new file mode 100644
index 0000000..b324e27
--- /dev/null
+++ b/framework/example/webapp/example/WEB-INF/actions/includes/FindExampleFeatures.groovy
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+import java.util.TreeSet;
+import org.ofbiz.entity.condition.EntityCondition;
+import org.ofbiz.entity.condition.EntityConditionList;
+import org.ofbiz.entity.condition.EntityExpr;
+import org.ofbiz.entity.condition.EntityFieldValue;
+import org.ofbiz.entity.condition.EntityFunction;
+import org.ofbiz.entity.condition.EntityOperator;
+
+delegator = request.getAttribute("delegator");
+
+andExprs = [];
+fieldValue = request.getParameter("exampleFeatureId");
+if (fieldValue) {
+    andExprs.add(EntityCondition.makeCondition(EntityFunction.UPPER(EntityFieldValue.makeFieldValue("exampleFeatureId")),
+            EntityOperator.LIKE, "%" + fieldValue.toUpperCase() + "%"));
+}
+
+autocompleteOptions = [];
+if (andExprs) {
+    entityConditionList = EntityCondition.makeCondition(andExprs, EntityOperator.AND);
+    autocompleteOptions = delegator.findList("ExampleFeature", entityConditionList, ['exampleFeatureId', 'description'] as Set, ['-exampleFeatureId'], null, false);
+    //context.autocompleteOptions = autocompleteOptions;
+    request.setAttribute("autocompleteOptions", autocompleteOptions);
+}
+return "success";
diff --git a/framework/example/webapp/example/WEB-INF/actions/includes/PrepareLocalesForDropDown.groovy b/framework/example/webapp/example/WEB-INF/actions/includes/PrepareLocalesForDropDown.groovy
new file mode 100644
index 0000000..b7d9d80
--- /dev/null
+++ b/framework/example/webapp/example/WEB-INF/actions/includes/PrepareLocalesForDropDown.groovy
@@ -0,0 +1,22 @@
+/*

+Licensed to the Apache Software Foundation (ASF) under one

+or more contributor license agreements.  See the NOTICE file

+distributed with this work for additional information

+regarding copyright ownership.  The ASF licenses this file

+to you 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.

+*/

+

+def localeMap = []

+org.ofbiz.base.util.UtilMisc.availableLocales().each { localeMap.add(localeId:it.toString()) };

+parameters.localeList = localeMap;
\ No newline at end of file
diff --git a/framework/example/webapp/example/WEB-INF/birt.tld b/framework/example/webapp/example/WEB-INF/birt.tld
new file mode 100644
index 0000000..f00d7e8
--- /dev/null
+++ b/framework/example/webapp/example/WEB-INF/birt.tld
@@ -0,0 +1,1175 @@
+<?xml version='1.0' encoding='ISO-8859-1' ?>

+<!DOCTYPE taglib

+    PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"

+    "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

+<!--

+Licensed to the Apache Software Foundation (ASF) under one

+or more contributor license agreements.  See the NOTICE file

+distributed with this work for additional information

+regarding copyright ownership.  The ASF licenses this file

+to you 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.

+-->

+<taglib>

+    <tlib-version>1.0</tlib-version>

+    <jsp-version>1.2</jsp-version>

+    <short-name>BIRT Tag Library</short-name>

+    <uri>http://www.eclipse.org/birt/taglibs/birt.tld</uri>

+    <description>

+        This Tag Library makes user develope JSP with BIRT Viewer component easily.

+    </description>

+    

+    <!--**********************************************-->

+    <!--             Viewer Tag                       -->

+    <!--**********************************************-->

+    <tag>

+        <name>viewer</name>

+        <tag-class>org.eclipse.birt.report.taglib.ViewerTag</tag-class>

+        <body-content>JSP</body-content>

+        <description>

+            The viewer tag is to specify how to import and control BIRT Report Viewer into JSP page.

+            This tag will use Ajax framework to retrieve report content.

+        </description>

+

+        <attribute>

+            <name>id</name>

+            <required>true</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the current viewer id. It should be unique.

+                It can contain number,letter or underline.

+            </description>            

+        </attribute>    

+

+        <attribute>

+            <name>pattern</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies which servlet pattern to be used to preview report.

+                Default value is frameset.

+                ( frameset or run )

+            </description>

+        </attribute>

+                        

+        <attribute>

+            <name>baseURL</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies base URL of BIRT viewer.

+                Default to the current context.

+            </description>

+        </attribute>

+        

+        <attribute>

+            <name>title</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report title displayed at the top.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>isHostPage</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether the viewer occupies the whole page.

+                Default to false.

+            </description>

+        </attribute>

+

+       <attribute>

+            <name>scrolling </name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the IFrame style "scrolling ".

+                If isHostPage is true, ignore this attribute.

+                ( auto | yes | no )

+            </description>

+        </attribute>

+

+       <attribute>

+            <name>position</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the style "position" of report container.

+                If isHostPage is true, ignore this attribute.

+                ( static | absolute | fixed | relative )

+            </description>

+        </attribute>

+

+       <attribute>

+            <name>style</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the style of report container.

+                If isHostPage is true, ignore this attribute.

+            </description>

+        </attribute>

+                        

+        <attribute>

+            <name>height</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the height of report container in pixels.

+                If isHostPage is true, ignore this attribute.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>width</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the width of report container in pixels.

+                If isHostPage is true, ignore this attribute.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>top</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the top of report container in pixels.

+                If isHostPage is true, ignore this attribute.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>left</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                 Sets the left of report container in pixels.

+                 If isHostPage is true, ignore this attribute.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>frameborder</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                 Specifies whether displays the iframe border.

+                Default to no. 

+                If isHostPage is true, ignore this attribute.

+                ( Yes | No )

+            </description>

+        </attribute>

+                        

+        <attribute>

+            <name>reportDesign</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report design file name.

+                ( Absolute path, relative path or URL )

+            </description>    

+        </attribute>        

+

+        <attribute>

+            <name>reportDocument</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report document file name. 

+                Noted: only support "file:" URL format.

+                ( Absolute path, relative path or URL ) 

+            </description>    

+        </attribute>        

+

+        <attribute>

+            <name>reportletId</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the instance id of reportlet.

+                The "reportDocument" attribute should be required.

+                Noted: frameset pattern doesn't support reportlet.

+            </description>    

+        </attribute>

+                

+        <attribute>

+            <name>bookmark</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the targeted bookmark name.

+            </description>            

+        </attribute>

+        

+        <attribute>

+            <name>locale</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the Locale information.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>timeZone</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies a time zone id. For example: "America/Los_Angeles" or "GMT+1" or "GMT+01:00".

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>svg</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether supports the SVG output format or not.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>format</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the output format of report.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>emitterId</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the emitter id for the report output.

+            </description>            

+        </attribute>

+        

+        <attribute>

+            <name>pageOverflow</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the page overflow setting for the PDF format.

+                One of the following values:

+                0 for "auto", 1 for "actual size", 2 for "fit to page". 

+            </description>            

+        </attribute>

+        

+        <attribute>

+            <name>rtl</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether supports rtl page or not.

+            </description>            

+        </attribute>

+                

+        <attribute>

+            <name>pageNum</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies output page number when render document file.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>pageRange</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies page range when render document file.

+            </description>            

+        </attribute>

+                                

+        <attribute>

+            <name>resourceFolder</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the referenced resource folder.

+                Default value is defined in web.xml.

+            </description>            

+        </attribute>

+                                            

+        <attribute>

+            <name>forceOverwriteDocument</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether forces to overwrite the generated document.

+                If allowPageBreak is false,ignore this attribute.

+                Default value is defined in web.xml.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>showTitle</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether shows the report title.

+                Default to true.

+            </description>            

+        </attribute>

+        

+        <attribute>

+            <name>showToolBar</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether shows the toolbar.

+                Default to true.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>showNavigationBar</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether shows the Navigation Bar.

+                If allowPageBreak is false,ignore this attribute.

+                Default to true.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>showParameterPage</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether show the parameter dialog or not.

+                Default to true.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>isReportlet</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether render reportlet by bookmark.

+                Default to false.

+            </description>            

+        </attribute>

+        

+    </tag>

+

+     <!--**********************************************-->

+    <!--             Report Tag                       -->

+    <!--**********************************************-->

+    <tag>

+        <name>report</name>

+        <tag-class>org.eclipse.birt.report.taglib.ReportTag</tag-class>

+        <body-content>JSP</body-content>

+        <description>

+            The report tag can provide fast report preview without Ajax framework. 

+            The report content can be output to web browser directly.

+        </description>

+

+        <attribute>

+            <name>id</name>

+            <required>true</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the current viewer id. It should be unique.

+                It can contain number,letter or underline.

+            </description>            

+        </attribute>    

+                

+        <attribute>

+            <name>baseURL</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies base URL of BIRT viewer.

+                Default to the current context.

+                If report container is DIV, ignore this attribute.

+            </description>

+        </attribute>

+        

+        <attribute>

+            <name>isHostPage</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether the viewer occupies the whole page.

+                Default to false.

+            </description>

+        </attribute>

+

+       <attribute>

+            <name>scrolling </name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the DIV/IFrame style "scrolling ".

+                If isHostPage is true, ignore this attribute.

+                ( auto | yes | no )

+            </description>

+        </attribute>

+

+       <attribute>

+            <name>position</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the style "position" of report container.

+                If isHostPage is true, ignore this attribute.

+                ( static | absolute | fixed | relative )

+            </description>

+        </attribute>

+

+       <attribute>

+            <name>style</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the style of report container.

+                If isHostPage is true, ignore this attribute.

+            </description>

+        </attribute>

+                        

+        <attribute>

+            <name>height</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the height of report container in pixels.

+                If isHostPage is true, ignore this attribute.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>width</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the width of report container in pixels.

+                If isHostPage is true, ignore this attribute.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>top</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the top of report container in pixels.

+                If isHostPage is true, ignore this attribute.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>left</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                 Sets the left of report container in pixels.

+                 If isHostPage is true, ignore this attribute.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>frameborder</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                 Specifies whether displays the iframe border.

+                 Available when user IFrame.

+                Default to no.

+                ( Yes | No )

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>reportDesign</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report design file name.

+                ( Absolute path, relative path or URL )

+            </description>    

+        </attribute>        

+

+        <attribute>

+            <name>reportDocument</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report document file name. 

+                Noted: only support "file:" URL format.

+                ( Absolute path, relative path or URL ) 

+            </description>    

+        </attribute>

+

+        <attribute>

+            <name>reportletId</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the instance id of reportlet.

+                The "reportDocument" attribute should be required.

+            </description>    

+        </attribute>

+                            

+        <attribute>

+            <name>bookmark</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the targeted bookmark name.

+            </description>            

+        </attribute>

+        

+        <attribute>

+            <name>locale</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the Locale information.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>timeZone</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies a time zone id. For example: "America/Los_Angeles" or "GMT+1" or "GMT+01:00".

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>svg</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether supports the SVG output format or not.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>format</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the output format of report.

+            </description>            

+        </attribute>

+        

+        <attribute>

+            <name>emitterId</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the emitter id for the report output.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>pageOverflow</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the page overflow setting for the PDF format.

+                One of the following values:

+                0 for "auto", 1 for "actual size", 2 for "fit to page". 

+            </description>            

+        </attribute>

+        

+        <attribute>

+            <name>rtl</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether supports rtl page or not.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>showParameterPage</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether show the parameter dialog or not.

+                Default to true.

+                If report container is DIV, ignore this attribute.

+            </description>            

+        </attribute>

+                                                

+        <attribute>

+            <name>resourceFolder</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the referenced resource folder.

+                Default value is defined in web.xml.

+            </description>            

+        </attribute>            

+                                    

+        <attribute>

+            <name>reportContainer</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies iframe or div as report container.

+                Default to iframe.

+                ( iframe | div )

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>pageNum</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies output page number when render document file.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>pageRange</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies page range when render document file.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>isReportlet</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether render reportlet by bookmark.

+                Default to false.

+            </description>            

+        </attribute>

+                

+    </tag>    

+    

+    <!--**********************************************-->

+    <!--             Report Parameter Tag             -->

+    <!--**********************************************-->

+     <tag>

+        <name>param</name>

+        <tag-class>org.eclipse.birt.report.taglib.ParamTag</tag-class>

+        <body-content>JSP</body-content>

+        <description>

+            The param tag specifies the parameters defined in report design file.

+        </description>

+        <attribute>

+            <name>name</name>

+            <required>true</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report parameter name.

+            </description>

+        </attribute>

+        <attribute>

+            <name>pattern</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report parameter pattern format.

+            </description>

+        </attribute>     

+        <attribute>

+            <name>value</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report parameter value. If doesn't set, value is null.

+            </description>

+        </attribute>

+        <attribute>

+            <name>displayText</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report parameter display text.

+            </description>

+        </attribute>

+        <attribute>

+            <name>delim</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the delimiter for multiple values.

+                Defaults to pipe "|".

+            </description>

+        </attribute>

+        <attribute>

+            <name>isLocale</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether the report parameter value is a locale/format related string.

+            </description>

+        </attribute>

+     </tag>   

+

+    <!--**********************************************-->

+    <!--             Report Parameter Value Tag       -->

+    <!--**********************************************-->

+     <tag>

+        <name>value</name>

+        <tag-class>org.eclipse.birt.report.taglib.ParamValueTag</tag-class>        

+        <body-content>JSP</body-content>

+        <description>

+            The param value tag specifies multiple values for a given param tag.

+        </description>

+        <attribute>

+            <name>value</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report parameter value. If doesn't set, value is null.

+            </description>

+        </attribute>

+        <attribute>

+            <name>displayText</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report parameter display text.

+            </description>

+        </attribute>

+     </tag>   

+     

+    <!--**********************************************-->

+    <!--             ParameterPage Tag                -->

+    <!--**********************************************-->

+    <tag>

+        <name>parameterPage</name>

+        <tag-class>org.eclipse.birt.report.taglib.RequesterTag</tag-class>

+        <body-content>JSP</body-content>

+        <description>

+            The parameterPage tag can help developers to display BIRT parameter page or create a user-defined parameter page.

+            This tag can collect these parameters and submit to BIRT servlet to handle request.

+        </description>

+        

+        <attribute>

+            <name>id</name>

+            <required>true</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the parameter page id.It should be unique.

+                It can contain number,letter or underline.                

+            </description>            

+        </attribute>    

+        

+        <attribute>

+            <name>name</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the parameter page name. 

+                If attribute 'isCustom' is true, this name should be required and unique.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>isCustom</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether uses the user-defined parameter page.

+                If false, use the BIRT parameter dialog.

+                Default to false.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>title</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report title displayed at the top.

+            </description>

+        </attribute>

+                        

+          <attribute>

+            <name>baseURL</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies base URL of BIRT viewer. 

+                Default to the current context.

+            </description>

+        </attribute>

+        

+        <attribute>

+            <name>scrolling </name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the DIV/IFrame style "scrolling ".

+                ( auto | yes | no )

+            </description>

+        </attribute>

+        

+       <attribute>

+            <name>position</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the style "position" of parameter page.

+                ( static | absolute | fixed | relative )

+            </description>

+        </attribute>

+

+       <attribute>

+            <name>style</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the style of parameter page.

+            </description>

+        </attribute>

+                        

+        <attribute>

+            <name>height</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the height of parameter page in pixels.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>width</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the width of parameter page in pixels.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>top</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Sets the top of parameter page in pixels.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>left</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                 Sets the left of parameter page in pixels.

+            </description>

+        </attribute>

+

+        <attribute>

+            <name>frameborder</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                 Specifies whether displays the iframe border.

+                Default to no.

+                If set "isCustom" to true, ignore this attribute.

+                ( Yes | No )

+            </description>

+        </attribute>

+                        

+        <attribute>

+            <name>reportDesign</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report design file name.

+                ( Absolute path, relative path or URL )

+            </description>    

+        </attribute>        

+

+        <attribute>

+            <name>reportDocument</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report document file name. 

+                Noted: only support "file:" URL format.

+                ( Absolute path, relative path or URL ) 

+            </description>    

+        </attribute>        

+

+        <attribute>

+            <name>reportletId</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the instance id of reportlet.

+                The "reportDocument" attribute should be required.

+                Noted: frameset pattern doesn't support reportlet.

+            </description>    

+        </attribute>

+

+        <attribute>

+            <name>pattern</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the servlet pattern for request submit. 

+                BIRT supports three patterns: frameset, run and preview. 

+                Can refer to the user-defined servlet pattern.

+                Default to frameset.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>target</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the target window for request submit.

+            </description>            

+        </attribute>

+                        

+        <attribute>

+            <name>bookmark</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the targeted bookmark name.

+            </description>            

+        </attribute>

+        

+        <attribute>

+            <name>locale</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the Locale information.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>timeZone</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies a time zone id. For example: "America/Los_Angeles" or "GMT+1" or "GMT+01:00".

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>svg</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether supports the SVG output format or not.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>format</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the output format of report.

+            </description>            

+        </attribute>

+        

+        <attribute>

+            <name>emitterId</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the emitter id for the report output.

+            </description>            

+        </attribute>

+        

+        <attribute>

+            <name>pageOverflow</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the page overflow setting for the PDF format.

+                One of the following values:

+                0 for "auto", 1 for "actual size", 2 for "fit to page". 

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>rtl</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether supports rtl page or not.

+            </description>            

+        </attribute>

+                            

+        <attribute>

+            <name>resourceFolder</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the referenced resource folder.

+                Default value is defined in web.xml.

+            </description>            

+        </attribute>            

+                                

+        <attribute>

+            <name>forceOverwriteDocument</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether forces to overwrite the generated document.

+                If allowPageBreak is false,ignore this attribute.

+                Default value is defined in web.xml.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>showTitle</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether shows the report title.

+                Default to true.

+            </description>            

+        </attribute>

+        

+        <attribute>

+            <name>showToolBar</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether shows the toolbar.

+                Default to true.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>showNavigationBar</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether shows the Navigation Bar.

+                If allowPageBreak is false,ignore this attribute.

+                Default to true.

+            </description>            

+        </attribute>

+

+        <attribute>

+            <name>isReportlet</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether render reportlet by bookmark.

+                Default to false.

+            </description>            

+        </attribute>

+                        

+    </tag>

+

+    <!--**********************************************-->

+    <!--      Report Parameter Definition Tag         -->

+    <!--**********************************************-->

+     <tag>

+        <name>paramDef</name>

+        <tag-class>org.eclipse.birt.report.taglib.ParamDefTag</tag-class>

+        <body-content>JSP</body-content>

+        <description>

+            The param tag is used to generate html code for defined parameter in ParameterPage tag.

+        </description>

+        <attribute>

+            <name>id</name>

+            <required>true</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the id of parameter control.It should be unique.

+                It can contain number,letter or underline.

+            </description>

+        </attribute>

+        <attribute>

+            <name>name</name>

+            <required>true</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report parameter name.

+            </description>

+        </attribute>

+        <attribute>

+            <name>pattern</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report parameter pattern format.

+                It is used to parse defined parameter value string.

+            </description>

+        </attribute>     

+        <attribute>

+            <name>value</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report parameter value. If doesn't set, use default value.

+            </description>

+        </attribute>

+        <attribute>

+            <name>displayText</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the report parameter display text.

+            </description>

+        </attribute>

+        <attribute>

+            <name>isLocale</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies whether the report parameter value is a locale/format related string.

+                It is used to parse defined parameter value string.

+            </description>

+        </attribute>

+        <attribute>

+            <name>title</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the title attribute of parameter control.

+            </description>

+        </attribute>        

+        <attribute>

+            <name>cssClass</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the css class attribute of parameter control.

+            </description>

+        </attribute>

+        <attribute>

+            <name>style</name>

+            <required>false</required>

+            <rtexprvalue>true</rtexprvalue>

+            <description>

+                Specifies the parameter control style.

+            </description>

+        </attribute>        

+     </tag>                

+</taglib>
\ No newline at end of file
diff --git a/framework/example/webapp/example/WEB-INF/controller.xml b/framework/example/webapp/example/WEB-INF/controller.xml
new file mode 100644
index 0000000..4a481fe
--- /dev/null
+++ b/framework/example/webapp/example/WEB-INF/controller.xml
@@ -0,0 +1,394 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<site-conf xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/site-conf.xsd">
+    <!-- The controller elements that are common to all OFBiz components
+         can be found in the following xml file. A component can override the
+         elements found in the common-controller.xml file. -->
+    <include location="component://common/webcommon/WEB-INF/common-controller.xml"/>
+    <include location="component://common/webcommon/WEB-INF/portal-controller.xml"/>
+    <include location="component://example/webapp/birt/WEB-INF/controller.xml"/>
+
+    <description>Example Component Site Configuration File</description>
+
+    <!--
+      These can be used to return the reports as views; make sure the classes are compiled and available
+        <handler name="datavision" type="view" class="org.ofbiz.webapp.view.DataVisionViewHandler"/>
+        <handler name="jasperreportspdf" type="view" class="org.ofbiz.webapp.view.JasperReportsPdfViewHandler"/>
+        <handler name="jasperreportsxml" type="view" class="org.ofbiz.webapp.view.JasperReportsXmlViewHandler"/>
+    -->
+
+    <!-- Events to run on every request before security (chains exempt) -->
+    <!--
+    <preprocessor>
+    </preprocessor>
+    -->
+    <!-- Events to run on every request after all other processing (chains exempt) -->
+    <!--
+    <postprocessor>
+        <event name="test" type="java" path="org.ofbiz.webapp.event.TestEvent" invoke="test"/>
+    </postprocessor>
+    -->
+
+    <!-- Request Mappings -->
+    <request-map uri="main"><security https="true" auth="true"/><response name="success" type="view" value="main"/></request-map>
+
+    <!-- Example Requests -->
+    <request-map uri="FindExample"><security https="true" auth="true"/><response name="success" type="view" value="FindExample"/></request-map>
+    <request-map uri="EditExample"><security https="true" auth="true"/><response name="success" type="view" value="EditExample"/></request-map>
+    <request-map uri="EditExampleLayer"><security https="true" auth="true"/><response name="success" type="view" value="EditExampleLayer"/></request-map>
+    <request-map uri="ExampleReportHtml"><security https="true" auth="true"/><response name="success" type="view" value="ExampleReportHtml"/></request-map>
+    <request-map uri="ExampleReportPdf"><security https="true" auth="true"/><response name="success" type="view" value="ExampleReportPdf"/></request-map>
+    <request-map uri="createExample">
+        <security https="true" auth="true"/>
+        <event type="service" invoke="createExample"/>
+        <response name="success" type="request-redirect" value="FindExample">
+            <redirect-parameter name="exampleId"/>
+        </response>
+        <response name="error" type="view" value="FindExample"/>
+    </request-map>
+    <request-map uri="updateExample">
+        <security https="true" auth="true"/>
+        <event type="service" invoke="updateExample"/>
+        <response name="success" type="request-redirect" value="EditExample">
+            <redirect-parameter name="exampleId"/>
+        </response>
+        <response name="error" type="view" value="EditExample"/>
+    </request-map>
+    <request-map uri="createExampleAjax">
+        <security https="true" auth="true"/>
+        <event type="service" invoke="createExample"/>
+        <response name="success" type="request" value="json"/>
+        <response name="error" type="request" value="json"/>
+    </request-map>
+    <request-map uri="updateExampleAjax">
+        <security https="true" auth="true"/>
+        <event type="service" invoke="updateExample"/>
+        <response name="success" type="view" value="findExampleAjax"/>
+        <response name="error" type="view" value="findExampleAjax"/>
+    </request-map>
+
+    <request-map uri="EditExampleItems"><security https="true" auth="true"/><response name="success" type="view" value="EditExampleItems"/></request-map>
+    <request-map uri="createExampleItem">
+        <security https="true" auth="true"/>
+        <event type="service" invoke="createExampleItem"/>
+        <response name="success" type="request-redirect" value="EditExampleItems">
+            <redirect-parameter name="exampleId"/>
+        </response>
+        <response name="error" type="view" value="EditExampleItems"/>
+    </request-map>
+    <request-map uri="updateExampleItem">
+        <security https="true" auth="true"/>
+        <event type="service" invoke="updateExampleItem"/>
+        <response name="success" type="request-redirect" value="EditExampleItems">
+            <redirect-parameter name="exampleId"/>
+        </response>
+        <response name="error" type="view" value="EditExampleItems"/>
+    </request-map>
+    <request-map uri="deleteExampleItem">
+        <security https="true" auth="true"/>
+        <event type="service" invoke="deleteExampleItem"/>
+        <response name="success" type="request-redirect" value="EditExampleItems">
+            <redirect-parameter name="exampleId"/>
+        </response>
+        <response name="error" type="view" value="EditExampleItems"/>
+    </request-map>
+
+    <request-map uri="EditExampleFeatureAppls"><security https="true" auth="true"/><response name="success" type="view" value="EditExampleFeatureAppls"/></request-map>
+    <request-map uri="example_createExampleFeatureAppl">
+        <security https="true" auth="true"/>
+        <event type="service" invoke="createExampleFeatureAppl"/>
+        <response name="success" type="request-redirect" value="EditExampleFeatureAppls">
+            <redirect-parameter name="exampleId"/>
+        </response>
+        <response name="error" type="view" value="EditExampleFeatureAppls"/>
+    </request-map>
+    <request-map uri="example_updateExampleFeatureAppl">
+        <security https="true" auth="true"/>
+        <event type="service" invoke="updateExampleFeatureAppl"/>
+        <response name="success" type="request-redirect" value="EditExampleFeatureAppls">
+            <redirect-parameter name="exampleId"/>
+        </response>
+        <response name="error" type="view" value="EditExampleFeatureAppls"/>
+    </request-map>
+    <request-map uri="example_deleteExampleFeatureAppl">
+        <security https="true" auth="true"/>
+        <event type="service" invoke="deleteExampleFeatureAppl"/>
+        <response name="success" type="request-redirect" value="EditExampleFeatureAppls">
+            <redirect-parameter name="exampleId"/>
+        </response>
+        <response name="error" type="view" value="EditExampleFeatureAppls"/>
+    </request-map>
+
+    <!-- ExampleFeature Requests -->
+    <request-map uri="FindExampleFeature"><security https="true" auth="true"/><response name="success" type="view" value="FindExampleFeature"/></request-map>
+    <request-map uri="EditExampleFeature"><security https="true" auth="true"/><response name="success" type="view" value="EditExampleFeature"/></request-map>
+    <request-map uri="createExampleFeature">
+        <security https="true" auth="true"/>
+        <event type="service" invoke="createExampleFeature"/>
+        <response name="success" type="request-redirect" value="EditExampleFeature">
+            <redirect-parameter name="exampleId"/>
+        </response>
+        <response name="error" type="view" value="EditExampleFeature"/>
+    </request-map>
+    <request-map uri="updateExampleFeature">
+        <security https="true" auth="true"/>
+        <event type="service" invoke="updateExampleFeature"/>
+        <response name="success" type="request-redirect" value="EditExampleFeature">
+            <redirect-parameter name="exampleId"/>
+        </response>
+        <response name="error" type="view" value="EditExampleFeature"/>
+    </request-map>
+
+    <request-map uri="EditExampleFeatureExampleAppls"><security https="true" auth="true"/><response name="success" type="view" value="EditExampleFeatureExampleAppls"/></request-map>
+    <request-map uri="feature_createExampleFeatureAppl">
+        <security https="true" auth="true"/>
+        <event type="service" invoke="createExampleFeatureAppl"/>
+        <response name="success" type="request-redirect" value="EditExampleFeatureExampleAppls">
+            <redirect-parameter name="exampleId"/>
+        </response>
+        <response name="error" type="view" value="EditExampleFeatureExampleAppls"/>
+    </request-map>
+    <request-map uri="feature_updateExampleFeatureAppl">
+        <security https="true" auth="true"/>
+        <event type="service" invoke="updateExampleFeatureAppl"/>
+        <response name="success" type="request-redirect" value="EditExampleFeatureExampleAppls">
+            <redirect-parameter name="exampleId"/>
+        </response>
+        <response name="error" type="view" value="EditExampleFeatureExampleAppls"/>
+    </request-map>
+    <request-map uri="feature_deleteExampleFeatureAppl">
+        <security https="true" auth="true"/>
+        <event type="service" invoke="deleteExampleFeatureAppl"/>
+        <response name="success" type="request-redirect" value="EditExampleFeatureExampleAppls">
+            <redirect-parameter name="exampleId"/>
+        </response>
+        <response name="error" type="view" value="EditExampleFeatureExampleAppls"/>
+    </request-map>
+    <request-map uri="findExampleFeatures">
+        <security https="true" auth="true"/>
+        <event type="groovy" path="component://example/webapp/example/WEB-INF/actions/includes/" invoke="FindExampleFeatures.groovy"/>
+        <response name="success" type="view" value="ajaxAutocompleteOptions"/>
+        <response name="error" type="view" value="ajaxAutocompleteOptions"/>
+    </request-map>
+
+    <request-map uri="FormWidgetExamples"><security https="true" auth="true"/><response name="success" type="view" value="FormWidgetExamples"/></request-map>
+
+    <request-map uri="LookupExampleFeature"><security https="true" auth="true"/><response name="success" type="view" value="LookupExampleFeature"/></request-map>
+    <request-map uri="LookupPartyName"><security https="true" auth="true"/><response name="success" type="view" value="LookupPartyName"/></request-map>
+    <request-map uri="LookupPartyGroupByName"><security https="true" auth="true"/><response name="success" type="view" value="LookupPartyGroupByName"/></request-map>
+
+    <request-map uri="ListExampleFormOnly"><security https="true" auth="false"/><response name="success" type="view" value="ListExampleFormOnly"/></request-map>
+    <request-map uri="CreateExampleFormOnly"><security https="true" auth="false"/><response name="success" type="view" value="CreateExampleFormOnly"/></request-map>
+
+    <request-map uri="printExampleFOPFonts">
+      <security https="true" auth="true"/>
+      <response name="success" type="view" value="printExampleFOPFonts"/>
+    </request-map>
+
+    <request-map uri="views">
+        <security https="true" auth="false"/>
+        <response name="success" type="request" value="main"/>
+    </request-map>
+
+    <request-map uri="ExampleGeoLocationPointSet1"><security https="true" auth="true"/><response name="success" type="view" value="ExampleGeoLocationPointSet1"/></request-map>
+    <request-map uri="ExampleGeoLocationPointSet2"><security https="true" auth="true"/><response name="success" type="view" value="ExampleGeoLocationPointSet2"/></request-map>
+    <request-map uri="ExampleGeoLocationPointSet3"><security https="true" auth="true"/><response name="success" type="view" value="ExampleGeoLocationPointSet3"/></request-map>
+    <request-map uri="ExampleGeoLocationPointSet4"><security https="true" auth="true"/><response name="success" type="view" value="ExampleGeoLocationPointSet4"/></request-map>
+    <request-map uri="ExampleGeoLocationAddress"><security https="true" auth="true"/><response name="success" type="view" value="ExampleGeoLocationAddress"/></request-map>
+    <request-map uri="ExampleOsmGeoLocationPointSet1"><security https="true" auth="true"/><response name="success" type="view" value="ExampleOsmGeoLocationPointSet1"/></request-map>
+    <request-map uri="ExampleOsmGeoLocationPointSet2"><security https="true" auth="true"/><response name="success" type="view" value="ExampleOsmGeoLocationPointSet2"/></request-map>
+    <request-map uri="ExampleOsmGeoLocationPointSet3"><security https="true" auth="true"/><response name="success" type="view" value="ExampleOsmGeoLocationPointSet3"/></request-map>
+    <request-map uri="ExampleOsmGeoLocationPointSet4"><security https="true" auth="true"/><response name="success" type="view" value="ExampleOsmGeoLocationPointSet4"/></request-map>
+
+    <!-- Birt example Requests -->
+    <request-map uri="BirtMain">
+        <security https="true" auth="true"/>
+        <response name="success" type="view" value="BirtMain"/>
+    </request-map>
+
+    <!--flot example requests-->
+    <request-map uri="ExampleBarChart">
+        <security https="true" auth="true"/>
+        <response name="success" type="view" value="ExampleBarChart"/>
+    </request-map>
+    <request-map uri="ExamplePieChart">
+        <security https="true" auth="true"/>
+        <response name="success" type="view" value="ExamplePieChart"/>
+    </request-map>
+    <!-- end of request mappings -->
+
+    <!-- Jackrabbit Example Requests -->
+    <request-map uri="ExampleJackrabbit">
+        <security auth="true" https="true" />
+        <response name="success" type="view" value="ExampleJackrabbit" />
+        <response name="error" type="view" value="ExampleJackrabbit" />
+    </request-map>
+    <request-map uri="ExampleJackrabbitAddData">
+        <security auth="true" https="true" />
+        <response name="success" type="view" value="ExampleJackrabbitAddData" />
+        <response name="error" type="view" value="ExampleJackrabbitAddData" />
+    </request-map>
+    <request-map uri="StoreNewRepositoryData">
+        <security auth="true" https="true" />
+        <event type="java" path="org.ofbiz.example.JackrabbitEvents" invoke="addNewTextMessageToJcrRepository" />
+        <response name="success" type="request" value="ExampleJackrabbitShowContentData" />
+        <response name="error" type="view" value="ExampleJackrabbitAddData" />
+    </request-map>
+    <request-map uri="ExampleJackrabbitScanRepositoryStructure">
+        <security auth="true" https="true" />
+        <event type="java" path="org.ofbiz.example.JackrabbitEvents" invoke="scanRepositoryStructure"/>
+        <response name="success" type="view" value="ExampleJackrabbitScanRepositoryStructure" />
+        <response name="error" type="view" value="ExampleJackrabbitScanRepositoryStructure" />
+    </request-map>
+    <request-map uri="EditRepositoryContent">
+        <security auth="true" https="true" />
+        <event type="java" path="org.ofbiz.example.JackrabbitEvents" invoke="getNodeContent"/>
+        <response name="success" type="view" value="ExampleJackrabbitEditRepositoryContent" />
+        <response name="error" type="request" value="ExampleJackrabbitShowContentData" />
+    </request-map>
+    <request-map uri="UpdateRepositoryData">
+        <security auth="true" https="true" />
+        <event type="java" path="org.ofbiz.example.JackrabbitEvents" invoke="updateRepositoryData"/>
+        <response name="success" type="request" value="EditRepositoryContent" />
+        <response name="error" type="request" value="EditRepositoryContent" />
+    </request-map>
+    <request-map uri="RemoveRepositoryNode">
+        <security auth="true" https="true" />
+        <event type="java" path="org.ofbiz.example.JackrabbitEvents" invoke="removeRepositoryNode"/>
+        <response name="success" type="request" value="ExampleJackrabbitShowContentData" />
+        <response name="error" type="request" value="ExampleJackrabbitShowContentData" />
+    </request-map>
+    <request-map uri="RemoveRepositoryFile">
+        <security auth="true" https="true" />
+        <event type="java" path="org.ofbiz.example.JackrabbitEvents" invoke="removeRepositoryNode"/>
+        <response name="success" type="request" value="ExampleJackrabbitShowUploadedFiles" />
+        <response name="error" type="request" value="ExampleJackrabbitShowUploadedFiles" />
+    </request-map>
+    <request-map uri="ExampleJackrabbitUploadFileData">
+        <security auth="true" https="true" />
+        <response name="success" type="view" value="ExampleJackrabbitUploadFileData" />
+        <response name="error" type="view" value="ExampleJackrabbitUploadFileData" />
+    </request-map>
+    <request-map uri="StoreNewRepositoryFileData">
+        <security auth="true" https="true" />
+        <event type="java" path="org.ofbiz.example.JackrabbitEvents" invoke="uploadFileData"/>
+        <response name="success" type="request" value="ExampleJackrabbitShowUploadedFiles" />
+        <response name="error" type="view" value="ExampleJackrabbitUploadFileData" />
+    </request-map>
+    <request-map uri="ExampleJackrabbitShowUploadedFiles">
+        <security auth="true" https="true" />
+        <event type="java" path="org.ofbiz.example.JackrabbitEvents" invoke="getRepositoryFileTree"/>
+        <response name="success" type="view" value="ExampleJackrabbitShowUploadedFiles" />
+        <response name="error" type="view" value="ExampleJackrabbitShowUploadedFiles" />
+    </request-map>
+    <request-map uri="GetFileFromRepository">
+        <security auth="true" https="true" />
+        <event type="java" path="org.ofbiz.example.JackrabbitEvents" invoke="getFileFromRepository"/>
+        <response name="success" type="none" />
+        <response name="error" type="none" />
+    </request-map>
+    <request-map uri="ExampleJackrabbitShowContentData">
+        <security auth="true" https="true" />
+        <event type="java" path="org.ofbiz.example.JackrabbitEvents" invoke="getRepositoryDataTree"/>
+        <response name="success" type="view" value="ExampleJackrabbitShowContentData"/>
+        <response name="error" type="view" value="ExampleJackrabbitShowContentData"/>
+    </request-map>
+    <request-map uri="OpenFileInformation">
+        <security auth="true" https="true" />
+        <event type="java" path="org.ofbiz.example.JackrabbitEvents" invoke="getFileInformation"/>
+        <response name="success" type="view" value="ExampleJackrabbitOpenFileInformation"/>
+        <response name="error" type="view" value="ExampleJackrabbitShowUploadedFiles"/>
+    </request-map>
+    <request-map uri="QueryRepositoryData">
+        <security auth="true" https="true" />
+        <event type="java" path="org.ofbiz.example.JackrabbitEvents" invoke="queryRepositoryData"/>
+        <response name="success" type="view" value="ExampleJackrabbitShowQueryResult"/>
+        <response name="error" type="request" value="ExampleJackrabbitShowContentData"/>
+    </request-map>
+
+    <!-- View Mappings -->
+    <view-map name="main" type="screen" page="component://example/widget/example/CommonScreens.xml#main"/>
+
+    <view-map name="FindExample" type="screen" page="component://example/widget/example/ExampleScreens.xml#FindExample"/>
+    <view-map name="EditExample" type="screen" page="component://example/widget/example/ExampleScreens.xml#EditExample"/>
+    <view-map name="EditExampleLayer" type="screen" page="component://example/widget/example/ExampleScreens.xml#EditExampleLayer"/>
+    <view-map name="EditExampleItems" type="screen" page="component://example/widget/example/ExampleScreens.xml#EditExampleItems"/>
+    <view-map name="EditExampleFeatureAppls" type="screen" page="component://example/widget/example/ExampleScreens.xml#EditExampleFeatureAppls"/>
+    <view-map name="ExampleReportHtml" type="screen" page="component://example/widget/example/ExampleScreens.xml#ExampleReport"/>
+    <view-map name="ExampleReportPdf" type="screenfop" page="component://example/widget/example/ExampleScreens.xml#ExampleReport" content-type="application/pdf" encoding="none"/>
+
+    <view-map name="FindExampleFeature" type="screen" page="component://example/widget/example/ExampleFeatureScreens.xml#FindExampleFeature"/>
+    <view-map name="EditExampleFeature" type="screen" page="component://example/widget/example/ExampleFeatureScreens.xml#EditExampleFeature"/>
+    <view-map name="EditExampleFeatureExampleAppls" type="screen" page="component://example/widget/example/ExampleFeatureScreens.xml#EditExampleFeatureExampleAppls"/>
+
+    <view-map name="FormWidgetExamples" type="screen" page="component://example/widget/example/FormWidgetExampleScreens.xml#FormWidgetExamples"/>
+
+    <view-map name="LookupExampleFeature" type="screen" page="component://example/widget/example/ExampleFeatureScreens.xml#LookupExampleFeature"/>
+    <view-map name="LookupPartyName" type="screen" page="component://example/widget/example/FormWidgetExampleLookupScreens.xml#LookupPartyName"/>
+    <view-map name="LookupPartyGroupByName" type="screen" page="component://example/widget/example/FormWidgetExampleLookupScreens.xml#LookupPartyGroupByName"/>
+
+    <!-- ajax view mappings -->
+    <view-map name="findExampleAjax" type="screen" page="component://example/widget/example/ExampleAjaxScreens.xml#AjaxExample"/>
+    <view-map name="ListExampleFormOnly" type="screen" page="component://example/widget/example/ExampleAjaxScreens.xml#ListExampleFormOnly"/>
+    <view-map name="CreateExampleFormOnly" type="screen" page="component://example/widget/example/ExampleAjaxScreens.xml#CreateExampleFormOnly"/>
+    <view-map name="printExampleFOPFonts" type="screenfop" page="component://example/widget/example/FormWidgetExampleScreens.xml#printExampleFOPFonts" content-type="application/pdf"  encoding="none"/>
+
+    <view-map name="ExampleGeoLocationPointSet1" type="screen" page="component://example/widget/example/ExampleScreens.xml#ExampleGeoLocationPointSet1"/>
+    <view-map name="ExampleGeoLocationPointSet2" type="screen" page="component://example/widget/example/ExampleScreens.xml#ExampleGeoLocationPointSet2"/>
+    <view-map name="ExampleGeoLocationPointSet3" type="screen" page="component://example/widget/example/ExampleScreens.xml#ExampleGeoLocationPointSet3"/>
+    <view-map name="ExampleGeoLocationPointSet4" type="screen" page="component://example/widget/example/ExampleScreens.xml#ExampleGeoLocationPointSet4"/>
+    <view-map name="ExampleGeoLocationAddress" type="screen" page="component://example/widget/example/ExampleScreens.xml#ExampleGeoLocationAddress"/>
+    <view-map name="ExampleOsmGeoLocationPointSet1" type="screen" page="component://example/widget/example/ExampleScreens.xml#ExampleOsmGeoLocationPointSet1"/>
+    <view-map name="ExampleOsmGeoLocationPointSet2" type="screen" page="component://example/widget/example/ExampleScreens.xml#ExampleOsmGeoLocationPointSet2"/>
+    <view-map name="ExampleOsmGeoLocationPointSet3" type="screen" page="component://example/widget/example/ExampleScreens.xml#ExampleOsmGeoLocationPointSet3"/>
+    <view-map name="ExampleOsmGeoLocationPointSet4" type="screen" page="component://example/widget/example/ExampleScreens.xml#ExampleOsmGeoLocationPointSet4"/>
+
+    <!-- Birt example View Mappings -->
+    <view-map name="BirtMain" type="screen" page="component://example/widget/example/BirtScreens.xml#main"/>
+
+    <!-- Flot view mapping -->
+    <view-map name="ExampleBarChart" page="component://example/widget/example/ExampleScreens.xml#ExampleBarChart" type="screen"/>
+    <view-map name="ExamplePieChart" page="component://example/widget/example/ExampleScreens.xml#ExamplePieChart" type="screen"/>
+
+    <!-- Jackrabbit View Mapping -->
+    <view-map name="ExampleJackrabbit" page="component://example/widget/example/ExampleJackrabbitScreens.xml#ListRepositoryData" type="screen" />
+    <view-map name="ExampleJackrabbitAddData" page="component://example/widget/example/ExampleJackrabbitScreens.xml#ExampleJackrabbitAddData" type="screen" />
+    <view-map name="ExampleJackrabbitScanRepositoryStructure" page="component://example/widget/example/ExampleJackrabbitScreens.xml#ExampleJackrabbitScanRepositoryStructure" type="screen" />
+    <view-map name="ExampleJackrabbitEditRepositoryContent" page="component://example/widget/example/ExampleJackrabbitScreens.xml#ExampleJackrabbitEditRepositoryContent" type="screen" />
+    <view-map name="ExampleJackrabbitUploadFileData" page="component://example/widget/example/ExampleJackrabbitScreens.xml#ExampleJackrabbitUploadFileData" type="screen" />
+    <view-map name="ExampleJackrabbitShowUploadedFiles" page="component://example/widget/example/ExampleJackrabbitScreens.xml#ExampleJackrabbitShowUploadedFiles" type="screen" />
+    <view-map name="ExampleJackrabbitShowContentData" page="component://example/widget/example/ExampleJackrabbitScreens.xml#ExampleJackrabbitShowContentData" type="screen" />
+    <view-map name="ExampleJackrabbitOpenFileInformation" page="component://example/widget/example/ExampleJackrabbitScreens.xml#ExampleJackrabbitShowFileInformation" type="screen" />
+    <view-map name="ExampleJackrabbitShowQueryResult" page="component://example/widget/example/ExampleJackrabbitScreens.xml#ExampleJackrabbitShowQueryResult" type="screen" />
+
+
+    <!-- Supported Content Types -->
+    <!--
+        text/html
+        application/pdf
+        application/vnd.ms-excel
+        application/vnd.ms-word
+        application/vnd.ms-powerpoint
+     -->
+
+    <!-- end of view mappings -->
+</site-conf>
diff --git a/framework/example/webapp/example/WEB-INF/web.xml b/framework/example/webapp/example/WEB-INF/web.xml
new file mode 100644
index 0000000..e658c4e
--- /dev/null
+++ b/framework/example/webapp/example/WEB-INF/web.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<web-app>
+    <display-name>Open For Business - Example Application</display-name>
+    <description>Example Application of the Open For Business Project</description>
+
+    <context-param>
+        <param-name>webSiteId</param-name>
+        <param-value>EXAMPLE</param-value>
+        <description>A unique ID used to look up the WebSite entity</description>
+    </context-param>
+    <context-param>
+        <param-name>localDispatcherName</param-name><param-value>example</param-value>
+        <description>A unique name used to identify/recognize the local dispatcher for the Service Engine</description>
+    </context-param>
+    <context-param>
+        <param-name>entityDelegatorName</param-name><param-value>default</param-value>
+        <description>The Name of the Entity Delegator to use, defined in entityengine.xml</description>
+    </context-param>
+    <context-param>
+        <param-name>mainDecoratorLocation</param-name>
+        <param-value>component://example/widget/example/CommonScreens.xml</param-value>
+        <description>The location of the main-decorator screen to use for this webapp; referred to as a context variable in screen def XML files.</description>
+    </context-param>
+    <context-param>
+        <param-name>compressHTML</param-name>
+        <param-value>false</param-value>
+        <description>Remove unnecessary whitespace from HTML output.</description>
+    </context-param>
+
+    <filter>
+        <filter-name>ContextFilter</filter-name>
+        <display-name>ContextFilter</display-name>
+        <filter-class>org.ofbiz.webapp.control.ContextFilter</filter-class>
+        <init-param><param-name>disableContextSecurity</param-name><param-value>N</param-value></init-param>
+        <init-param>
+            <param-name>allowedPaths</param-name>
+            <param-value>/error:/control:/select:/index.html:/index.jsp:/default.html:/default.jsp:/images:/includes/maincss.css</param-value>
+        </init-param>
+        <init-param><param-name>errorCode</param-name><param-value>403</param-value></init-param>
+        <init-param><param-name>redirectPath</param-name><param-value>/control/main</param-value></init-param>
+    </filter>
+    <filter-mapping><filter-name>ContextFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
+
+    <listener><listener-class>org.ofbiz.webapp.control.ControlEventListener</listener-class></listener>
+    <listener><listener-class>org.ofbiz.webapp.control.LoginEventListener</listener-class></listener>
+    <!-- NOTE: not all app servers support mounting implementations of the HttpSessionActivationListener interface -->
+    <!-- <listener><listener-class>org.ofbiz.webapp.control.ControlActivationEventListener</listener-class></listener> -->
+
+    <servlet>
+        <servlet-name>ControlServlet</servlet-name>
+        <display-name>ControlServlet</display-name>
+        <description>Main Control Servlet</description>
+        <servlet-class>org.ofbiz.webapp.control.ControlServlet</servlet-class>
+        <load-on-startup>1</load-on-startup>
+    </servlet>
+    <servlet-mapping><servlet-name>ControlServlet</servlet-name><url-pattern>/control/*</url-pattern></servlet-mapping>
+
+    <session-config><session-timeout>60</session-timeout><!-- in minutes --></session-config>
+
+    <welcome-file-list>
+        <welcome-file>index.jsp</welcome-file>
+        <welcome-file>index.html</welcome-file>
+        <welcome-file>index.htm</welcome-file>
+    </welcome-file-list>
+</web-app>
diff --git a/framework/example/webapp/example/error/error.jsp b/framework/example/webapp/example/error/error.jsp
new file mode 100644
index 0000000..dcfa3b0
--- /dev/null
+++ b/framework/example/webapp/example/error/error.jsp
@@ -0,0 +1,52 @@
+<%--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+--%>
+<%@ page import="org.ofbiz.base.util.*" %>
+<html>
+<head>
+<title>Open For Business Message</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<% String errorMsg = (String) request.getAttribute("_ERROR_MESSAGE_"); %>
+
+<body bgcolor="#FFFFFF">
+<div align="center">
+  <br/>
+  <table width="100%" border="1" height="200">
+    <tr>
+      <td>
+        <table width="100%" border="0" height="200">
+          <tr bgcolor="#CC6666">
+            <td height="45">
+              <div align="center"><font face="Verdana, Arial, Helvetica, sans-serif" size="4" color="#FFFFFF"><b>:ERROR MESSAGE:</b></font></div>
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <div align="left"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><%=UtilFormatOut.replaceString(errorMsg, "\n", "<br/>")%></font></div>
+            </td>
+          </tr>
+        </table>
+      </td>
+    </tr>
+  </table>
+</div>
+<div align="center"></div>
+</body>
+</html>
diff --git a/framework/example/webapp/example/flot/flotPie.ftl b/framework/example/webapp/example/flot/flotPie.ftl
new file mode 100644
index 0000000..b05088f
--- /dev/null
+++ b/framework/example/webapp/example/flot/flotPie.ftl
@@ -0,0 +1,68 @@
+<#--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+<script language="javascript" type="text/javascript" src="<@ofbizContentUrl>/images/jquery/plugins/flot/excanvas.min.js</@ofbizContentUrl>"></script>
+<script language="javascript" type="text/javascript" src="<@ofbizContentUrl>/images/jquery/jquery-1.7.min.js</@ofbizContentUrl>"></script>
+<script language="javascript" type="text/javascript" src="<@ofbizContentUrl>/images/jquery/plugins/flot/jquery.flot.js</@ofbizContentUrl>"></script>
+<script language="javascript" type="text/javascript" src="<@ofbizContentUrl>/images/jquery/plugins/flot/jquery.flot.pie.js</@ofbizContentUrl>"></script>
+
+<div id="container" style="width:600px;height:300px;"></div>
+
+<script type="text/javascript">
+  jQuery(document).ready( function(){
+    // Fill series.
+    var d1 = [[0, Math.ceil(Math.random()*40)]];
+    var d2 = [[0, Math.ceil(Math.random()*30)]];
+    var d3 = [[0, Math.ceil(Math.random()*20)]];
+    var d4 = [[0, Math.ceil(Math.random()*10)]];
+    var d5 = [[0, Math.ceil(Math.random()*10)]];
+
+    var data = [
+        {data:d1, label: 'Comedy'},
+        {data:d2, label: 'Action'},
+        {data:d3, label: 'Romance'},
+        {data:d4, label: 'Drama'},
+        {data:d5, label: 'Other'}
+    ];
+  });
+</script>
+
+<div id="containerb" style="width:600px;height:300px;"></div>
+
+<script type="text/javascript">
+  /**
+   * Wait till dom's finished loading.
+   */
+  jQuery(document).ready( function(){
+    /**
+     * Draw the graph in the first container.
+     */
+    jQuery.plot(jQuery("#containerb"), allData,
+    {
+            series: {
+                    pie: {
+                            show: true
+                    }
+            }
+            grid: {
+                autoHighlight: true,
+                hoverable: true
+            }
+    });
+  });
+</script>
diff --git a/framework/example/webapp/example/index.jsp b/framework/example/webapp/example/index.jsp
new file mode 100644
index 0000000..0ad9a3f
--- /dev/null
+++ b/framework/example/webapp/example/index.jsp
@@ -0,0 +1,20 @@
+<%--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+--%>
+
+<%response.sendRedirect("control/main");%>
diff --git a/framework/example/webapp/example/jackrabbit/ContentChooser.ftl b/framework/example/webapp/example/jackrabbit/ContentChooser.ftl
new file mode 100644
index 0000000..f7cda63
--- /dev/null
+++ b/framework/example/webapp/example/jackrabbit/ContentChooser.ftl
@@ -0,0 +1,52 @@
+<#--

+Licensed to the Apache Software Foundation (ASF) under one

+or more contributor license agreements.  See the NOTICE file

+distributed with this work for additional information

+regarding copyright ownership.  The ASF licenses this file

+to you 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.

+-->

+${uiLabelMap.ExampleJackrabbitQuickContentSelect}

+<form id="selectNode" action="EditRepositoryContent" type="post">

+    <select name="path" id="nodePath">

+        <option value="" selected></option>

+        <#list parameters.contentList as content>

+            <option value="${content}">${content}</option>

+        </#list>

+    </select>

+    <select name="language" id="nodeLanguage">

+        <option value="" selected></option>

+    </select>

+    <input type="submit" />

+</form>

+

+<script type="text/javascript">

+    var languageList = ${parameters.languageList}

+

+    jQuery("#nodePath").change(function() {

+        var newOptions = languageList[jQuery(this).val()];

+

+        var options = "";

+        for (option in newOptions) {

+            options = options + "<option value='" + newOptions[option] + "'>" + newOptions[option] + "</option>";

+

+        }

+        options = options + "<option value='' ></option>"

+

+        jQuery("#nodeLanguage").children().remove();

+        jQuery("#nodeLanguage").append(options);

+

+    });

+</script>

+

+<br />
\ No newline at end of file
diff --git a/framework/example/webapp/example/jackrabbit/JackrabbitDataTree.ftl b/framework/example/webapp/example/jackrabbit/JackrabbitDataTree.ftl
new file mode 100644
index 0000000..8d2aa7c
--- /dev/null
+++ b/framework/example/webapp/example/jackrabbit/JackrabbitDataTree.ftl
@@ -0,0 +1,94 @@
+<#--

+Licensed to the Apache Software Foundation (ASF) under one

+or more contributor license agreements.  See the NOTICE file

+distributed with this work for additional information

+regarding copyright ownership.  The ASF licenses this file

+to you 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.

+-->

+<script language="javascript" type="text/javascript" src="<@ofbizContentUrl>/images/jquery/plugins/jsTree/jquery.jstree.js</@ofbizContentUrl>"></script>

+

+<div id="jackrabbitDataTree">${parameters.dataTree!""}</div>

+

+<script type="text/javascript">

+    var rawdata = ${parameters.dataTree!};

+

+    jQuery(function () {

+        jQuery("#jackrabbitDataTree").jstree({

+            "plugins" : [ "themes", "json_data", "ui", "contextmenu"],

+            "json_data" : {

+                "data" : rawdata

+            },

+            'contextmenu': {

+                'items': {

+                    'ccp' : false,

+                    'create' : false,

+                    'rename' : false,

+                    'open' : {

+                        'label' : "${uiLabelMap.ExampelsJackrabbitOpenData}",

+                        'action' : function(obj) {

+                            openDataFromRepository(obj.attr('nodepath'), obj.attr('nodetype'));

+                        }

+                   },

+                    'remove' : {

+                        'label' : "${uiLabelMap.ExampelsJackrabbitRemoveData}",

+                        'action' : function(obj) {

+                            removeDataFromRepository(obj.attr('nodepath'), obj.attr('nodetype'));

+                         }

+                   }

+                 }

+             }

+        });

+    });

+

+    function removeDataFromRepository(nodepath, nodetype) {

+        var parameters = {"path" : nodepath};

+        var url = "RemoveRepositoryNode";

+

+        runPostRequest(url, parameters)

+    }

+

+    function openDataFromRepository(nodepath, nodetype) {

+

+        var parameters = {"path" : nodepath};

+        var url = "EditRepositoryContent";

+

+        runPostRequest(url, parameters)

+    }

+

+    function runPostRequest(url, parameters) {

+        // create a hidden form

+        var form = jQuery('<form></form>');

+

+        form.attr("method", "POST");

+        form.attr("action", url);

+

+        jQuery.each(parameters, function(key, value) {

+            var field = jQuery('<input></input>');

+

+            field.attr("type", "hidden");

+            field.attr("name", key);

+            field.attr("value", value);

+

+            form.append(field);

+        });

+

+        // The form needs to be apart of the document in

+        // order for us to be able to submit it.

+        jQuery(document.body).append(form);

+        form.submit();

+        form.remove();

+    }

+

+

+</script>
\ No newline at end of file
diff --git a/framework/example/webapp/example/jackrabbit/JackrabbitFileTree.ftl b/framework/example/webapp/example/jackrabbit/JackrabbitFileTree.ftl
new file mode 100644
index 0000000..a0914f7
--- /dev/null
+++ b/framework/example/webapp/example/jackrabbit/JackrabbitFileTree.ftl
@@ -0,0 +1,110 @@
+<#--

+Licensed to the Apache Software Foundation (ASF) under one

+or more contributor license agreements.  See the NOTICE file

+distributed with this work for additional information

+regarding copyright ownership.  The ASF licenses this file

+to you 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.

+-->

+<script language="javascript" type="text/javascript" src="<@ofbizContentUrl>/images/jquery/plugins/jsTree/jquery.jstree.js</@ofbizContentUrl>"></script>

+

+<div id="jackrabbitFileTree">${parameters.fileTree!""}</div>

+

+<script type="text/javascript">

+    var rawdata = ${parameters.fileTree!};

+

+    jQuery(function () {

+        jQuery("#jackrabbitFileTree").jstree({

+            "plugins" : [ "themes", "json_data", "ui", "contextmenu"],

+            "json_data" : {

+                "data" : rawdata

+            },

+            'contextmenu': {

+                'items': {

+                    'ccp' : false,

+                    'create' : false,

+                    'rename' : false,

+                    'open' : {

+                        'label' : "${uiLabelMap.ExampelsJackrabbitOpenFile}",

+                        'action' : function(obj) {

+                            openFileFromRepository(obj.attr('nodepath'), obj.attr('nodetype'));

+                         }

+                    },

+                    'remove' : {

+                        'label' : "${uiLabelMap.ExampelsJackrabbitRemoveFile}",

+                        'action' : function(obj) {

+                            removeFileFromRepository(obj.attr('nodepath'), obj.attr('nodetype'));

+                         }

+                        },

+                    'download' : {

+                        'label' : "${uiLabelMap.ExampelsJackrabbitDownloadFile}",

+                        'action' : function(obj) {

+                            downloadFileFromRepository(obj.attr('nodepath'), obj.attr('nodetype'));

+                        }

+                   }

+                 }

+             }

+        });

+    });

+

+    function openFileFromRepository(nodepath, nodetype) {

+        var parameters = {"path" : nodepath};

+        var url = "OpenFileInformation";

+

+        runPostRequest(url, parameters)

+    }

+

+    function removeFileFromRepository(nodepath, nodetype) {

+        var parameters = {"path" : nodepath};

+        var url = "RemoveRepositoryFile";

+

+        runPostRequest(url, parameters)

+    }

+

+    function downloadFileFromRepository(nodepath, nodetype) {

+        if ("nt:folder" == nodetype) { // the open function for foldes is not supported yet.

+            return;

+        }

+

+        var parameters = {"path" : nodepath};

+        var url = "GetFileFromRepository";

+

+        runPostRequest(url, parameters)

+    }

+

+    function runPostRequest(url, parameters) {

+        // create a hidden form

+        var form = jQuery('<form></form>');

+

+        form.attr("method", "POST");

+        form.attr("action", url);

+

+        jQuery.each(parameters, function(key, value) {

+            var field = jQuery('<input></input>');

+

+            field.attr("type", "hidden");

+            field.attr("name", key);

+            field.attr("value", value);

+

+            form.append(field);

+        });

+

+        // The form needs to be apart of the document in

+        // order for us to be able to submit it.

+        jQuery(document.body).append(form);

+        form.submit();

+        form.remove();

+    }

+

+

+</script>
\ No newline at end of file
diff --git a/framework/example/webapp/example/reports/fonts.fo.ftl b/framework/example/webapp/example/reports/fonts.fo.ftl
new file mode 100644
index 0000000..fcd86d1
--- /dev/null
+++ b/framework/example/webapp/example/reports/fonts.fo.ftl
@@ -0,0 +1,55 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+    <fo:layout-master-set>
+      <fo:simple-page-master master-name="portrait"
+                page-width="210mm"   page-height="297mm"
+                margin-top="0mm"  margin-bottom="0mm"
+                margin-left="15mm" margin-right="9mm">
+            <fo:region-body margin-top="19mm" margin-bottom="15mm"/>
+      </fo:simple-page-master>
+   </fo:layout-master-set>
+
+   <fo:page-sequence master-reference="portrait" initial-page-number="1">
+     <fo:flow flow-name="xsl-region-body">
+    <fo:block text-align="center">Font samples</fo:block>
+    <fo:block></fo:block>
+        <fo:block color="red">Helvetica</fo:block>
+        <fo:block font-family="Helvetica" font-style="normal" font-weight="normal">the quick brown fox jumps over the lazy dog 1234657890</fo:block>
+        <fo:block font-family="Helvetica" font-style="normal" font-weight="bold">the quick brown fox jumps over the lazy dog 1234657890</fo:block>
+        <fo:block font-family="Helvetica" font-style="italic" font-weight="bold">the quick brown fox jumps over the lazy dog 1234657890</fo:block>
+        <fo:block font-family="Helvetica" font-style="italic" font-weight="normal">the quick brown fox jumps over the lazy dog 1234657890</fo:block>
+        <fo:block color="red">Times</fo:block>
+        <fo:block font-family="Times" font-style="normal" font-weight="normal">the quick brown fox jumps over the lazy dog 1234657890</fo:block>
+        <fo:block font-family="Times" font-style="normal" font-weight="bold">the quick brown fox jumps over the lazy dog 1234657890</fo:block>
+        <fo:block font-family="Times" font-style="italic" font-weight="bold">the quick brown fox jumps over the lazy dog 1234657890</fo:block>
+        <fo:block font-family="Times" font-style="italic" font-weight="normal">the quick brown fox jumps over the lazy dog 1234657890</fo:block>
+        <fo:block color="red">Courier</fo:block>
+        <fo:block font-family="Courier" font-style="normal" font-weight="normal">the quick brown fox jumps over the lazy dog 1234657890</fo:block>
+        <fo:block font-family="Courier" font-style="normal" font-weight="bold">the quick brown fox jumps over the lazy dog 1234657890</fo:block>
+        <fo:block font-family="Courier" font-style="italic" font-weight="bold">the quick brown fox jumps over the lazy dog 1234657890</fo:block>
+        <fo:block font-family="Courier" font-style="italic" font-weight="normal">the quick brown fox jumps over the lazy dog 1234657890</fo:block>
+        <fo:block color="red">Symbol</fo:block>
+        <fo:block font-family="Symbol" font-style="normal" font-weight="normal">the quick brown fox jumps over the lazy dog 1234657890</fo:block>
+        <fo:block color="red">Zapf Dingbats</fo:block>
+        <fo:block font-family="ZapfDingbats" font-style="normal" font-weight="normal">the quick brown fox jumps over the lazy dog 1234657890</fo:block>
+     </fo:flow>
+  </fo:page-sequence>
+</fo:root>
diff --git a/framework/example/webapp/webapp.txt b/framework/example/webapp/webapp.txt
new file mode 100644
index 0000000..d4a77a9
--- /dev/null
+++ b/framework/example/webapp/webapp.txt
@@ -0,0 +1,20 @@
+#####################################################################
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#####################################################################
+
+Web applications which will be mounted by the container would go here.
diff --git a/framework/example/widget/example/BirtForms.xml b/framework/example/widget/example/BirtForms.xml
new file mode 100644
index 0000000..2dd907e
--- /dev/null
+++ b/framework/example/widget/example/BirtForms.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<forms xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/widget-form.xsd">
+
+    <form name="EditMail" type="single" target="sendBirtMail">
+        <field name="sendFrom"><text/></field>
+        <field name="sendTo"><text/></field>
+        <field name="subject"><text/></field>
+        <field name="birtReportLocation" tooltip="Example is component://example/webapp/birt/report/example.rptdesign"><text/></field>
+        <field name="birtContentType">
+            <drop-down>
+                <option key="text/html" description="text/html"/>
+                <option key="application/pdf" description="application/pdf"/>
+                <option key="application/vnd.ms-excel" description="application/vnd.ms-excel"/>
+                <option key="application/vnd.ms-word" description="application/vnd.ms-word"/>
+                <option key="application/vnd.ms-powerpoint" description="application/vnd.ms-powerpoint"/>
+            </drop-down>
+        </field>
+        <field name="attachmentName"><text/></field>
+        <field name="sendButton" widget-style="smallSubmit"><submit button-type="button"/></field>
+    </form>
+</forms>
diff --git a/framework/example/widget/example/BirtScreens.xml b/framework/example/widget/example/BirtScreens.xml
new file mode 100644
index 0000000..ab746a8
--- /dev/null
+++ b/framework/example/widget/example/BirtScreens.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<screens xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/widget-screen.xsd">
+
+    <screen name="main">
+        <section>
+            <actions>
+            </actions>
+            <widgets>
+                <decorator-screen name="CommonBirtDecorator" location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="body">
+                        <section>
+                            <widgets>
+                                  <label style="h3" text="BIRT is an open source Eclipse-based reporting system that integrates with any OFBiz application to produce compelling reports including graphical presentations like pie and bar charts."/>
+                                  <label style="h3" text="This application provides you with a sample example report."/>
+                                  <label style="h3" text="See the help option how to create your own OFBiz intergrated reports."/>
+                                  <link style="h3" text="or see the Birt home for more information" target="http://eclipse.org/birt/phoenix/intro/" url-mode="plain" target-window="_blank_"/>
+                            </widgets>
+                        </section>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="Report">
+        <section>
+            <actions>
+                <set field="tabButtonItem" value="Report"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="CommonBirtDecorator" location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="body">
+                        <section>
+                            <widgets>
+                                <screenlet title="Using report tag">
+                                    <platform-specific>
+                                        <html>
+                                            <html-template location="component://example/webapp/birt/birt/report.ftl"/>
+                                        </html>
+                                    </platform-specific>
+                                </screenlet>
+                            </widgets>
+                        </section>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="EditMail">
+        <section>
+            <actions>
+                <set field="tabButtonItem" value="Mail"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="CommonBirtDecorator" location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="body">
+                        <section>
+                            <widgets>
+                                <screenlet title="Send BIRT report by mail">
+                                    <include-form location="component://example/widget/example/BirtForms.xml" name="EditMail"/>
+                                </screenlet>
+                            </widgets>
+                        </section>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="chartReport">
+        <section>
+            <actions>
+                <set field="tabButtonItem" value="chartReport"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="CommonBirtDecorator" location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="body">
+                        <section>
+                            <widgets>
+                                <screenlet title="Using report tag">
+                                    <platform-specific>
+                                        <html><html-template location="component://example/webapp/birt/birt/chartReport.ftl"/></html>
+                                    </platform-specific>
+                                </screenlet>
+                            </widgets>
+                        </section>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+</screens>
diff --git a/framework/example/widget/example/CommonScreens.xml b/framework/example/widget/example/CommonScreens.xml
new file mode 100644
index 0000000..1e1b24d
--- /dev/null
+++ b/framework/example/widget/example/CommonScreens.xml
@@ -0,0 +1,337 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<screens xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/widget-screen.xsd">
+
+    <screen name="main-decorator">
+        <section>
+            <actions>
+                <!-- base/top/specific map first, then more common map added for shared labels -->
+                <property-map resource="ExampleUiLabels" map-name="uiLabelMap" global="true"/>
+                <property-map resource="CommonUiLabels" map-name="uiLabelMap" global="true"/>
+
+                <set field="layoutSettings.companyName" from-field="uiLabelMap.ExampleCompanyName" global="true"/>
+                <set field="layoutSettings.companySubtitle" from-field="uiLabelMap.ExampleCompanySubtitle" global="true"/>
+                <!-- layoutSettings.headerImageUrl can be used to specify an application specific logo; if not set,
+                    then the global layoutSettings.commonHeaderImageUrl (specified in GlobalDecorator) will be used. -->
+                <!--<set field="layoutSettings.headerImageUrl" value="/images/ofbiz_logo.gif" global="true"/>-->
+
+                <!-- <set field="layoutSettings.headerMiddleBackgroundUrl" value="" global="true"/> -->
+                <!-- <set field="layoutSettings.headerRightBackgroundUrl" value="" global="true"/> -->
+                <!-- TODO: Use transform to specify component URI -->
+                <set field="layoutSettings.companyName" from-field="uiLabelMap.ExampleCompanyName" global="true"/>
+                <set field="layoutSettings.companySubtitle" from-field="uiLabelMap.ExampleCompanySubtitle" global="true"/>
+                <set field="activeApp" value="example" global="true"/>
+                <set field="applicationMenuName" value="ExampleAppBar" global="true"/>
+                <set field="applicationMenuLocation" value="component://example/widget/example/ExampleMenus.xml" global="true"/>
+                <!--set field="appheaderTemplate" value="component://example/webapp/appheader.ftl"/-->
+                <set field="applicationTitle" value="${uiLabelMap.ExampleApplication}" global="true"/>
+            </actions>
+            <widgets>
+                <include-screen name="GlobalDecorator" location="component://common/widget/CommonScreens.xml"/>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="CommonExampleDecorator">
+        <!-- The CommonExampleDecorator screen decorates a small group of screens that all have
+            something in common. It is decorated by the main-decorator screen. To see how the
+            various decorators are combined to build a screen, view the page source of any
+            Example component screen. HTML comments indicate the start and end points of each
+            screen and decorator. -->
+        <section>
+            <actions>
+                <set field="headerItem" value="ExampleMenuItem"/>
+                <set field="exampleId" from-field="parameters.exampleId"/>
+                <entity-one entity-name="Example" value-field="example"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="main-decorator">
+                    <decorator-section name="pre-body">
+                        <section>
+                            <condition>
+                                <and>
+                                    <if-has-permission permission="EXAMPLE" action="_VIEW"/>
+                                    <not><if-empty field="example"/></not>
+                                </and>
+                            </condition>
+                            <widgets>
+                                <include-menu name="EditExample" location="component://example/widget/example/ExampleMenus.xml"/>
+                            </widgets>
+                        </section>
+                    </decorator-section>
+                    <decorator-section name="body">
+                        <section>
+                            <!-- do check for EXAMPLE, _VIEW permission -->
+                            <condition>
+                                <if-has-permission permission="EXAMPLE" action="_VIEW"/>
+                            </condition>
+                            <widgets>
+                                <section>
+                                    <condition>
+                                        <not><if-empty field="example"/></not>
+                                    </condition>
+                                    <widgets>
+                                        <container style="h1"><label>${uiLabelMap[titleProperty]} ${uiLabelMap.CommonFor} ${example.exampleName} [${exampleId}]</label></container>
+                                        <container style="button-bar">
+                                            <link target="EditExample" text="${uiLabelMap.ExampleNewExample}" style="buttontext create">
+                                                <image url-mode="raw" src="${iconsLocation}/add.png"/>
+                                            </link>
+                                            <link target="ExampleReportHtml" text="${uiLabelMap.CommonPrinterFriendly}" style="buttontext">
+                                                <parameter param-name="exampleId"/>
+                                                <image url-mode="raw" src="${iconsLocation}/printer.png"/>
+                                            </link>
+                                            <link target="ExampleReportPdf" text="${uiLabelMap.CommonPdf}" style="buttontext">
+                                                <parameter param-name="exampleId"/>
+                                                <image url-mode="raw" src="${iconsLocation}/page_white_acrobat.png"/>
+                                            </link>
+                                            <link target="help" text="${uiLabelMap.CommonHelp}" style="buttontext" target-window="_blank">
+                                                <parameter param-name="topic" value="ExampleEditHelp"/>
+                                                <image url-mode="raw" src="${iconsLocation}/help.png"/>
+                                            </link>
+                                        </container>
+                                    </widgets>
+                                    <fail-widgets>
+                                        <container style="h1"><label>${uiLabelMap.ExampleNewExample}</label></container>
+                                    </fail-widgets>
+                                </section>
+                                <decorator-section-include name="body"/>
+                            </widgets>
+                            <fail-widgets>
+                                <label style="h3">${uiLabelMap.ExampleViewPermissionError}</label>
+                            </fail-widgets>
+                        </section>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="CommonExampleFeatureDecorator">
+        <section>
+            <actions>
+                <set field="headerItem" value="ExampleFeature"/>
+                <set field="exampleFeatureId" from-field="parameters.exampleFeatureId"/>
+                <entity-one entity-name="ExampleFeature" value-field="exampleFeature"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="main-decorator" location="${mainDecoratorLocation}">
+                    <decorator-section name="pre-body">
+                        <section>
+                            <condition>
+                                <and>
+                                    <if-has-permission permission="EXAMPLE" action="_VIEW"/>
+                                    <not><if-empty field="exampleFeature"/></not>
+                                </and>
+                            </condition>
+                            <widgets>
+                                <include-menu name="EditExampleFeature" location="component://example/widget/example/ExampleMenus.xml"/>
+                            </widgets>
+                        </section>
+                    </decorator-section>
+                    <decorator-section name="body">
+                        <section>
+                            <!-- do check for EXAMPLE, _VIEW permission -->
+                            <condition>
+                                <if-has-permission permission="EXAMPLE" action="_VIEW"/>
+                            </condition>
+                            <widgets>
+                                <section>
+                                    <condition>
+                                        <not><if-empty field="exampleFeature"/></not>
+                                    </condition>
+                                    <widgets>
+                                        <container style="h1">
+                                            <label>${uiLabelMap[titleProperty]} ${uiLabelMap.CommonFor} ${exampleFeature.description} [${exampleFeatureId}]</label>
+                                        </container>
+                                        <container style="button-bar">
+                                            <link target="EditExampleFeature" text="${uiLabelMap.ExampleNewExampleFeature}" style="buttontext">
+                                                <image url-mode="raw" src="${iconsLocation}/add.png"/>
+                                            </link>
+                                        </container>
+                                    </widgets>
+                                    <fail-widgets>
+                                        <container style="h1"><label>${uiLabelMap.ExampleNewExampleFeature}</label></container>
+                                    </fail-widgets>
+                                </section>
+                                <decorator-section-include name="body"/>
+                            </widgets>
+                            <fail-widgets>
+                                <label style="h3">${uiLabelMap.ExampleViewPermissionError}</label>
+                            </fail-widgets>
+                        </section>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="CommonExampleGeoLocationDecorator">
+        <section>
+            <actions>
+                <set field="headerItem" value="ExampleGeoLocation"/>
+                <set field="geoChart.dataSourceId" value="GEOPT_GOOGLE"/>
+                <set field="geoChart.width" value="600px"/>
+                <set field="geoChart.height" value="500px"/>
+                <set field="geoChart.points" from-field="geoPoints"/>
+                <set field="geoChart.center" from-field="geoCenter"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="main-decorator" location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="pre-body">
+                        <include-menu name="ExampleGeoLocation" location="component://example/widget/example/ExampleMenus.xml"/>
+                    </decorator-section>
+                    <decorator-section name="body">
+                        <container style="clear" />
+                        <include-screen name="geoChart" location="component://common/widget/CommonScreens.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="CommonExampleOsmGeoLocationDecorator">
+        <section>
+            <actions>
+                <set field="headerItem" value="ExampleGeoLocation"/>
+                <set field="geoChart.dataSourceId" value="GEOPT_OSM"/>
+                <set field="geoChart.width" value="600px"/>
+                <set field="geoChart.height" value="500px"/>
+                <set field="geoChart.points" from-field="geoPoints"/>
+                <set field="geoChart.center" from-field="geoCenter"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="main-decorator" location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="pre-body">
+                        <include-menu name="ExampleGeoLocation" location="component://example/widget/example/ExampleMenus.xml"/>
+                    </decorator-section>
+                    <decorator-section name="body">
+                        <container style="clear" />
+                        <include-screen name="geoChart" location="component://common/widget/CommonScreens.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="CommonBirtDecorator">
+        <section>
+            <actions>
+                <set field="headerItem" value="Birt"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="main-decorator" location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="pre-body">
+                        <section>
+                            <!-- do check for WEBTOOLS, _VIEW permission -->
+                            <condition>
+                                <if-has-permission permission="ENTITY_MAINT"/>
+                            </condition>
+                            <widgets>
+                                <include-menu name="BirtTabBar" location="component://example/widget/example/ExampleMenus.xml"/>
+                            </widgets>
+                        </section>
+                    </decorator-section>
+                    <decorator-section name="body">
+                        <container style="clear" />
+                        <section>
+                            <!-- do check for WEBTOOLS, _VIEW permission -->
+                            <condition>
+                                <if-has-permission permission="ENTITY_MAINT"/>
+                            </condition>
+                            <widgets>
+                                <decorator-section-include name="body"/>
+                            </widgets>
+                            <fail-widgets>
+                                <label style="h3">${uiLabelMap.WebtoolsPermissionError}</label>
+                            </fail-widgets>
+                        </section>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="CommonExampleChartsDecorator">
+        <section>
+            <actions>
+                <set field="headerItem" value="ExampleCharts"/>
+                <entity-condition entity-name="ExampleCountByType" list="chartData">
+                    <order-by field-name="exampleTypeId"/>
+                </entity-condition>
+                <set field="labelFieldName" value="exampleTypeId"/>
+                <set field="dataFieldName" value="total"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="main-decorator" location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="pre-body">
+                        <include-menu name="ExampleCharts" location="component://example/widget/example/ExampleMenus.xml"/>
+                    </decorator-section>
+                    <decorator-section name="body">
+                        <container style="clear" />
+                        <include-screen name="FlotChart" location="component://common/widget/flotScreens.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="CommonExampleJackrabbitDecorator">
+        <section>
+            <actions>
+                <set field="headerItem" value="ExampleJackrabbit" />
+                <set field="labelFieldName" value="exampleTypeId" />
+                <set field="dataFieldName" value="total" />
+            </actions>
+            <widgets>
+                <decorator-screen name="main-decorator"
+                    location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="pre-body">
+                        <include-menu name="ExampleJackrabbit" location="component://example/widget/example/ExampleMenus.xml"/>
+                    </decorator-section>
+                    <decorator-section name="body">
+                        <container style="clear" />
+                        <section>
+                            <widgets>
+                                <decorator-section-include name="body" />
+                            </widgets>
+                        </section>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="main">
+        <!-- This is the screen for the Main page in the Example component. A common pattern
+            in OFBiz is to have each component include a Main page as a starting point for
+            the user. -->
+        <section>
+            <actions>
+                <set field="tabButtonItem" value="main"/>
+            </actions>
+            <widgets>
+                 <include-screen name="FindExample" location="component://example/widget/example/ExampleScreens.xml"/>
+            </widgets>
+        </section>
+    </screen>
+
+</screens>
diff --git a/framework/example/widget/example/ExampleAjaxScreens.xml b/framework/example/widget/example/ExampleAjaxScreens.xml
new file mode 100644
index 0000000..fcb0b38
--- /dev/null
+++ b/framework/example/widget/example/ExampleAjaxScreens.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<screens xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/widget-screen.xsd">
+
+    <screen name="AjaxExample">
+        <section>
+            <actions>
+                <set field="headerItem" value="AjaxExample"/>
+                <set field="titleProperty" value="PageTitleFindExample"/>
+                <set field="exampleCtx" from-field="parameters"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="main-decorator" location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="body">
+                        <section>
+                            <condition>
+                                <if-has-permission permission="EXAMPLE" action="_VIEW"/>
+                            </condition>
+                            <widgets>
+                                <container style="h1"><label>${uiLabelMap[titleProperty]}</label></container>
+                                <section>
+                                    <condition>
+                                        <if-compare field="javaScriptEnabled" value="true" operator="equals"/>
+                                    </condition>
+                                    <widgets/>
+                                    <fail-widgets>
+                                        <container style="button-bar"><label>${uiLabelMap.ExampleAjaxIntro}</label></container>
+                                    </fail-widgets>
+                                </section>
+                                <container id="ListExamplesAjax">
+                                    <include-screen name="ListExampleFormOnly"/>
+                                </container>
+                                <container style="h2"><label>${uiLabelMap.ExampleNewExample}</label></container>
+                                <container id="EditExampleAjax">
+                                    <include-screen name="CreateExampleFormOnly"/>
+                                </container>
+                            </widgets>
+                            <fail-widgets>
+                                <label style="h3">${uiLabelMap.ExampleViewPermissionError}</label>
+                            </fail-widgets>
+                        </section>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="ListExampleFormOnly">
+        <section>
+            <condition>
+                <if-has-permission permission="EXAMPLE" action="_VIEW"/>
+            </condition>
+            <actions>
+                <!-- NOTE: these are needed because this may be run as a top level screen and would have no decorator -->
+                <property-map resource="ExampleUiLabels" map-name="uiLabelMap" global="true"/>
+                <property-map resource="CommonUiLabels" map-name="uiLabelMap" global="true"/>
+            </actions>
+            <widgets>
+                <include-form name="ListExamplesAjax" location="component://example/widget/example/ExampleForms.xml"/>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="CreateExampleFormOnly">
+        <section>
+            <condition>
+                <if-has-permission permission="EXAMPLE" action="_VIEW"/>
+            </condition>
+            <actions>
+                <!-- these are only needed so that when bsh evaluates use-when attributes these will exist and not cause an error -->
+                <property-map resource="ExampleUiLabels" map-name="uiLabelMap" global="true"/>
+                <property-map resource="CommonUiLabels" map-name="uiLabelMap" global="true"/>
+                <set field="exampleId" from-field="parameters.exampleId"/>
+                <entity-one entity-name="Example" value-field="example"/>
+            </actions>
+            <widgets>
+                <include-form name="EditExampleBackgroundSubmit" location="component://example/widget/example/ExampleForms.xml"/>
+            </widgets>
+        </section>
+    </screen>
+
+</screens>
diff --git a/framework/example/widget/example/ExampleFeatureForms.xml b/framework/example/widget/example/ExampleFeatureForms.xml
new file mode 100644
index 0000000..85b081a
--- /dev/null
+++ b/framework/example/widget/example/ExampleFeatureForms.xml
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<forms xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/widget-form.xsd">
+
+    <form name="FindExampleFeatures" type="single" target="FindExampleFeature" default-entity-name="ExampleFeature">
+        <field name="noConditionFind"><hidden value="Y"/><!-- if this isn't there then with all fields empty no query will be done --></field>
+        <field name="exampleFeatureId" title="${uiLabelMap.ExampleExampleFeatureId}"><text-find/></field>
+        <field name="description" title="${uiLabelMap.CommonDescription}"><text-find/></field>
+        <field name="searchButton" title="${uiLabelMap.CommonFind}" widget-style="smallSubmit"><submit button-type="button"/></field>
+    </form>
+
+
+    <form name="ListExampleFeatures" type="list" list-name="listIt" paginate-target="FindExampleFeature" default-entity-name="ExampleFeature"
+        separate-columns="true" odd-row-style="alternate-row" header-row-style="header-row-2" default-table-style="basic-table hover-bar">
+        <actions>
+            <service service-name="performFind" result-map="result" result-map-list="listIt">
+                <field-map field-name="inputFields" from-field="exampleFeatureCtx"/>
+                <field-map field-name="entityName" value="ExampleFeature"/>
+                <field-map field-name="viewIndex" from-field="viewIndex"/>
+                <field-map field-name="viewSize" from-field="viewSize"/>
+            </service>
+        </actions>
+        <field name="exampleFeatureId" title="${uiLabelMap.ExampleExampleFeatureId}" widget-style="buttontext">
+            <hyperlink also-hidden="false" description="${exampleFeatureId}" target="EditExampleFeature">
+                <parameter param-name="exampleFeatureId"/>
+            </hyperlink>
+        </field>
+        <field name="description" title="${uiLabelMap.CommonDescription}"><display/></field>
+    </form>
+
+    <form name="EditExampleFeature" type="single" target="updateExampleFeature" title="" default-map-name="exampleFeature">
+        <actions>
+            <entity-one entity-name="StatusItem" value-field="currentStatus" auto-field-map="false">
+                <field-map field-name="statusId" from-field="example.statusId"/>
+            </entity-one>
+        </actions>
+        <alt-target use-when="exampleFeature==null" target="createExampleFeature"/>
+        <auto-fields-service service-name="updateExampleFeature"/>
+        <field use-when="exampleFeature!=null" name="exampleFeatureId" title="${uiLabelMap.ExampleExampleFeatureId}" tooltip="${uiLabelMap.CommonNotModifRecreat}"><display/></field>
+        <field use-when="exampleFeature==null @and exampleFeatureId==null" name="exampleFeatureId" title="${uiLabelMap.ExampleExampleFeatureId}"><ignored/></field>
+        <field use-when="exampleFeature==null @and exampleFeatureId!=null" name="exampleFeatureId" title="${uiLabelMap.ExampleExampleFeatureId}"><display description="${uiLabelMap.CommonCannotBeFound}: [${exampleFeatureId}]" also-hidden="false"/></field>
+        <field name="description" title="${uiLabelMap.CommonDescription}"/>
+        <field name="featureSourceEnumId" title="${uiLabelMap.ExampleFeatureSource}">
+            <drop-down allow-empty="false">
+                <entity-options entity-name="Enumeration" key-field-name="enumId" description="${description} [${enumCode}]">
+                    <entity-constraint name="enumTypeId" value="EXMPL_FEAT_SOURCE"/>
+                    <entity-order-by field-name="sequenceId"/>
+                </entity-options>
+            </drop-down>
+        </field>
+        <field name="submitButton" use-when="exampleFeature==null" title="${uiLabelMap.CommonCreate}"><submit button-type="button"/></field>
+        <field name="submitButton" use-when="exampleFeature!=null" title="${uiLabelMap.CommonUpdate}"><submit button-type="button"/></field>
+    </form>
+
+    <!-- ExampleFeatureAppl -->
+    <form name="ListExampleFeatureAppls" type="list"  list-name="exampleFeatureAppls"  target="feature_updateExampleFeatureAppl">
+        <actions>
+            <entity-condition entity-name="ExampleFeatureAppl">
+                <condition-expr field-name="exampleFeatureId" from-field="exampleFeatureId"/>
+                <order-by field-name="sequenceNum"/>
+            </entity-condition>
+        </actions>
+        <auto-fields-service service-name="updateExampleFeatureAppl"/>
+        <field name="exampleId" title="${uiLabelMap.ExampleExample}">
+            <display-entity entity-name="Example" description="${exampleName}">
+                <sub-hyperlink target="EditExample" description="${exampleId}" link-style="buttontext">
+                    <parameter param-name="exampleId"/>
+                </sub-hyperlink>
+            </display-entity>
+        </field>
+        <field name="exampleFeatureId"><hidden/></field>
+        <field name="fromDate"><display/></field>
+        <field name="exampleFeatureApplTypeId" title="${uiLabelMap.CommonType}">
+            <drop-down allow-empty="true">
+                <entity-options entity-name="ExampleFeatureApplType" description="${description}">
+                    <entity-order-by field-name="description"/>
+                </entity-options>
+            </drop-down>
+        </field>
+        <field name="submitButton" title="${uiLabelMap.CommonUpdate}"><submit button-type="button"/></field>
+        <field name="deleteLink" title="" widget-style="buttontext">
+            <hyperlink target="feature_deleteExampleFeatureAppl" description="${uiLabelMap.CommonDelete}" also-hidden="false">
+                <parameter param-name="exampleId"/>
+                <parameter param-name="exampleFeatureId"/>
+                <parameter param-name="fromDate"/>
+            </hyperlink>
+        </field>
+    </form>
+
+    <form name="AddExampleFeatureAppl" type="single" target="feature_createExampleFeatureAppl" title="">
+        <auto-fields-service service-name="createExampleFeatureAppl"/>
+        <field name="exampleId" title="${uiLabelMap.ExampleExample}">
+            <drop-down allow-empty="false">
+                <entity-options entity-name="Example" description="${exampleName} [${exampleId}]">
+                    <entity-order-by field-name="exampleName"/>
+                </entity-options>
+            </drop-down>
+        </field>
+        <field name="exampleFeatureId"><hidden/></field>
+        <field name="exampleFeatureApplTypeId" title="${uiLabelMap.CommonType}">
+            <drop-down allow-empty="true">
+                <entity-options entity-name="ExampleFeatureApplType" description="${description}">
+                    <entity-order-by field-name="description"/>
+                </entity-options>
+            </drop-down>
+        </field>
+        <field name="submitButton" title="${uiLabelMap.CommonAdd}"><submit button-type="button"/></field>
+    </form>
+
+    <form name="LookupFindExampleFeature" target="LookupExampleFeature" title="" type="single">
+        <auto-fields-entity entity-name="ExampleFeature" default-field-type="find"/>
+        <field name="exampleFeatureId" title="${uiLabelMap.ExampleExampleFeatureId}"/> <!-- <text-find/> -->
+        <field name="featureSourceEnumId" title="${uiLabelMap.ExampleFeatureSource}">
+            <drop-down allow-empty="true">
+                <entity-options entity-name="Enumeration" key-field-name="enumId" description="${description} [${enumCode}]">
+                    <entity-constraint name="enumTypeId" value="EXMPL_FEAT_SOURCE"/>
+                    <entity-order-by field-name="sequenceId"/>
+                </entity-options>
+            </drop-down>
+        </field>
+        <field name="description" title="${uiLabelMap.CommonDescription}"/>
+        <field name="noConditionFind"><hidden value="Y"/><!-- if this isn't there then with all fields empty no query will be done --></field>
+        <field name="submitButton" title="${uiLabelMap.CommonFind}"><submit button-type="button"/></field>
+    </form>
+
+    <form name="LookupListExampleFeature" list-name="listIt" title="" type="list"
+        paginate-target="LookupExampleFeature">
+        <actions>
+            <service service-name="performFind" result-map="result" result-map-list="listIt">
+                <field-map field-name="inputFields" from-field="parameters"/>
+                <field-map field-name="orderBy" value="description"/>
+                <field-map field-name="entityName" value="ExampleFeature"/>
+                <field-map field-name="viewIndex" from-field="viewIndex"/>
+                <field-map field-name="viewSize" from-field="viewSize"/>
+            </service>
+        </actions>
+        <!--<auto-fields-entity entity-name="ExampleFeature" default-field-type="display"/>-->
+        <field name="exampleFeatureId" title="${uiLabelMap.ExampleExampleFeatureId}" widget-style="buttontext">
+            <hyperlink description="${exampleFeatureId}" also-hidden="false" target-type="plain" target="javascript:set_value('${exampleFeatureId}')"/>
+        </field>
+        <field name="featureSourceEnumId" title="${uiLabelMap.ExampleFeatureSource}">
+            <display-entity entity-name="Enumeration" key-field-name="enumId" description="${description} [${enumCode}]" also-hidden="false"/>
+        </field>
+        <field name="description" title="${uiLabelMap.CommonDescription}"><display also-hidden="false"/></field>
+    </form>
+
+</forms>
diff --git a/framework/example/widget/example/ExampleFeatureScreens.xml b/framework/example/widget/example/ExampleFeatureScreens.xml
new file mode 100644
index 0000000..19d98ca
--- /dev/null
+++ b/framework/example/widget/example/ExampleFeatureScreens.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<screens xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/widget-screen.xsd">
+
+    <!-- list all examplefeatures in a tabular format -->
+    <screen name="FindExampleFeature">
+        <section>
+            <actions>
+                <set field="headerItem" value="ExampleFeature"/>
+                <set field="titleProperty" value="PageTitleFindExampleFeature"/>
+                <set field="exampleFeatureCtx" from-field="parameters"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="main-decorator" location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="body">
+                        <section>
+                            <condition>
+                                <if-has-permission permission="EXAMPLE" action="_VIEW"/>
+                            </condition>
+                            <widgets>
+                                <decorator-screen name="FindScreenDecorator" location="component://common/widget/CommonScreens.xml">
+                                    <decorator-section name="menu-bar">
+                                        <container style="button-bar"><link target="EditExampleFeature" text="${uiLabelMap.ExampleNewExampleFeature}" style="buttontext create"/></container>
+                                    </decorator-section>
+                                    <decorator-section name="search-options">
+                                        <include-form name="FindExampleFeatures" location="component://example/widget/example/ExampleFeatureForms.xml"/>
+                                    </decorator-section>
+                                    <decorator-section name="search-results">
+                                        <include-form name="ListExampleFeatures" location="component://example/widget/example/ExampleFeatureForms.xml"/>
+                                    </decorator-section>
+                                </decorator-screen>
+                            </widgets>
+                            <fail-widgets>
+                                <label style="h3">${uiLabelMap.ExampleViewPermissionError}</label>
+                            </fail-widgets>
+                        </section>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="EditExampleFeature">
+        <section>
+            <actions>
+                <set field="titleProperty" value="PageTitleEditExampleFeature"/>
+                <set field="tabButtonItem" value="EditExampleFeature"/>
+                <set field="exampleFeatureId" from-field="parameters.exampleFeatureId"/>
+                <entity-one entity-name="ExampleFeature" value-field="exampleFeature"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="CommonExampleFeatureDecorator" location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="body">
+                        <include-form name="EditExampleFeature" location="component://example/widget/example/ExampleFeatureForms.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="EditExampleFeatureExampleAppls">
+        <section>
+            <actions>
+                <set field="titleProperty" value="PageTitleEditExampleFeatureExampleAppls"/>
+                <set field="tabButtonItem" value="EditExampleFeatureExampleAppls"/>
+                <set field="exampleFeatureId" from-field="parameters.exampleFeatureId"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="CommonExampleFeatureDecorator" location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="body">
+                        <include-form name="ListExampleFeatureAppls" location="component://example/widget/example/ExampleFeatureForms.xml"/>
+                        <include-form name="AddExampleFeatureAppl" location="component://example/widget/example/ExampleFeatureForms.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="LookupExampleFeature">
+        <section>
+            <condition>
+                <if-has-permission permission="EXAMPLE" action="_VIEW"/>
+            </condition>
+            <actions>
+                <property-map resource="ExampleUiLabels" map-name="uiLabelMap" global="true"/>
+                <set field="title" value="${uiLabelMap.PageTitleLookupExampleFeature}"/>
+                <set field="queryString" from-field="result.queryString"/>
+                <set field="viewIndex" from-field="parameters.VIEW_INDEX" type="Integer"/>
+                <set field="viewSize" from-field="parameters.VIEW_SIZE" type="Integer" default-value="10"/>
+                
+                <!-- entries needed for lookup ajax auto completer -->
+                <!-- required: entity to search in -->
+                <set field="entityName" value="ExampleFeature"/>
+
+                <!-- required: fields to search a match -->
+                <set field="searchFields" value="[exampleFeatureId, description]"/>
+                
+                <!-- optional: field to return after user selection, default is first element of searchFields -->
+                <!-- return field might be hidden based on widget.autocompleter.displayReturnField property in widget.properties -->
+                <!--set field="returnField" value="exampleFeatureId"/-->
+
+                <!-- optional: fields to display, default are searchFields -->
+                <!--set field="displayFields" value="[exampleFeatureId, description]"/-->
+                
+            </actions>
+
+            <widgets>
+                <decorator-screen name="LookupDecorator" location="component://common/widget/CommonScreens.xml">
+                    <decorator-section name="search-options">
+                        <include-form name="LookupFindExampleFeature" location="component://example/widget/example/ExampleFeatureForms.xml"/>
+                    </decorator-section>
+                    <decorator-section name="search-results">
+                        <include-form name="LookupListExampleFeature" location="component://example/widget/example/ExampleFeatureForms.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+</screens>
diff --git a/framework/example/widget/example/ExampleForms.xml b/framework/example/widget/example/ExampleForms.xml
new file mode 100644
index 0000000..5c7b955
--- /dev/null
+++ b/framework/example/widget/example/ExampleForms.xml
@@ -0,0 +1,252 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<forms xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/widget-form.xsd">
+
+    <form name="FindExamples" type="single" target="FindExample" default-entity-name="Example">
+        <field name="noConditionFind"><hidden value="Y"/><!-- if this isn't there then with all fields empty no query will be done --></field>
+        <field name="exampleId" title="${uiLabelMap.ExampleExampleId}"><text-find/></field>
+        <field name="exampleName" title="${uiLabelMap.CommonName}"><text-find/></field>
+        <field name="exampleTypeId" title="${uiLabelMap.CommonType}">
+            <drop-down allow-empty="true" current-description="">
+                <entity-options description="${description}" key-field-name="exampleTypeId" entity-name="ExampleType">
+                    <entity-order-by field-name="description"/>
+                </entity-options>
+            </drop-down>
+        </field>
+        <field name="statusId" title="${uiLabelMap.CommonStatus}">
+            <drop-down allow-empty="true" current-description="">
+                <entity-options description="${description}" key-field-name="statusId" entity-name="ExampleStatusItem"/>
+            </drop-down>
+        </field>
+        <field name="searchButton" title="${uiLabelMap.CommonFind}" widget-style="smallSubmit"><submit button-type="button" image-location="/images/icons/magnifier.png"/></field>
+    </form>
+
+    <form name="ListExamples" type="list" list-name="listIt" paginate-target="FindExample" default-entity-name="Example" separate-columns="true"
+        odd-row-style="alternate-row" header-row-style="header-row-2" default-table-style="basic-table hover-bar">
+        <actions>
+            <service service-name="performFind" result-map="result" result-map-list="listIt">
+                <field-map field-name="inputFields" from-field="exampleCtx"/>
+                <field-map field-name="entityName" value="Example"/>
+                <field-map field-name="orderBy" from-field="parameters.sortField"/>
+                <field-map field-name="viewIndex" from-field="viewIndex"/>
+                <field-map field-name="viewSize" from-field="viewSize"/>
+            </service>
+        </actions>
+        <alt-row-style use-when="&quot;EXST_APPROVED&quot;.equals(statusId)" style="Validate"/>
+        <alt-row-style use-when="&quot;EXST_CANCELLED&quot;.equals(statusId)" style="Warn"/>
+        <field name="exampleId" title="${uiLabelMap.ExampleExampleId}" widget-style="buttontext">
+            <hyperlink also-hidden="false" description="${exampleId}" target="EditExample">
+                <parameter param-name="exampleId"/>
+            </hyperlink>
+        </field>
+        <field name="exampleName" title="${uiLabelMap.CommonName}" sort-field="true"><display/></field>
+        <field name="exampleTypeId" title="${uiLabelMap.CommonType}"><display-entity entity-name="ExampleType"/></field>
+        <field name="statusId" title="${uiLabelMap.CommonStatus}"><display-entity entity-name="StatusItem"/></field>
+        <field name="description" title="${uiLabelMap.CommonDescription}" sort-field="true"><display/></field>
+    </form>
+
+    <!-- Typically, this extended form wouldn't be necessary. The parent form (ListExamples) would
+        have these attributes.
+         For the Ajax example we want all example entities listed, so the we use the entity-condition
+         instead of the performFind service. -->
+    <form name="ListExamplesAjax" extends="ListExamples" type="list" paginate-target="authview/findExampleAjax">
+        <actions>
+            <entity-condition entity-name="Example"><order-by field-name="exampleName"/></entity-condition>
+        </actions>
+        <field name="exampleName" title="${uiLabelMap.CommonName}" id-name="exampleName">
+            <display>
+                <in-place-editor url="/example/control/updateExample" cancel-control="button" saving-text="Updating..." text-between-controls=" ">
+                    <simple-editor/>
+                    <field-map field-name="exampleId" from-field="exampleId"/>
+                    <field-map field-name="statusId"  from-field="statusId"/>
+                </in-place-editor>
+            </display>
+        </field>
+        <field name="description" title="${uiLabelMap.CommonDescription}" id-name="description">
+            <display>
+                <in-place-editor url="/example/control/updateExample" cancel-control="button" saving-text="Updating..." text-between-controls=" ">
+                    <simple-editor/>
+                    <field-map field-name="exampleId" from-field="exampleId"/>
+                    <field-map field-name="statusId"  from-field="statusId"/>
+                </in-place-editor>
+            </display>
+        </field>
+        <on-event-update-area event-type="paginate" area-id="ListExamplesAjax" area-target="ListExampleFormOnly"/>
+    </form>
+
+    <form name="EditExample" type="single" target="updateExample" title="" default-map-name="example" default-entity-name="Example">
+        <actions>
+            <entity-one entity-name="StatusItem" value-field="currentStatus" auto-field-map="false">
+                <field-map field-name="statusId" from-field="example.statusId"/>
+            </entity-one>
+        </actions>
+        <alt-target use-when="example==null" target="createExample"/>
+        <auto-fields-service service-name="updateExample"/>
+        <field use-when="example!=null" name="exampleId" title="${uiLabelMap.ExampleExampleId}" tooltip="${uiLabelMap.CommonNotModifRecreat}"><display/></field>
+        <field use-when="example==null @and exampleId==null" name="exampleId" title="${uiLabelMap.ExampleExampleId}"><ignored/></field>
+        <field use-when="example==null @and exampleId!=null" name="exampleId" title="${uiLabelMap.ExampleExampleId}"><display description="${uiLabelMap.CommonCannotBeFound}: [${exampleId}]" also-hidden="false"/></field>
+        <field name="exampleTypeId" title="${uiLabelMap.CommonType}" id-name="exampleTypeId" widget-style="required">
+            <drop-down allow-empty="false">
+                <!-- this is a neat feature, but not good for the type because the user would have to know the possible types in order to enter at least the first letter, so leaving it out by default; just uncomment to enable: <auto-complete/> -->
+                <entity-options entity-name="ExampleType" description="${description}">
+                    <entity-order-by field-name="description"/>
+                </entity-options>
+            </drop-down>
+        </field>
+        <field name="statusId"  use-when="example==null" title="${uiLabelMap.CommonStatus}" widget-style="required">
+            <drop-down allow-empty="false">
+                <entity-options entity-name="ExampleStatusItem" description="${description}"/>
+            </drop-down>
+        </field>
+        <field name="statusId" use-when="example!=null" title="${uiLabelMap.CommonStatus}" widget-style="required">
+            <drop-down allow-empty="false" current-description="${currentStatus.description}">
+                <entity-options entity-name="StatusValidChangeToDetail" key-field-name="statusIdTo" description="${transitionName} (${description})">
+                    <entity-constraint name="statusId" env-name="example.statusId"/>
+                </entity-options>
+            </drop-down>
+        </field>
+        <field name="exampleName" required-field="true" widget-style="required"></field>
+        <field name="description" title="${uiLabelMap.CommonDescription}"/>
+        <field name="longDescription" title="${uiLabelMap.ExampleLongDescription}"/>
+        <field name="anotherText">
+            <drop-down allow-empty="true">
+                <option key="Explicit Option" description="${uiLabelMap.ExampleExplicitOption}"/>
+                <entity-options entity-name="ExampleType" description="${description}" key-field-name="exampleTypeId">
+                    <entity-order-by field-name="description"/>
+                </entity-options>
+            </drop-down>
+        </field>
+        <field name="displayAnotherText" use-when="example!=null @and example.get(&quot;anotherText&quot;)!=null">
+            <display description="${example.anotherText}"/>
+        </field>
+        <field name="submitButton" use-when="example==null" title="${uiLabelMap.CommonCreate}"><submit button-type="button"/></field>
+        <field name="submitButton" use-when="example!=null" title="${uiLabelMap.CommonUpdate}"><submit button-type="button"/></field>
+    </form>
+
+    <!-- Typically, this extended form wouldn't be necessary. The parent form (EditExample) would
+        have these settings. -->
+    <form name="EditExampleBackgroundSubmit" type="single" extends="EditExample" target="updateExampleAjax">
+        <alt-target use-when="example==null" target="createExampleAjax"/>
+        <field name="statusId" use-when="example==null" title="${uiLabelMap.CommonStatus}" id-name="statusId">
+            <drop-down allow-empty="false">
+                <entity-options entity-name="ExampleStatusItem" description="${description}"/>
+            </drop-down>
+        </field>
+        <on-event-update-area event-type="submit" area-id="ListExamplesAjax" area-target="ListExampleFormOnly"/>
+        <!--on-event-update-area event-type="submit" area-id="EditExampleAjax" area-target="CreateExampleFormOnly"/--><!-- JLR: this does not seem to be useful -->
+    </form>
+
+    <!-- ExampleItem -->
+    <form name="ListExampleItems" type="list"  list-name="exampleItems"  target="updateExampleItem">
+        <actions>
+            <entity-condition entity-name="ExampleItem">
+                <condition-expr field-name="exampleId" from-field="exampleId"/>
+                <order-by field-name="exampleItemSeqId"/>
+            </entity-condition>
+        </actions>
+        <auto-fields-service service-name="updateExampleItem"/>
+        <field name="exampleId"><hidden/></field>
+        <field name="exampleItemSeqId" title="${uiLabelMap.CommonItem}"><display/></field>
+        <field name="description"><text size="30"/></field>
+        <field name="amountUomId" title="${uiLabelMap.CommonUom}">
+            <drop-down allow-empty="true">
+                <entity-options entity-name="UomAndType" key-field-name="uomId" description="${typeDescription}: ${description} (${abbreviation})">
+                    <entity-order-by field-name="typeDescription"/>
+                    <entity-order-by field-name="description"/>
+                </entity-options>
+            </drop-down>
+        </field>
+        <field name="deleteLink" title="${uiLabelMap.CommonEmptyHeader}" widget-style="buttontext">
+            <hyperlink target="deleteExampleItem" description="${uiLabelMap.CommonDelete}" also-hidden="false" confirmation-message="${uiLabelMap.CommonConfirmDelete}" image-location="${iconsLocation}/delete.png">
+                <parameter param-name="exampleId"/>
+                <parameter param-name="exampleItemSeqId"/>
+            </hyperlink>
+        </field>
+        <field name="submitButton" title="${uiLabelMap.CommonUpdate}"><submit button-type="button"/></field>
+    </form>
+
+    <form name="AddExampleItem" type="single" target="createExampleItem" title="">
+        <auto-fields-service service-name="createExampleItem"/>
+        <field name="exampleId"><hidden/></field>
+        <field name="exampleItemSeqId"><ignored/><!-- this will be auto-sequenced --></field>
+        <field name="amountUomId" title="${uiLabelMap.CommonUom}">
+            <drop-down allow-empty="true">
+                <entity-options entity-name="UomAndType" key-field-name="uomId" description="${typeDescription}: ${description} (${abbreviation})">
+                    <entity-order-by field-name="typeDescription"/>
+                    <entity-order-by field-name="description"/>
+                </entity-options>
+            </drop-down>
+        </field>
+        <field name="submitButton" title="${uiLabelMap.CommonAdd}"><submit button-type="button" request-confirmation="true"/></field>
+    </form>
+
+    <!-- ExampleFeatureAppl -->
+    <form name="ListExampleFeatureAppls" type="list"  list-name="exampleFeatureAppls"  target="example_updateExampleFeatureAppl">
+        <actions>
+            <entity-condition entity-name="ExampleFeatureAppl">
+                <condition-expr field-name="exampleId" from-field="exampleId"/>
+                <order-by field-name="sequenceNum"/>
+            </entity-condition>
+        </actions>
+        <auto-fields-service service-name="updateExampleFeatureAppl"/>
+        <field name="exampleId"><hidden/></field>
+        <field name="exampleFeatureId" title="${uiLabelMap.ExampleFeature}">
+            <display-entity entity-name="ExampleFeature" description="${description}">
+                <sub-hyperlink target="EditExampleFeature" description="${exampleFeatureId}" link-style="buttontext">
+                    <parameter param-name="exampleFeatureId"/>
+                </sub-hyperlink>
+            </display-entity>
+        </field>
+        <field name="fromDate"><display/></field>
+        <field name="exampleFeatureApplTypeId" title="${uiLabelMap.CommonType}">
+            <drop-down allow-empty="false">
+                <entity-options entity-name="ExampleFeatureApplType" description="${description}">
+                    <entity-order-by field-name="description"/>
+                </entity-options>
+            </drop-down>
+        </field>
+        <field name="submitButton" title="${uiLabelMap.CommonUpdate}"><submit button-type="button"/></field>
+        <field name="deleteLink" title="${uiLabelMap.CommonEmptyHeader}" widget-style="buttontext">
+            <hyperlink target="example_deleteExampleFeatureAppl" description="${uiLabelMap.CommonDelete}" also-hidden="false" image-location="${iconsLocation}/delete.png">
+                <parameter param-name="exampleId"/>
+                <parameter param-name="exampleFeatureId"/>
+                <parameter param-name="fromDate"/>
+            </hyperlink>
+        </field>
+    </form>
+
+    <form name="AddExampleFeatureAppl" type="single" target="example_createExampleFeatureAppl" title="">
+        <auto-fields-service service-name="createExampleFeatureAppl"/>
+        <field name="exampleId"><hidden/></field>
+        <field name="exampleFeatureId" title="${uiLabelMap.ExampleFeature}">
+            <lookup target-form-name="LookupExampleFeature"/>
+        </field>
+        <field name="exampleFeatureApplTypeId" title="${uiLabelMap.CommonType}">
+            <drop-down allow-empty="false">
+                <entity-options entity-name="ExampleFeatureApplType" description="${description}">
+                    <entity-order-by field-name="description"/>
+                </entity-options>
+            </drop-down>
+        </field>
+        <field name="submitButton" title="${uiLabelMap.CommonAdd}"><submit button-type="button"/></field>
+    </form>
+</forms>
diff --git a/framework/example/widget/example/ExampleJackrabbitForms.xml b/framework/example/widget/example/ExampleJackrabbitForms.xml
new file mode 100644
index 0000000..f65e447
--- /dev/null
+++ b/framework/example/widget/example/ExampleJackrabbitForms.xml
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<!--

+Licensed to the Apache Software Foundation (ASF) under one

+or more contributor license agreements.  See the NOTICE file

+distributed with this work for additional information

+regarding copyright ownership.  The ASF licenses this file

+to you 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.

+-->

+

+<forms xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/widget-form.xsd">

+

+    <form name="ListRepositoryData" type="list" list-name="repositoryContent" separate-columns="true" odd-row-style="alternate-row" header-row-style="header-row-2" default-table-style="basic-table hover-bar">

+        <field name="path">

+            <hyperlink target="EditRepositoryContent" description="${path}">

+                <parameter param-name="contentId" from-field="contentId" />

+                <parameter param-name="path" from-field="path" />

+            </hyperlink>

+        </field>

+        <field name="contentId">

+            <hyperlink target="EditRepositoryContent" description="${contentId}">

+                <parameter param-name="contentId" from-field="contentId" />

+                <parameter param-name="path" from-field="path" />

+            </hyperlink>

+        </field>

+        <field name="contentTypeId">

+            <display />

+        </field>

+        <field name="statusId">

+            <display />

+        </field>

+        <field name="statusId">

+            <display />

+        </field>

+    </form>

+

+    <form name="SelectContentObject" type="single" target="">

+        <field name="contentDropDown" position="1">

+            <drop-down ><list-options key-name="contentList" description="${contentList}" list-name="parameters.contentList" list-entry-name="contentList"/></drop-down>

+        </field>

+

+        <!--

+        <field name="languageDropDown" position="2" title="">

+            <drop-down><list-options key-name="languageList" list-name="parameters.languageList"/></drop-down>

+        </field>

+        -->

+        <field name="submit" position="2"><submit/></field>

+    </form>

+

+    <form name="AddRepositoryData" type="single" target="StoreNewRepositoryData">

+        <field name="path" title="${uiLabelMap.ExampleRepositoryNode}" tooltip="${uiLabelMap.ExampleAddNewNodePath}">

+            <text />

+        </field>

+        <field name="msgLocale" title="${uiLabelMap.CommonChooseLanguage}" >

+            <drop-down allow-empty="true" ><list-options key-name="localeId" list-name="parameters.localeList" description="${localeId}"/></drop-down>

+        </field>

+        <field name="title">

+            <text />

+        </field>

+        <field name="message" title="${uiLabelMap.ExampleRepositoryMessage}">

+            <textarea visual-editor-enable="true" />

+        </field>

+        <field name="submit">

+            <submit />

+        </field>

+    </form>

+

+    <form name="UploadRepositoryFileData" type="upload" target="StoreNewRepositoryFileData">

+        <field name="path" title="${uiLabelMap.ExampleRepositoryFolder}" tooltip="${uiLabelMap.ExampleAddNewNodePath}">

+            <text></text>

+        </field>

+        <field name="fileData" title="${uiLabelMap.ExampleRepositoryFile}">

+            <file size="28"></file>

+        </field>

+        <field name="fileLocale" title="${uiLabelMap.CommonChooseLanguage}" >

+            <drop-down allow-empty="true" ><list-options key-name="localeId" list-name="parameters.localeList" description="${localeId}"/></drop-down>

+        </field>

+        <field name="description"><textarea cols="30"/></field>

+        <field name="submit">

+            <submit />

+        </field>

+    </form>

+

+    <form name="EditRepositoryDataChangeLanguage" type="single" target="EditRepositoryContent" default-entity-name="Content">

+        <field name="path" title="${uiLabelMap.ExampleRepositoryNode}" map-name="content">

+            <hidden />

+        </field>

+        <field name="language" title="${uiLabelMap.CommonChooseLanguage}" >

+            <drop-down allow-empty="false" current="first-in-list" current-description="${parameters.selectedLanguage}"><list-options key-name="languageList" description="${languageList}" list-name="parameters.languageList" list-entry-name="languageList"/></drop-down>

+        </field>

+        <field name="versions" >

+            <drop-down allow-empty="true" current="selected" no-current-selected-key="${parameters.version}"><list-options key-name="versionList" description="${versionList}" list-name="parameters.versionList" list-entry-name="versionList"/></drop-down>

+        </field>

+        <field name="submit" ><submit/></field>

+    </form>

+

+    <form name="EditRepositoryData" type="single" target="UpdateRepositoryData" >

+        <field name="title">

+            <display />

+        </field>

+        <field name="path" title="${uiLabelMap.ExampleRepositoryNode}" >

+            <display />

+        </field>

+        <field name="language"  title="${uiLabelMap.CommonLanguageTitle}">

+            <display />

+        </field>

+        <field name="pubDate" >

+            <display />

+        </field>

+        <field name="createDate" >

+            <display />

+        </field>

+        <field name="version" >

+            <display />

+        </field>

+        <field name="content" title="${uiLabelMap.ExampleRepositoryMessage}" >

+            <textarea visual-editor-enable="true" default-value="${parameters.message}"/>

+        </field>

+        <field name="submit">

+            <submit />

+        </field>

+    </form>

+

+    <form name="ScanRepositoryStructure" type="list" list-name="listIt" default-entity-name="Content" separate-columns="true" odd-row-style="alternate-row" header-row-style="header-row-2" default-table-style="basic-table hover-bar">

+        <field name="path">

+            <display />

+        </field>

+        <field name="primaryNodeType">

+            <display />

+        </field>

+    </form>

+

+    <form name="ExampleJackrabbitShowFileInformation" type="single" list-name="listIt" default-entity-name="Content" separate-columns="true" odd-row-style="alternate-row" header-row-style="header-row-2" default-table-style="basic-table hover-bar">

+        <field name="fileName">

+            <display />

+        </field>

+        <field name="fileMimeType" use-when="parameters.get(&quot;fileMimeType&quot;)!=null">

+            <display />

+        </field>

+        <field name="fileLastModified" use-when="parameters.get(&quot;fileLastModified&quot;)!=null">

+            <display />

+        </field>

+        <field name="fileCreationDate">

+            <display />

+        </field>

+    </form>

+

+    <form name="QueryRepositoryDataForm" type="single" target="QueryRepositoryData">

+        <field name="queryData" ><text /></field>

+        <field name="submit"><submit/></field>

+    </form>

+

+    <form name="ExampleJackrabbitShowQueryResults" type="list" target="EditRepositoryContent" list-name="queryResult" separate-columns="true" odd-row-style="alternate-row" header-row-style="header-row-2" default-table-style="basic-table hover-bar">

+        <field name="path" title="${uiLabelMap.ExampleRepositoryNode}" ><hyperlink target="EditRepositoryContent" description="${path}"><parameter param-name="path"/></hyperlink></field>

+        <field name="score" ><display /></field>

+    </form>

+</forms>
\ No newline at end of file
diff --git a/framework/example/widget/example/ExampleJackrabbitScreens.xml b/framework/example/widget/example/ExampleJackrabbitScreens.xml
new file mode 100644
index 0000000..b4506a8
--- /dev/null
+++ b/framework/example/widget/example/ExampleJackrabbitScreens.xml
@@ -0,0 +1,213 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<!--

+Licensed to the Apache Software Foundation (ASF) under one

+or more contributor license agreements.  See the NOTICE file

+distributed with this work for additional information

+regarding copyright ownership.  The ASF licenses this file

+to you 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.

+-->

+

+<screens xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/widget-screen.xsd">

+

+    <screen name="ListRepositoryData">

+        <section>

+            <actions>

+                <set field="titleProperty" value="PageTitleExampleJackrabbit" />

+                <set field="tabButtonItem" value="ExampleJackrabbitListNodes" />

+                <entity-condition list="repositoryContent" entity-name="Content">

+                    <condition-expr field-name="contentTypeId" operator="equals" value="REPOSITORY"/>

+                </entity-condition>

+            </actions>

+            <widgets>

+                <decorator-screen name="CommonExampleJackrabbitDecorator" location="${parameters.mainDecoratorLocation}">

+                    <decorator-section name="body">

+                        <container>

+                            <include-form location="component://example/widget/example/ExampleJackrabbitForms.xml" name="ListRepositoryData" />

+                        </container>

+                    </decorator-section>

+                </decorator-screen>

+            </widgets>

+        </section>

+    </screen>

+

+    <screen name="ExampleJackrabbitShowContentData">

+        <section>

+            <actions>

+                <set field="titleProperty" value="PageTitleExampleJackrabbit" />

+                <set field="tabButtonItem" value="ExampleJackrabbitShowContentData" />

+            </actions>

+            <widgets>

+                <decorator-screen name="CommonExampleJackrabbitDecorator" location="${parameters.mainDecoratorLocation}">

+                    <decorator-section name="body">

+                        <container>

+                            <platform-specific>

+                                <html><html-template location="component://example/webapp/example/jackrabbit/ContentChooser.ftl"/></html>

+                            </platform-specific>

+                        </container>

+                        <container>

+                            <label>${uiLabelMap.ExampleJackrabbitQueryForContent}</label>

+                            <include-form location="component://example/widget/example/ExampleJackrabbitForms.xml" name="QueryRepositoryDataForm" />

+                        </container>

+                        <container>

+                            <label>${uiLabelMap.ExampleJackrabbitTryRightClick}</label>

+                            <platform-specific>

+                                <html><html-template location="component://example/webapp/example/jackrabbit/JackrabbitDataTree.ftl"/></html>

+                            </platform-specific>

+                        </container>

+                    </decorator-section>

+                </decorator-screen>

+            </widgets>

+        </section>

+    </screen>

+

+    <screen name="ExampleJackrabbitAddData">

+        <section>

+            <actions>

+                <set field="titleProperty" value="PageTitleExampleJackrabbit" />

+                <set field="tabButtonItem" value="ExampleJackrabbitAddData" />

+                <script location="component://example/webapp/example/WEB-INF/actions/includes/PrepareLocalesForDropDown.groovy"/>

+            </actions>

+            <widgets>

+                <decorator-screen name="CommonExampleJackrabbitDecorator" location="${parameters.mainDecoratorLocation}">

+                    <decorator-section name="body">

+                        <container>

+                            <include-form location="component://example/widget/example/ExampleJackrabbitForms.xml" name="AddRepositoryData" />

+                        </container>

+                    </decorator-section>

+                </decorator-screen>

+            </widgets>

+        </section>

+    </screen>

+

+    <screen name="ExampleJackrabbitUploadFileData">

+        <section>

+            <actions>

+                <set field="titleProperty" value="PageTitleExampleJackrabbit" />

+                <set field="tabButtonItem" value="ExampleJackrabbitUploadFileData" />

+                <script location="component://example/webapp/example/WEB-INF/actions/includes/PrepareLocalesForDropDown.groovy"/>

+            </actions>

+            <widgets>

+                <decorator-screen name="CommonExampleJackrabbitDecorator" location="${parameters.mainDecoratorLocation}">

+                    <decorator-section name="body">

+                        <container>

+                            <include-form location="component://example/widget/example/ExampleJackrabbitForms.xml" name="UploadRepositoryFileData" />

+                        </container>

+                    </decorator-section>

+                </decorator-screen>

+            </widgets>

+        </section>

+    </screen>

+

+    <screen name="ExampleJackrabbitScanRepositoryStructure">

+        <section>

+            <actions>

+                <set field="titleProperty" value="PageTitleExampleJackrabbit" />

+                <set field="tabButtonItem" value="ExampleJackrabbitScanRepositoryStrukture" />

+                <set field="listIt" from-field="parameters.listIt"/>

+            </actions>

+            <widgets>

+                <decorator-screen name="CommonExampleJackrabbitDecorator" location="${parameters.mainDecoratorLocation}">

+                    <decorator-section name="body">

+                        <container>

+                            <include-form location="component://example/widget/example/ExampleJackrabbitForms.xml" name="ScanRepositoryStructure" />

+                        </container>

+                    </decorator-section>

+                </decorator-screen>

+            </widgets>

+        </section>

+    </screen>

+

+    <screen name="ExampleJackrabbitEditRepositoryContent">

+        <section>

+            <actions>

+                <set field="titleProperty" value="PageTitleExampleJackrabbit" />

+                <set field="tabButtonItem" value="ExampleJackrabbitMainPage" />

+            </actions>

+            <widgets>

+                <decorator-screen name="CommonExampleJackrabbitDecorator" location="${parameters.mainDecoratorLocation}">

+                    <decorator-section name="body">

+                        <container>

+                            <include-form location="component://example/widget/example/ExampleJackrabbitForms.xml" name="EditRepositoryDataChangeLanguage" />

+                            <include-form location="component://example/widget/example/ExampleJackrabbitForms.xml" name="EditRepositoryData" />

+                            <link target="RemoveRepositoryNode" text="remove" style="buttontext">

+                                <parameter param-name="repositoryNode" from-field="content.repositoryNode" />

+                                <parameter param-name="contentId" from-field="content.contentId"/>

+                            </link>

+                        </container>

+                    </decorator-section>

+                </decorator-screen>

+            </widgets>

+        </section>

+    </screen>

+

+    <screen name="ExampleJackrabbitShowUploadedFiles">

+        <section>

+            <actions>

+                <set field="titleProperty" value="PageTitleExampleJackrabbit" />

+                <set field="tabButtonItem" value="ExampleJackrabbitShowUploadedFiles" />

+            </actions>

+            <widgets>

+                <decorator-screen name="CommonExampleJackrabbitDecorator" location="${parameters.mainDecoratorLocation}">

+                    <decorator-section name="body">

+                        <container>

+                            <label>${uiLabelMap.ExampleJackrabbitTryRightClick}</label>

+                            <platform-specific>

+                                <html><html-template location="component://example/webapp/example/jackrabbit/JackrabbitFileTree.ftl"/></html>

+                            </platform-specific>

+                        </container>

+                    </decorator-section>

+                </decorator-screen>

+            </widgets>

+        </section>

+    </screen>

+

+    <screen name="ExampleJackrabbitShowFileInformation">

+        <section>

+            <actions>

+                <set field="titleProperty" value="PageTitleExampleJackrabbit" />

+                <set field="tabButtonItem" value="ExampleJackrabbitShowUploadedFiles" />

+            </actions>

+            <widgets>

+                <decorator-screen name="CommonExampleJackrabbitDecorator" location="${parameters.mainDecoratorLocation}">

+                    <decorator-section name="body">

+                        <container>

+                            <include-form location="component://example/widget/example/ExampleJackrabbitForms.xml" name="ExampleJackrabbitShowFileInformation" />

+                        </container>

+                    </decorator-section>

+                </decorator-screen>

+            </widgets>

+        </section>

+    </screen>

+

+    <screen name="ExampleJackrabbitShowQueryResult">

+        <section>

+            <actions>

+                <set field="titleProperty" value="PageTitleExampleJackrabbit" />

+                <set field="tabButtonItem" value="ExampleJackrabbitShowContentData" />

+                <set field="queryResult" from-field="parameters.queryResult"/>

+            </actions>

+            <widgets>

+                <decorator-screen name="CommonExampleJackrabbitDecorator" location="${parameters.mainDecoratorLocation}">

+                    <decorator-section name="body">

+                        <container>

+                            <include-form location="component://example/widget/example/ExampleJackrabbitForms.xml" name="ExampleJackrabbitShowQueryResults" />

+                        </container>

+                    </decorator-section>

+                </decorator-screen>

+            </widgets>

+        </section>

+    </screen>

+

+</screens>
\ No newline at end of file
diff --git a/framework/example/widget/example/ExampleMenus.xml b/framework/example/widget/example/ExampleMenus.xml
new file mode 100644
index 0000000..42575e7
--- /dev/null
+++ b/framework/example/widget/example/ExampleMenus.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<menus xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/widget-menu.xsd">
+    <menu name="ExampleAppBar" title="${uiLabelMap.ExampleApplication}" extends="CommonAppBarMenu" extends-resource="component://common/widget/CommonMenus.xml">
+        <menu-item name="ExampleMenuItem" title="${uiLabelMap.ExampleExample}">
+            <link target="FindExample"/>
+        </menu-item>
+        <menu-item name="ExampleFeature" title="${uiLabelMap.ExampleFeature}">
+            <link target="FindExampleFeature"/>
+        </menu-item>
+        <menu-item name="FormWidgetExamples" title="${uiLabelMap.ExampleFormWidgetExamples}">
+            <link target="FormWidgetExamples"/>
+        </menu-item>
+        <menu-item name="AjaxExample" title="${uiLabelMap.ExampleAjaxExamples}">
+            <link target="authview/findExampleAjax"/>
+        </menu-item>
+        <menu-item name="portalPage" parent-portal-page-value="EXAMPLE"/>
+        <menu-item name="Dashboard" title="${uiLabelMap.ExampleDashboard}" align-style="opposed">
+            <link target="ManagePortalPages">
+                <parameter param-name="parentPortalPageId" value="EXAMPLE"/>
+            </link>
+        </menu-item>
+        <menu-item name="ExampleGeoLocation" title="${uiLabelMap.CommonGeoLocation}">
+            <link target="ExampleGeoLocationPointSet1"/>
+        </menu-item>
+        <menu-item name="Birt" title="${uiLabelMap.Birt}">
+            <link target="BirtMain"/>
+        </menu-item>
+        <menu-item name="ExampleCharts" title="Chart examples">
+            <link target="ExampleBarChart"/>
+        </menu-item>
+        <menu-item name="ExampleJackrabbit" title="${uiLabelMap.PageTitleExampleJackrabbit}"><link target="ExampleJackrabbitShowContentData"/></menu-item>
+    </menu>
+
+    <menu name="EditExample" extends="CommonTabBarMenu" extends-resource="component://common/widget/CommonMenus.xml">
+        <menu-item name="EditExample" title="${uiLabelMap.ExampleExample}">
+            <link target="EditExample"/>
+        </menu-item>
+        <menu-item name="EditExampleItems" title="${uiLabelMap.CommonItems}">
+            <link target="EditExampleItems">
+                <parameter param-name="exampleId"/>
+            </link>
+        </menu-item>
+        <menu-item name="EditExampleFeatureAppls" title="${uiLabelMap.ExampleFeatures}">
+            <link target="EditExampleFeatureAppls">
+                <parameter param-name="exampleId"/>
+            </link>
+        </menu-item>
+    </menu>
+
+    <menu name="EditExampleFeature" extends="CommonTabBarMenu" extends-resource="component://common/widget/CommonMenus.xml">
+        <menu-item name="EditExampleFeature" title="${uiLabelMap.ExampleFeature}">
+            <link target="EditExampleFeature"/>
+        </menu-item>
+        <menu-item name="EditExampleFeatureExampleAppls" title="${uiLabelMap.ExampleExamples}">
+            <link target="EditExampleFeatureExampleAppls"/>
+        </menu-item>
+    </menu>
+
+    <menu name="ExampleGeoLocation" extends="CommonTabBarMenu" extends-resource="component://common/widget/CommonMenus.xml">
+        <menu-item name="ExampleGeoLocationPointSet1" title="${uiLabelMap.PointSet1}"><link target="ExampleGeoLocationPointSet1"/></menu-item>
+        <menu-item name="ExampleGeoLocationPointSet2" title="${uiLabelMap.PointSet2}"><link target="ExampleGeoLocationPointSet2"/></menu-item>
+        <menu-item name="ExampleGeoLocationPointSet3" title="${uiLabelMap.PointSet3}"><link target="ExampleGeoLocationPointSet3"/></menu-item>
+        <menu-item name="ExampleGeoLocationPointSet4" title="${uiLabelMap.PointSet4}"><link target="ExampleGeoLocationPointSet4"/></menu-item>
+        <menu-item name="ExampleGeoLocationAddress" title="${uiLabelMap.ExamplePointAddress}"><link target="ExampleGeoLocationAddress"/></menu-item>
+        <!--Examples using openstreetmap -->
+        <menu-item name="ExampleOsmGeoLocationPointSet1" title="${uiLabelMap.OsmPointSet1}"><link target="ExampleOsmGeoLocationPointSet1"/></menu-item>
+        <menu-item name="ExampleOsmGeoLocationPointSet2" title="${uiLabelMap.OsmPointSet2}"><link target="ExampleOsmGeoLocationPointSet2"/></menu-item>
+        <menu-item name="ExampleOsmGeoLocationPointSet3" title="${uiLabelMap.OsmPointSet3}"><link target="ExampleOsmGeoLocationPointSet3"/></menu-item>
+        <menu-item name="ExampleOsmGeoLocationPointSet4" title="${uiLabelMap.OsmPointSet4}"><link target="ExampleOsmGeoLocationPointSet4"/></menu-item>
+    </menu>
+
+    <menu name="BirtTabBar" extends="CommonTabBarMenu" extends-resource="component://common/widget/CommonMenus.xml">
+        <menu-item name="Report" title="${uiLabelMap.ExampleBirtReport}"><link target="Report"/></menu-item>
+        <menu-item name="Export" title="${uiLabelMap.ExampleBirtViewHandler}"><link target="ViewHandler"/></menu-item>
+        <menu-item name="Mail" title="${uiLabelMap.ExampleBirtMail}"><link target="Mail"/></menu-item>
+        <!-- Reports using charts-->
+        <menu-item name="chartReport" title="${uiLabelMap.ExampleBirtChartReport}"><link target="chartReport"/></menu-item>
+        <menu-item name="chartExport" title="${uiLabelMap.ExampleBirtChartViewHandler}"><link target="chartViewHandler"/></menu-item>
+    </menu>
+
+    <menu name="ExampleCharts" extends="CommonTabBarMenu" extends-resource="component://common/widget/CommonMenus.xml">
+        <menu-item name="ExampleBarChart" title="Bar chart"><link target="ExampleBarChart"/></menu-item>
+        <menu-item name="ExamplePieChart" title="Pie chart"><link target="ExamplePieChart"/></menu-item>
+    </menu>
+
+    <menu name="ExampleJackrabbit" extends="CommonTabBarMenu" extends-resource="component://common/widget/CommonMenus.xml">
+        <menu-item name="ExampleJackrabbitShowContentData" title="${uiLabelMap.ExampleJackrabbitShowContentData}"><link target="ExampleJackrabbitShowContentData"/></menu-item>
+        <menu-item name="ExampleJackrabbitAddData" title="${uiLabelMap.ExampleAddNewContentEntry}"><link target="ExampleJackrabbitAddData"/></menu-item>
+        <menu-item name="ExampleJackrabbitUploadFileData" title="${uiLabelMap.ExampleJackrabbitUploadFileData}"><link target="ExampleJackrabbitUploadFileData"/></menu-item>
+        <menu-item name="ExampleJackrabbitShowUploadedFiles" title="${uiLabelMap.ExampleJackrabbitShowUploadedFiles}"><link target="ExampleJackrabbitShowUploadedFiles"/></menu-item>
+        <menu-item name="ExampleJackrabbitScanRepositoryStrukture" title="${uiLabelMap.ExampleScanRepositoryStrukture}"><link target="ExampleJackrabbitScanRepositoryStructure"/></menu-item>
+    </menu>
+</menus>
diff --git a/framework/example/widget/example/ExampleScreens.xml b/framework/example/widget/example/ExampleScreens.xml
new file mode 100644
index 0000000..7a0b272
--- /dev/null
+++ b/framework/example/widget/example/ExampleScreens.xml
@@ -0,0 +1,481 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<screens xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/widget-screen.xsd">
+
+    <!-- list all examples in a tabular format -->
+    <screen name="FindExample">
+        <section>
+            <actions>
+                <set field="headerItem" value="ExampleMenuItem"/>
+                <set field="titleProperty" value="PageTitleFindExample"/>
+                <set field="exampleCtx" from-field="parameters"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="main-decorator" location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="body">
+                        <section>
+                            <condition>
+                                <if-has-permission permission="EXAMPLE" action="_VIEW"/>
+                            </condition>
+                            <widgets>
+                                <decorator-screen name="FindScreenDecorator" location="component://common/widget/CommonScreens.xml">
+                                    <decorator-section name="menu-bar">
+                                        <container style="button-bar"><link target="EditExampleLayer" link-type="ajax-window" height="500" width="500" text="${uiLabelMap.ExampleNewExample}" style="buttontext create"/></container>
+                                    </decorator-section>
+                                    <decorator-section name="search-options">
+                                        <include-form name="FindExamples" location="component://example/widget/example/ExampleForms.xml"/>
+                                    </decorator-section>
+                                    <decorator-section name="search-results">
+                                        <include-form name="ListExamples" location="component://example/widget/example/ExampleForms.xml"/>
+                                    </decorator-section>
+                                </decorator-screen>
+                            </widgets>
+                            <fail-widgets>
+                                <label style="h3">${uiLabelMap.ExampleViewPermissionError}</label>
+                            </fail-widgets>
+                        </section>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="EditExampleLayer">
+        <section>
+            <actions>
+                <property-map resource="ExampleUiLabels" map-name="uiLabelMap" global="true"/>
+                <property-map resource="CommonUiLabels" map-name="uiLabelMap" global="true"/>
+                <set field="titleProperty" value="PageTitleEditExample"/>
+                <set field="tabButtonItem" value="EditExample"/>
+                <set field="exampleId" from-field="parameters.exampleId"/>
+                <entity-one entity-name="Example" value-field="example"/>
+            </actions>
+            <widgets>
+                <include-form name="EditExample" location="component://example/widget/example/ExampleForms.xml"/>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="EditExample">
+        <section>
+            <actions>
+                <set field="titleProperty" value="PageTitleEditExample"/>
+                <set field="tabButtonItem" value="EditExample"/>
+                <set field="exampleId" from-field="parameters.exampleId"/>
+                <entity-one entity-name="Example" value-field="example"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="CommonExampleDecorator" location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="body">
+                        <include-form name="EditExample" location="component://example/widget/example/ExampleForms.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="ExampleReport">
+        <section>
+            <actions>
+                <set field="titleProperty" value="PageTitleEditExample"/>
+                <set field="tabButtonItem" value="EditExample"/>
+                <set field="exampleId" from-field="parameters.exampleId"/>
+                <entity-one entity-name="Example" value-field="example"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="SimpleDecorator" location="component://common/widget/CommonScreens.xml">
+                    <decorator-section name="body">
+                        <include-form name="EditExample" location="component://example/widget/example/ExampleForms.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="EditExampleItems">
+        <section>
+            <actions>
+                <set field="titleProperty" value="PageTitleEditExampleItems"/>
+                <set field="tabButtonItem" value="EditExampleItems"/>
+                <set field="exampleId" from-field="parameters.exampleId"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="CommonExampleDecorator" location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="body">
+                        <include-form name="ListExampleItems" location="component://example/widget/example/ExampleForms.xml"/>
+                        <include-form name="AddExampleItem" location="component://example/widget/example/ExampleForms.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="EditExampleFeatureAppls">
+        <section>
+            <actions>
+                <set field="titleProperty" value="PageTitleEditExampleFeatureAppls"/>
+                <set field="tabButtonItem" value="EditExampleFeatureAppls"/>
+                <set field="exampleId" from-field="parameters.exampleId"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="CommonExampleDecorator" location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="body">
+                        <include-form name="ListExampleFeatureAppls" location="component://example/widget/example/ExampleForms.xml"/>
+                        <include-form name="AddExampleFeatureAppl" location="component://example/widget/example/ExampleForms.xml"/>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="help">
+        <section>
+            <actions>
+                <property-map resource="ExampleHelpUiLabels" map-name="uiLabelMap" global="true"/>
+                <property-map resource="ExampleUiLabels" map-name="uiLabelMap" global="true"/>
+                <property-map resource="CommonUiLabels" map-name="uiLabelMap" global="true"/>
+                <set field="layoutSettings.companyName" from-field="uiLabelMap.ExampleCompanyName" global="true"/>
+            </actions>
+            <widgets>
+                <include-screen name="help" location="component://common/widget/CommonScreens.xml"/>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="ExampleGeoLocationPointSet1">
+        <section>
+            <actions>
+                <set field="tabButtonItem" value="ExampleGeoLocationPointSet1"/>
+                <set field="geoPoints[+0].lat" value="37.4419" type="Float"/>
+                <set field="geoPoints[0].lon" value="-122.1419" type="Float"/>
+                <set field="geoPoints[+1].lat" value="37.4819" type="Float"/>
+                <set field="geoPoints[1].lon" value="-122.1519" type="Float"/>
+                <set field="geoPoints[+2].lat" value="37.4719" type="Float"/>
+                <set field="geoPoints[2].lon" value="-122.1319" type="Float"/>
+                <set field="geoCenter.lat" value="37.4419" type="Float"/>
+                <set field="geoCenter.lon" value="-122.1419" type="Float"/>
+                <set field="geoCenter.zoom" value="13"/>
+            </actions>
+            <widgets>
+                <include-screen name="CommonExampleGeoLocationDecorator" location="${parameters.mainDecoratorLocation}"/>
+            </widgets>
+        </section>
+    </screen>
+    <screen name="ExampleGeoLocationPointSet2">
+        <section>
+            <actions>
+                <set field="tabButtonItem" value="ExampleGeoLocationPointSet2"/>
+                <set field="geoPoints[+0].lat" value="37.4459" type="Float"/>
+                <set field="geoPoints[0].lon" value="-122.1489" type="Float"/>
+                <set field="geoPoints[+1].lat" value="37.4829" type="Float"/>
+                <set field="geoPoints[1].lon" value="-122.1599" type="Float"/>
+                <set field="geoPoints[+2].lat" value="37.4769" type="Float"/>
+                <set field="geoPoints[2].lon" value="-122.1219" type="Float"/>
+                <set field="geoCenter.lat" value="37.4419" type="Float"/>
+                <set field="geoCenter.lon" value="-122.1419" type="Float"/>
+                <set field="geoCenter.zoom" value="12"/>
+            </actions>
+            <widgets>
+                <include-screen name="CommonExampleGeoLocationDecorator" location="${parameters.mainDecoratorLocation}"/>
+            </widgets>
+        </section>
+    </screen>
+    <screen name="ExampleGeoLocationPointSet3">
+        <section>
+            <actions>
+                <set field="tabButtonItem" value="ExampleGeoLocationPointSet3"/>
+                <set field="geoPoints[+0].lat" value="37.4379" type="Float"/>
+                <set field="geoPoints[0].lon" value="-122.1119" type="Float"/>
+                <set field="geoPoints[+1].lat" value="37.4819" type="Float"/>
+                <set field="geoPoints[1].lon" value="-122.1519" type="Float"/>
+                <set field="geoPoints[+2].lat" value="37.4229" type="Float"/>
+                <set field="geoPoints[2].lon" value="-122.1369" type="Float"/>
+                <set field="geoCenter.lat" value="37.4419" type="Float"/>
+                <set field="geoCenter.lon" value="-122.1419" type="Float"/>
+                <set field="geoCenter.zoom" value="11"/>
+            </actions>
+            <widgets>
+                <include-screen name="CommonExampleGeoLocationDecorator" location="${parameters.mainDecoratorLocation}"/>
+            </widgets>
+        </section>
+    </screen>
+    <screen name="ExampleGeoLocationPointSet4">
+        <section>
+            <actions>
+                <set field="headerItem" value="ExampleGeoLocation"/>
+                <set field="tabButtonItem" value="ExampleGeoLocationPointSet4"/>
+                <set field="geoChart.dataSourceId" value="GEOPT_GOOGLE"/>
+                <set field="geoChart.width" value="600px"/>
+                <set field="geoChart.height" value="500px"/>
+                <set field="geoChart.points" from-field="geoPoints"/>
+                <set field="geoChart.center" from-field="geoCenter"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="main-decorator" location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="pre-body">
+                        <include-menu name="ExampleGeoLocation" location="component://example/widget/example/ExampleMenus.xml"/>
+                    </decorator-section>
+                    <decorator-section name="body">
+                        <section>
+                            <widgets>
+                                <section>
+                                    <actions>
+                                        <set field="geoPoints[+0].lat" value="37.4459" type="Float"/>
+                                        <set field="geoPoints[0].lon" value="-122.1489" type="Float"/>
+                                        <set field="geoPoints[+1].lat" value="37.4829" type="Float"/>
+                                        <set field="geoPoints[1].lon" value="-122.1599" type="Float"/>
+                                        <set field="geoPoints[+2].lat" value="37.4769" type="Float"/>
+                                        <set field="geoPoints[2].lon" value="-122.1219" type="Float"/>
+                                        <set field="geoCenter.lat" value="37.4419" type="Float"/>
+                                        <set field="geoCenter.lon" value="-122.1419" type="Float"/>
+                                        <set field="geoCenter.zoom" value="12"/>
+                                        <set field="geoChart.id" value="chart1"/>
+                                        <set field="geoChart.dataSourceId" value="GEOPT_GOOGLE"/>
+                                        <set field="geoChart.width" value="600px"/>
+                                        <set field="geoChart.height" value="500px"/>
+                                        <set field="geoChart.points" from-field="geoPoints"/>
+                                        <set field="geoChart.center" from-field="geoCenter"/>
+                                    </actions>
+                                    <widgets>
+                                        <container style="clear" />
+                                        <include-screen name="geoChart" location="component://common/widget/CommonScreens.xml"/>
+                                    </widgets>
+                                </section>
+                                <section>
+                                    <actions>
+                                        <set field="geoPoints" value=""/>
+                                        <set field="geoPoints[+0].lat" value="37.4379" type="Float"/>
+                                        <set field="geoPoints[0].lon" value="-122.1119" type="Float"/>
+                                        <set field="geoPoints[+1].lat" value="37.4819" type="Float"/>
+                                        <set field="geoPoints[1].lon" value="-122.1519" type="Float"/>
+                                        <set field="geoPoints[+2].lat" value="37.4229" type="Float"/>
+                                        <set field="geoPoints[2].lon" value="-122.1369" type="Float"/>
+                                        <set field="geoCenter.lat" value="37.4419" type="Float"/>
+                                        <set field="geoCenter.lon" value="-122.1419" type="Float"/>
+                                        <set field="geoCenter.zoom" value="11"/>
+                                        <set field="geoChart.id" value="chart2"/>
+                                        <set field="geoChart.dataSourceId" value="GEOPT_GOOGLE"/>
+                                        <set field="geoChart.width" value="800px"/>
+                                        <set field="geoChart.height" value="500px"/>
+                                        <set field="geoChart.points" from-field="geoPoints"/>
+                                        <set field="geoChart.center" from-field="geoCenter"/>
+                                    </actions>
+                                    <widgets>
+                                        <include-screen name="geoChart" location="component://common/widget/CommonScreens.xml"/>
+                                    </widgets>
+                                </section>
+                            </widgets>
+                        </section>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+    <screen name="ExampleGeoLocationAddress">
+        <section>
+            <actions>
+                <set field="headerItem" value="ExampleGeoLocation"/>
+                <set field="tabButtonItem" value="ExampleGeoLocationAddress"/>
+                <set field="geoChart.dataSourceId" value="GEOPT_ADDRESS_GOOGLE"/>
+                <set field="geoChart.width" value="800px"/>
+                <set field="geoChart.height" value="500px"/>
+
+                <set field="contactMechId" value="9015"/>
+                <entity-one entity-name="PostalAddress" value-field="address"/>
+                <set field="pointAddress" value="${address.address1} ${address.address2} ${address.postalCode} ${address.city} ${address.stateProvinceGeoId} ${address.countryGeoId}"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="main-decorator" location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="pre-body">
+                        <include-menu name="ExampleGeoLocation" location="component://example/widget/example/ExampleMenus.xml"/>
+                    </decorator-section>
+                    <decorator-section name="body">
+                        <section>
+                            <widgets>
+                                <container style="clear" />
+                                <label>Using Google geocoding services may need to register for an individual key. Please visit this website to have more details :</label>
+                                <link target="http://code.google.com/intl/fr/apis/maps/signup.html" url-mode="plain" text="Google Maps API"/>
+                                <label style="h3">Geolocation of DemoCustomer, living at ${pointAddress}</label>
+                                <include-screen name="geoChart" location="component://common/widget/CommonScreens.xml"/>
+                            </widgets>
+                        </section>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="ExamplePieChart">
+        <section>
+            <actions>
+                <set field="tabButtonItem" value="ExamplePieChart"/>
+                <set field="chartType" value="Pie"/>
+                <set field="chartId" value="pieChartDiv"/>
+            </actions>
+            <widgets>
+                <include-screen name="CommonExampleChartsDecorator" location="${parameters.mainDecoratorLocation}"/>
+            </widgets>
+        </section>
+    </screen>
+    <screen name="ExampleBarChart">
+        <section>
+            <actions>
+                <set field="tabButtonItem" value="ExampleBarChart"/>
+                <set field="chartType" value="Bars"/>
+                <set field="chartId" value="barChartDiv"/>
+            </actions>
+            <widgets>
+                <include-screen name="CommonExampleChartsDecorator" location="${parameters.mainDecoratorLocation}"/>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="ExampleOsmGeoLocationPointSet1">
+        <section>
+            <actions>
+                <set field="tabButtonItem" value="ExampleOsmGeoLocationPointSet1"/>
+                <set field="geoPoints[+0].lat" value="37.4419" type="Float"/>
+                <set field="geoPoints[0].lon" value="-122.1419" type="Float"/>
+                <set field="geoPoints[+1].lat" value="37.4819" type="Float"/>
+                <set field="geoPoints[1].lon" value="-122.1519" type="Float"/>
+                <set field="geoPoints[+2].lat" value="37.4719" type="Float"/>
+                <set field="geoPoints[2].lon" value="-122.1319" type="Float"/>
+                <set field="geoCenter.lat" value="37.4419" type="Float"/>
+                <set field="geoCenter.lon" value="-122.1419" type="Float"/>
+                <set field="geoCenter.zoom" value="13"/>
+            </actions>
+            <widgets>
+                <include-screen name="CommonExampleOsmGeoLocationDecorator" location="${parameters.mainDecoratorLocation}"/>
+            </widgets>
+        </section>
+    </screen>
+    <screen name="ExampleOsmGeoLocationPointSet2">
+        <section>
+            <actions>
+                <set field="tabButtonItem" value="ExampleOsmGeoLocationPointSet2"/>
+                <set field="geoPoints[+0].lat" value="37.4459" type="Float"/>
+                <set field="geoPoints[0].lon" value="-122.1489" type="Float"/>
+                <set field="geoPoints[+1].lat" value="37.4829" type="Float"/>
+                <set field="geoPoints[1].lon" value="-122.1599" type="Float"/>
+                <set field="geoPoints[+2].lat" value="37.4769" type="Float"/>
+                <set field="geoPoints[2].lon" value="-122.1219" type="Float"/>
+                <set field="geoCenter.lat" value="37.4419" type="Float"/>
+                <set field="geoCenter.lon" value="-122.1419" type="Float"/>
+                <set field="geoCenter.zoom" value="12"/>
+            </actions>
+            <widgets>
+                <include-screen name="CommonExampleOsmGeoLocationDecorator" location="${parameters.mainDecoratorLocation}"/>
+            </widgets>
+        </section>
+    </screen>
+    <screen name="ExampleOsmGeoLocationPointSet3">
+        <section>
+            <actions>
+                <set field="tabButtonItem" value="ExampleOsmGeoLocationPointSet3"/>
+                <set field="geoPoints[+0].lat" value="37.4379" type="Float"/>
+                <set field="geoPoints[0].lon" value="-122.1119" type="Float"/>
+                <set field="geoPoints[+1].lat" value="37.4819" type="Float"/>
+                <set field="geoPoints[1].lon" value="-122.1519" type="Float"/>
+                <set field="geoPoints[+2].lat" value="37.4229" type="Float"/>
+                <set field="geoPoints[2].lon" value="-122.1369" type="Float"/>
+                <set field="geoCenter.lat" value="37.4419" type="Float"/>
+                <set field="geoCenter.lon" value="-122.1419" type="Float"/>
+                <set field="geoCenter.zoom" value="11"/>
+            </actions>
+            <widgets>
+                <include-screen name="CommonExampleOsmGeoLocationDecorator" location="${parameters.mainDecoratorLocation}"/>
+            </widgets>
+        </section>
+    </screen>
+    <screen name="ExampleOsmGeoLocationPointSet4">
+        <section>
+            <actions>
+                <set field="headerItem" value="ExampleGeoLocation"/>
+                <set field="tabButtonItem" value="ExampleOsmGeoLocationPointSet4"/>
+                <set field="geoChart.dataSourceId" value="GEOPT_GOOGLE"/>
+                <set field="geoChart.width" value="600px"/>
+                <set field="geoChart.height" value="500px"/>
+                <set field="geoChart.points" from-field="geoPoints"/>
+                <set field="geoChart.center" from-field="geoCenter"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="main-decorator" location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="pre-body">
+                        <include-menu name="ExampleGeoLocation" location="component://example/widget/example/ExampleMenus.xml"/>
+                    </decorator-section>
+                    <decorator-section name="body">
+                        <section>
+                            <widgets>
+                                <section>
+                                    <actions>
+                                        <set field="geoPoints[+0].lat" value="37.4459" type="Float"/>
+                                        <set field="geoPoints[0].lon" value="-122.1489" type="Float"/>
+                                        <set field="geoPoints[+1].lat" value="37.4829" type="Float"/>
+                                        <set field="geoPoints[1].lon" value="-122.1599" type="Float"/>
+                                        <set field="geoPoints[+2].lat" value="37.4769" type="Float"/>
+                                        <set field="geoPoints[2].lon" value="-122.1219" type="Float"/>
+                                        <set field="geoCenter.lat" value="37.4419" type="Float"/>
+                                        <set field="geoCenter.lon" value="-122.1419" type="Float"/>
+                                        <set field="geoCenter.zoom" value="12"/>
+                                        <set field="geoChart.id" value="chart1"/>
+                                        <set field="geoChart.dataSourceId" value="GEOPT_OSM"/>
+                                        <set field="geoChart.width" value="600px"/>
+                                        <set field="geoChart.height" value="500px"/>
+                                        <set field="geoChart.points" from-field="geoPoints"/>
+                                        <set field="geoChart.center" from-field="geoCenter"/>
+                                    </actions>
+                                    <widgets>
+                                        <container style="clear" />
+                                        <include-screen name="geoChart" location="component://common/widget/CommonScreens.xml"/>
+                                    </widgets>
+                                </section>
+                                <section>
+                                    <actions>
+                                        <set field="geoPoints" value=""/>
+                                        <set field="geoPoints[+0].lat" value="37.4379" type="Float"/>
+                                        <set field="geoPoints[0].lon" value="-122.1119" type="Float"/>
+                                        <set field="geoPoints[+1].lat" value="37.4819" type="Float"/>
+                                        <set field="geoPoints[1].lon" value="-122.1519" type="Float"/>
+                                        <set field="geoPoints[+2].lat" value="37.4229" type="Float"/>
+                                        <set field="geoPoints[2].lon" value="-122.1369" type="Float"/>
+                                        <set field="geoCenter.lat" value="37.4419" type="Float"/>
+                                        <set field="geoCenter.lon" value="-122.1419" type="Float"/>
+                                        <set field="geoCenter.zoom" value="11"/>
+                                        <set field="geoChart.id" value="chart2"/>
+                                        <set field="geoChart.dataSourceId" value="GEOPT_OSM"/>
+                                        <set field="geoChart.width" value="800px"/>
+                                        <set field="geoChart.height" value="500px"/>
+                                        <set field="geoChart.points" from-field="geoPoints"/>
+                                        <set field="geoChart.center" from-field="geoCenter"/>
+                                    </actions>
+                                    <widgets>
+                                        <include-screen name="geoChart" location="component://common/widget/CommonScreens.xml"/>
+                                    </widgets>
+                                </section>
+                            </widgets>
+                        </section>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+</screens>
diff --git a/framework/example/widget/example/FormWidgetExampleForms.xml b/framework/example/widget/example/FormWidgetExampleForms.xml
new file mode 100644
index 0000000..cc361a5
--- /dev/null
+++ b/framework/example/widget/example/FormWidgetExampleForms.xml
@@ -0,0 +1,374 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<forms xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/widget-form.xsd">
+
+    <form name="DateTimeFieldsExampleForm" type="single" title="">
+        <actions>
+            <set field="exampleDateField" value="${date:nowTimestamp()}" type="Timestamp"/>
+        </actions>
+        <!-- ***************** -->
+        <!-- ***   field1  *** -->
+        <!-- ***************** -->
+        <field name="field1"
+               title="${uiLabelMap.ExampleDateField1Title}"
+               tooltip="${uiLabelMap.ExampleToDo}">
+            <date-time mask="Y"/>
+        </field>
+        <!-- ***************** -->
+        <!-- ***   field9  *** -->
+        <!-- ***************** -->
+        <field name="field9"
+            title="${uiLabelMap.ExampleDateField9Title}">
+            <!--tooltip="${uiLabelMap.ExampleDateField9Tooltip}"-->
+            <date-time default-value="${groovy:org.ofbiz.base.util.UtilDateTime.nowTimestamp()}"/>
+        </field>
+        <!-- ***************** -->
+        <!-- ***   field10  *** -->
+        <!-- ***************** -->
+        <field name="field10"
+               title="${uiLabelMap.ExampleDateField10Title}"
+               tooltip="${uiLabelMap.ExampleDateField10Tooltip}">
+            <date-time default-value="${nowTimestamp}"/>
+        </field>
+        <!-- ***************** -->
+        <!-- ***   field11  *** -->
+        <!-- ***************** -->
+        <field name="field11"
+               title="${uiLabelMap.ExampleDateField11Title}"
+               tooltip="${uiLabelMap.ExampleDateField11Tooltip}">
+            <date-time default-value="${date:dayStart(nowTimestamp, timeZone, locale)}"/>
+        </field>
+        <!-- ***************** -->
+        <!-- ***   field2  *** -->
+        <!-- ***************** -->
+        <field name="field2"
+               title="${uiLabelMap.ExampleDateField2Title}"
+               tooltip="${uiLabelMap.ExampleToDo}">
+            <date-time type="date"/>
+        </field>
+        <!-- ***************** -->
+        <!-- ***   field3  *** -->
+        <!-- ***************** -->
+        <field name="field3"
+               title="${uiLabelMap.ExampleDateField3Title}"
+               tooltip="${uiLabelMap.ExampleToDo}">
+            <date-time type="time"/>
+        </field>
+        <!-- ***************** -->
+        <!-- ***   field4  *** -->
+        <!-- ***************** -->
+        <field name="field4"
+               title="${uiLabelMap.ExampleDateField4Title}"
+               tooltip="${uiLabelMap.ExampleDateField4Tooltip}">
+            <date-time input-method="time-dropdown" clock="24" default-value="${exampleDateField}"/>
+        </field>
+        <!-- ***************** -->
+        <!-- ***   field5  *** -->
+        <!-- ***************** -->
+        <field name="field5"
+               title="${uiLabelMap.ExampleDateField5Title}"
+               tooltip="${uiLabelMap.ExampleDateField4Tooltip}">
+            <date-time input-method="time-dropdown" clock="12" default-value="${exampleDateField}"/>
+        </field>
+        <!-- ***************** -->
+        <!-- ***   field6  *** -->
+        <!-- ***************** -->
+        <field name="field6"
+               entry-name="exampleDateField"
+               title="${uiLabelMap.ExampleDateField6Title}"
+               tooltip="${uiLabelMap.ExampleToDo}">
+            <display type="date-time"/>
+        </field>
+        <!-- ***************** -->
+        <!-- ***   field7  *** -->
+        <!-- ***************** -->
+        <field name="field7"
+               entry-name="exampleDateField"
+               title="${uiLabelMap.ExampleDateField7Title}"
+               tooltip="${uiLabelMap.ExampleDateField7Tooltip}">
+            <display description="${groovy:org.ofbiz.base.util.UtilDateTime.toDateString(exampleDateField, &quot;MM/dd/yyyy&quot;);}"/>
+        </field>
+        <!-- ***************** -->
+        <!-- ***   field8  *** -->
+        <!-- ***************** -->
+        <field name="field8"
+               entry-name="exampleDateField"
+               title="${uiLabelMap.ExampleDateField8Title}"
+               tooltip="${uiLabelMap.ExampleDateField8Tooltip}">
+            <display description="${groovy:org.ofbiz.base.util.UtilDateTime.toDateString(exampleDateField, &quot;MMMM,dd,yyyy&quot;);}"/>
+        </field>
+        <!-- ***************** -->
+        <!-- ***   field12  *** -->
+        <!-- ***************** -->
+        <field name="field12"
+               title="${uiLabelMap.ExampleDateField12Title}"
+               tooltip="${uiLabelMap.ExampleDateField12Tooltip}">
+            <date-time input-method="time-dropdown" clock="24" default-value="${exampleDateField}" step="5"/>
+        </field>
+    </form>
+
+    <form name="DropDownFieldsExampleForm" type="single" title="">
+        <field name="dropDownFields1" title="${uiLabelMap.ExampleDropDown}">
+            <display description="${uiLabelMap.ExampleDropDownTooltip}" also-hidden="false"/>
+        </field>
+        <!-- ***************** -->
+        <!-- ***   field1  *** -->
+        <!-- ***************** -->
+        <field name="field1"
+               title="${uiLabelMap.ExampleDropDownField1Title}"
+               tooltip="${uiLabelMap.ExampleDropDownField1Tooltip}">
+            <drop-down allow-empty="true">
+                <option key="Y" description="${uiLabelMap.CommonY}"/>
+                <option key="N" description="${uiLabelMap.CommonN}"/>
+            </drop-down>
+        </field>
+        <!-- ***************** -->
+        <!-- ***   field2  *** -->
+        <!-- ***************** -->
+        <field name="field2"
+               title="${uiLabelMap.ExampleDropDownField2Title}"
+               tooltip="${uiLabelMap.ExampleDropDownField2Tooltip}">
+            <drop-down allow-empty="false"> <!-- allow-empty="false" is also the default value, so you can also not specify this attribute here -->
+                <option key="Y" description="${uiLabelMap.CommonY}"/>
+                <option key="N" description="${uiLabelMap.CommonN}"/>
+            </drop-down>
+        </field>
+        <!-- ***************** -->
+        <!-- ***   field5  *** -->
+        <!-- ***************** -->
+        <field name="field5"
+               title="${uiLabelMap.ExampleDropDownField5Title}"
+               tooltip="${uiLabelMap.ExampleDropDownField5Tooltip}">
+            <drop-down no-current-selected-key="N">
+                <option key="Y" description="${uiLabelMap.CommonY}"/>
+                <option key="N" description="${uiLabelMap.CommonN}"/>
+            </drop-down>
+        </field>
+        <!-- ***************** -->
+        <!-- ***   field8  *** -->
+        <!-- ***************** -->
+        <field name="field8"
+               title="${uiLabelMap.ExampleDropDownField8Title}"
+               event="onchange"
+               action="return showErrorAlert('${uiLabelMap.CommonErrorMessage2}','${uiLabelMap.YouChangedTheSelectBoxValue}');"
+               tooltip="${uiLabelMap.ExampleDropDownField8Tooltip}">
+            <drop-down>
+                <option key="Y" description="${uiLabelMap.CommonY}"/>
+                <option key="N" description="${uiLabelMap.CommonN}"/>
+            </drop-down>
+        </field>
+
+        <field name="entityOptionsFields1" title="${uiLabelMap.ExampleDropDownEntityOptions}"><display description="${uiLabelMap.ExampleDropDownEntityOptionsTooltip1}" also-hidden="false"/></field>
+        <field name="entityOptionsFields2" title="${uiLabelMap.CommonEmptyHeader}"><display description="${uiLabelMap.ExampleDropDownEntityOptionsTooltip2}" also-hidden="false"/></field>
+        <field name="entityOptionsFields3" title="${uiLabelMap.CommonEmptyHeader}"><display description="${uiLabelMap.ExampleDropDownEntityOptionsTooltip3}" also-hidden="false"/></field>
+        <!-- ***************** -->
+        <!-- ***   field3  *** -->
+        <!-- ***************** -->
+        <field name="field3"
+               title="${uiLabelMap.ExampleDropDownField3Title}"
+               tooltip="${uiLabelMap.ExampleToDo}">
+            <drop-down>
+                <entity-options entity-name="ExampleType"
+                                key-field-name="exampleTypeId"
+                                description="${description}">
+                    <entity-order-by field-name="-description"/>
+                </entity-options>
+            </drop-down>
+        </field>
+        <!-- ***************** -->
+        <!-- ***   field4  *** -->
+        <!-- ***************** -->
+        <field name="field4"
+               title="${uiLabelMap.ExampleDropDownField4Title}"
+               tooltip="${uiLabelMap.ExampleToDo}">
+            <drop-down>
+                <entity-options entity-name="ExampleType"
+                                key-field-name="exampleTypeId"
+                                description="${exampleTypeId} - ${description}">
+                    <entity-order-by field-name="description"/>
+                </entity-options>
+            </drop-down>
+        </field>
+        <!-- ***************** -->
+        <!-- ***   field6  *** -->
+        <!-- ***************** -->
+        <field name="exampleTypeId"
+               title="${uiLabelMap.ExampleDropDownField6Title}"
+               tooltip="${uiLabelMap.ExampleToDo}">
+            <drop-down>
+                <entity-options entity-name="ExampleType"
+                                description="${description}"/>
+            </drop-down>
+        </field>
+        <!-- ***************** -->
+        <!-- ***   field7  *** -->
+        <!-- ***************** -->
+        <field name="field7"
+            title="${uiLabelMap.ExampleDropDownField7Title}"
+            tooltip="${uiLabelMap.ExampleToDo}">
+            <drop-down>
+                <entity-options entity-name="ExampleType"
+                    key-field-name="exampleTypeId"
+                    description="${description}">
+                    <entity-constraint name="exampleTypeId"
+                        value="INSPIRED"
+                        operator="greater"/>
+                    <entity-order-by field-name="description"/>
+                </entity-options>
+            </drop-down>
+        </field>
+        <!-- ****************************** -->
+        <!-- *** Autocomplete dropdown *** -->
+        <!-- ****************************** -->
+        <!-- TODO : return only the Id, else you need to edit the field to remove the description -->
+        <field name="emptyField1" title="${uiLabelMap.CommonEmptyHeader}"><display/></field>
+        <field name="geoId" title="${uiLabelMap.ExampleAutocompleteDropdown}"
+            tooltip="${uiLabelMap.ExampleAutocompleteTooltip}">
+            <drop-down>
+                <auto-complete/>
+                <entity-options entity-name="Geo" description="${geoId}: ${geoName}">
+                    <entity-constraint name="geoTypeId" value="COUNTRY"/>
+                    <entity-order-by field-name="geoName"/>
+                </entity-options>
+            </drop-down>
+        </field>
+        <!-- ****************************** -->
+        <!-- ***   Dependent dropdowns  *** -->
+        <!-- ****************************** -->
+        <field name="emptyField2" title="${uiLabelMap.CommonEmptyHeader}"><display/></field>
+        <field name="dependendDropDownFields" title="${uiLabelMap.ExampleDependentDropDowns}">
+            <display description="${uiLabelMap.ExampleDependentDropDownTooltip}"/>
+        </field>
+        <field name="stateProvinceGeoId" title="${uiLabelMap.CommonState}" widget-style="required"><drop-down allow-empty="false"/></field>
+        <field name="countryGeoId" title="${uiLabelMap.CommonCountry}" tooltip="${uiLabelMap.CommonRequired}" widget-style="required">
+            <drop-down no-current-selected-key="USA">
+                <entity-options entity-name="Geo" key-field-name="geoId" description="${geoName}">
+                    <entity-constraint name="geoTypeId" value="COUNTRY"/>
+                    <entity-order-by field-name="geoName"/>
+                </entity-options>
+            </drop-down>
+        </field>
+    </form>
+    
+        <!-- ****************************** -->
+        <!-- ***   Multiple Dropdown    *** -->
+        <!-- ****************************** -->
+        <!-- See why this is used here http://www.ryancramer.com/journal/entries/select_multiple/ -->
+    <form name="DropDownMultipleFieldExampleForm" type="single" title="">
+        <field name="emptyField1" title="${uiLabelMap.CommonEmptyHeader}"><display/></field>
+        <field name="multipleDropDownFields" title="${uiLabelMap.ExampleMultipleDropDowns}">
+            <display description="${uiLabelMap.ExampleMultipleDropDownTooltip}"/>
+        </field>
+        <field name="countryGeoIdMultiple" title="${uiLabelMap.CommonCountry}">
+            <drop-down no-current-selected-key="USA">
+                <entity-options entity-name="Geo" key-field-name="geoId" description="${geoName}">
+                    <entity-constraint name="geoTypeId" value="COUNTRY"/>
+                    <entity-order-by field-name="geoName"/>
+                </entity-options>
+            </drop-down>
+        </field>        
+    </form>
+
+    <!-- Simple form to print a FOP PDF file with the  fonts available in OFBiz Project -->
+    <form name="FOPFontsExampleForm" type="single" target="printExampleFOPFonts">
+            <field name="printButton" title="${uiLabelMap.ExamplePrintButton}" widget-style="smallSubmit"><submit button-type="button"/></field>
+    </form>
+
+    <form name="FieldGroupExampleForm" type="single" title="">
+        <field name="field1" title="${uiLabelMap.ExampleField} 1"><text/></field>
+        <field name="field2" title="${uiLabelMap.ExampleField} 2"><text/></field>
+        <field name="field3" title="${uiLabelMap.ExampleField} 3"><text/></field>
+        <field name="field4" title="${uiLabelMap.ExampleField} 4"><text/></field>
+        <field name="field5" title="${uiLabelMap.ExampleField} 5"><text/></field>
+        <field name="field6" title="${uiLabelMap.ExampleField} 6"><text/></field>
+        <field name="field7" title="${uiLabelMap.ExampleField} 7"><text/></field>
+        <field name="field8" title="${uiLabelMap.ExampleField} 8"><text/></field>
+        <field name="field9" title="${uiLabelMap.ExampleField} 9"><text/></field>
+        <field name="field10" title="${uiLabelMap.ExampleField} 10"><text/></field>
+        <field name="field11" title="${uiLabelMap.ExampleField} 11"><text/></field>
+        <field name="field12" title="${uiLabelMap.ExampleField} 12"><text/></field>
+        <field name="field13" title="${uiLabelMap.ExampleField} 13"><text/></field>
+        <field name="field14" title="${uiLabelMap.ExampleField} 14"><text/></field>
+        <field name="field14" title="${uiLabelMap.ExampleField} 15"><text/></field>
+
+        <sort-order>
+            <field-group title="${uiLabelMap.ExampleGroupField} 1" collapsible="true" initially-collapsed="true">
+                <sort-field name="field1"/>
+                <sort-field name="field2"/>
+                <sort-field name="field3"/>
+                <sort-field name="field4"/>
+                <sort-field name="field5"/>
+            </field-group>
+
+            <field-group title="${uiLabelMap.ExampleGroupField} 2" collapsible="true">
+                <sort-field name="field6"/>
+                <sort-field name="field7"/>
+                <sort-field name="field8"/>
+                <sort-field name="field9"/>
+                <sort-field name="field10"/>
+            </field-group>
+
+            <field-group title="${uiLabelMap.ExampleGroupField} 3">
+                <sort-field name="field11"/>
+                <sort-field name="field12"/>
+                <sort-field name="field13"/>
+                <sort-field name="field14"/>
+                <sort-field name="field15"/>
+            </field-group>
+        </sort-order>
+
+    </form>
+
+    <!-- Lookup Examples -->
+    <form name="ExampleLookupFields" type="single" title="">
+        <!-- Old style lookup (in a popup window without autocompletion), geoIdAlone because we have another geoId below -->
+        <field name="geoIdAlone" title="${uiLabelMap.CommonGeoId}">
+            <lookup target-form-name="LookupGeo" presentation="window"/>
+        </field>
+        <!-- Standard lookup (in a layer with autocompletion) -->
+        <!-- passes the name in one field and the id in another, passing the id in the other field does not work yet with autocompletion, WIP... -->
+        <field name="geoName" title="${uiLabelMap.CommonGeoName}">
+            <lookup target-form-name="LookupGeoName" description-field-name="geoId"/>
+        </field>
+        <!-- This field may be hidden and the name rendered in geoName using default-value if geoId is known when loading the form-->
+        <field name="geoId" title="${uiLabelMap.CommonGeoId}"><text/></field><!-- the text field is only used for rendering. In the "real life" you would use the hidden field commented below to pass the data to the request  -->
+        <!--field name="geoId"><hidden/></field-->        
+        <sort-order>
+            <field-group>
+                <sort-field name="geoIdAlone"/>
+            </field-group>
+            <field-group>
+                <sort-field name="geoName"/>
+                <sort-field name="geoId"/>
+            </field-group>
+        </sort-order>
+    </form>
+
+    <form name="SelectionBoxesExampleForm" type="single">
+        <field name="ExampleTypeId">
+           <check>
+              <entity-options key-field-name="exampleTypeId" description="${description}" entity-name="ExampleType"/>
+           </check>
+        </field>
+    </form>
+
+</forms>
diff --git a/framework/example/widget/example/FormWidgetExampleScreens.xml b/framework/example/widget/example/FormWidgetExampleScreens.xml
new file mode 100644
index 0000000..8eaba75
--- /dev/null
+++ b/framework/example/widget/example/FormWidgetExampleScreens.xml
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<screens xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/widget-screen.xsd">
+
+    <screen name="FormWidgetExamples">
+        <section>
+            <actions>
+                <set field="headerItem" value="FormWidgetExamples"/>
+            </actions>
+            <widgets>
+                <decorator-screen name="main-decorator" location="${parameters.mainDecoratorLocation}">
+                    <decorator-section name="body">
+                        <section>
+                            <condition>
+                                <if-has-permission permission="EXAMPLE" action="_VIEW"/>
+                            </condition>
+                            <widgets>
+                                <container style="h1"><label>${uiLabelMap.PageTitleFormWidgetExamples}</label></container>
+                                <container style="screenlet-body">
+                                    <container style="button-bar"><label style="h2">${uiLabelMap.ExampleDateTimeFields}</label></container>
+                                    <container style="screenlet-body">
+                                        <label style="h3">${uiLabelMap.ExampleSourceCode}</label>
+                                        <label>${uiLabelMap.ExampleDefinitionName} &quot;DateTimeFieldsExampleForm&quot; ${uiLabelMap.ExampleDefinitionFile}</label>
+                                        <link target="http://svn.apache.org/repos/asf/ofbiz/trunk/framework/example/widget/example/FormWidgetExampleForms.xml" url-mode="plain" target-window="svnPage" text="${uiLabelMap.ExampleDefinitionFileTooltip}" style="buttontext"/>
+                                        <include-form name="DateTimeFieldsExampleForm" location="component://example/widget/example/FormWidgetExampleForms.xml"/>
+                                    </container>
+                                </container>
+                                <container style="screenlet-body">
+                                    <container style="button-bar"><label style="h2">${uiLabelMap.ExampleDropDownFields}</label></container>
+                                    <container style="screenlet-body">
+                                        <label style="h3">${uiLabelMap.ExampleSourceCode}</label>
+                                        <label>${uiLabelMap.ExampleDefinitionName} &quot;DropDownFieldsExampleForm&quot; ${uiLabelMap.ExampleDefinitionFile}</label>
+                                        <link target="http://svn.apache.org/repos/asf/ofbiz/trunk/framework/example/widget/example/FormWidgetExampleForms.xml" url-mode="plain" target-window="svnPage" text="${uiLabelMap.ExampleDefinitionFileTooltip}" style="buttontext"/>
+                                    </container>
+                                    <section>
+                                        <actions>
+                                            <!-- setCountryStatesEventJs.ftl, it's not used here but could be. It's a good example of a reusable template-script with harcoded values which make sense -->
+                                            <!-- fields for setDependentDropdownValuesJs.ftl, it's a try on generalization, if you need an example with more than one dropdown in a form have a look at EditProductPriceRules screen -->
+                                            <set field="dependentForm" value="DropDownFieldsExampleForm"/>
+                                            <set field="paramKey" value="countryGeoId"/>                                            
+                                            <set field="mainId" value="countryGeoId"/>
+                                            <set field="dependentId" value="stateProvinceGeoId"/>
+                                            <set field="requestName" value="getAssociatedStateList"/>
+                                            <set field="responseName" value="stateList"/>
+                                            <set field="dependentKeyName" value="geoId"/>
+                                            <set field="descName" value="geoName"/>
+                                            <set field="selectedDependentOption" from-field="postalAddress.stateProvinceGeoId" default-value="_none_"/><!-- postalAddress.stateProvinceGeoId does not make much sense here, only to get the idea -->
+                                            
+                                            <!-- asmslect parameters, must be prefixed by asm_ for setMultipleSelectJs.ftl -->
+                                            <set field="asm_multipleSelectForm" value="DropDownMultipleFieldExampleForm"/>
+                                            <set field="asm_multipleSelect"  value="DropDownMultipleFieldExampleForm_countryGeoIdMultiple"/>
+                                            <set field="asm_formSize" value="600"/>
+                                            <set field="asm_asmListItemPercentOfForm" value="95"/>
+                                            <set field="asm_sortable" value="false"/>                                            
+                                        </actions>
+                                        <widgets>
+                                            <!--platform-specific><html><html-template location="component://common/webcommon/includes/setCountryStatesEventJs.ftl"/></html></platform-specific-->
+                                            <platform-specific><html><html-template location="component://common/webcommon/includes/setDependentDropdownValuesJs.ftl"/></html></platform-specific>
+                                            <platform-specific><html><html-template location="component://common/webcommon/includes/setMultipleSelectJs.ftl"/></html></platform-specific>
+                                            <include-form name="DropDownFieldsExampleForm" location="component://example/widget/example/FormWidgetExampleForms.xml"/>
+                                            <include-form name="DropDownMultipleFieldExampleForm" location="component://example/widget/example/FormWidgetExampleForms.xml"/>
+                                        </widgets>
+                                    </section>
+                                </container>
+                                <container style="screenlet-body">
+                                    <container style="button-bar"><label style="h2">${uiLabelMap.ExampleLookupFieldsTitle}</label></container>
+                                        <container style="screenlet-body">
+                                            <label style="h3">${uiLabelMap.ExampleSourceCode}</label>
+                                            <label>${uiLabelMap.ExampleDefinitionName} &quot;ExampleLookupFields&quot; ${uiLabelMap.ExampleDefinitionFile}</label>
+                                            <link target="http://svn.apache.org/repos/asf/ofbiz/trunk/framework/example/widget/example/FormWidgetExampleForms.xml" url-mode="plain" target-window="svnPage" text="${uiLabelMap.ExampleDefinitionFileTooltip}" style="buttontext"/>
+                                            <label>${uiLabelMap.ExampleLookupFields}</label>
+                                            <include-form name="ExampleLookupFields" location="component://example/widget/example/FormWidgetExampleForms.xml"/>
+                                        </container>
+                                </container>
+                                <container style="screenlet-body">
+                                    <container style="button-bar"><label style="h2">${uiLabelMap.ExampleGroupFields}</label></container>
+                                    <container style="screenlet-body">
+                                        <label style="h3">${uiLabelMap.ExampleSourceCode}</label>
+                                        <label>${uiLabelMap.ExampleDefinitionName} &quot;FieldGroupExampleForm&quot; ${uiLabelMap.ExampleDefinitionFile}</label>
+                                        <link target="http://svn.apache.org/repos/asf/ofbiz/trunk/framework/example/widget/example/FormWidgetExampleForms.xml" url-mode="plain" target-window="svnPage" text="${uiLabelMap.ExampleDefinitionFileTooltip}" style="buttontext"/>
+                                        <container style="button-bar">
+                                            <link target="javascript:expandAll(true);"  text="${uiLabelMap.CommonExpandAll}" style="buttontext expand-all" url-mode="plain"/>
+                                            <link target="javascript:expandAll(false);" text="${uiLabelMap.CommonCollapseAll}" style="buttontext collapse-all" url-mode="plain"/>
+                                        </container>
+                                        <include-form name="FieldGroupExampleForm" location="component://example/widget/example/FormWidgetExampleForms.xml"/>
+                                    </container>
+                                </container>
+                                <container style="screenlet-body">
+                                    <container style="button-bar"><label style="h2">${uiLabelMap.ExampleSelectionBoxes}</label></container>
+                                    <container style="screenlet-body">
+                                        <label style="h3">${uiLabelMap.ExampleSourceCode}</label>
+                                        <label>${uiLabelMap.ExampleDefinitionName} &quot;SelectionBoxesExampleForm&quot; ${uiLabelMap.ExampleDefinitionFile}</label>
+                                        <link target="http://svn.apache.org/repos/asf/ofbiz/trunk/framework/example/widget/example/FormWidgetExampleForms.xml" url-mode="plain" target-window="svnPage" text="${uiLabelMap.ExampleDefinitionFileTooltip}" style="buttontext"/>
+                                        <include-form name="SelectionBoxesExampleForm" location="component://example/widget/example/FormWidgetExampleForms.xml"/>
+                                    </container>
+                                </container>
+                                <container style="screenlet-body">
+                                    <container style="button-bar"><label style="h2">${uiLabelMap.ExamplePrintButton}</label></container>
+                                    <container style="screenlet-body">
+                                        <label>${uiLabelMap.ExampleFopFonts}</label>
+                                    </container>
+                                    <include-form name="FOPFontsExampleForm" location="component://example/widget/example/FormWidgetExampleForms.xml"/>
+                                </container>
+                            </widgets>
+                            <fail-widgets>
+                                <label style="h3">${uiLabelMap.ExampleViewPermissionError}</label>
+                            </fail-widgets>
+                        </section>
+                    </decorator-section>
+                </decorator-screen>
+            </widgets>
+        </section>
+    </screen>
+    <screen name="printExampleFOPFonts">
+        <section>
+            <widgets>
+                <platform-specific><xsl-fo><html-template location="component://example/webapp/example/reports/fonts.fo.ftl"/></xsl-fo></platform-specific>
+            </widgets>
+        </section>
+    </screen>
+</screens>
diff --git a/framework/example/widget/example/PortletEditForms.xml b/framework/example/widget/example/PortletEditForms.xml
new file mode 100644
index 0000000..590bc4e
--- /dev/null
+++ b/framework/example/widget/example/PortletEditForms.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<forms xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/widget-form.xsd">
+
+    <form name="ExamplePortlet1Edit" extends="CommonPortletEdit" extends-resource="component://common/widget/PortletEditForms.xml">
+        <field name="ItemsToShow">
+            <drop-down allow-empty="false">
+                <option key="5"/>
+                <option key="15"/>
+                <option key="20"/>
+                <option key="25"/>
+                <option key="30"/>
+                <option key="35"/>
+            </drop-down>
+        </field>
+        <field name="SpecificTitle">
+            <text/>
+        </field>
+        <field name="updateButton"><submit/></field>
+    </form>
+
+    <form name="ExamplePortlet2Edit" extends="CommonPortletEdit" extends-resource="component://common/widget/PortletEditForms.xml">
+        <field name="nextPortalPageId">
+            <lookup target-form-name="LookupPortalPage"/>
+        </field>
+        <field name="nextParentPortalPageId">
+            <lookup target-form-name="LookupPortalPage"/>
+        </field>
+        <field name="updateButton"><submit/></field>
+    </form>
+    
+    <form name="ExamplePortlet3Edit" extends="CommonPortletEdit" extends-resource="component://common/widget/PortletEditForms.xml">
+        <field name="SpecificTitle">
+            <text/>
+        </field>
+        <field name="SpecificSubTitle">
+            <text/>
+        </field>
+        <field name="updateButton"><submit/></field>
+    </form>
+
+</forms>
diff --git a/framework/example/widget/example/PortletScreens.xml b/framework/example/widget/example/PortletScreens.xml
new file mode 100644
index 0000000..444e67b
--- /dev/null
+++ b/framework/example/widget/example/PortletScreens.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<screens xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/widget-screen.xsd">
+
+    <screen name="ExamplePortlet1">
+        <section>
+            <actions>
+                <property-map resource="ExampleUiLabels" map-name="uiLabelMap" global="true"/>
+            </actions>
+            <widgets>
+                <screenlet title="${uiLabelMap.ExamplePortletFirst}">
+                    <section>
+                        <condition>
+                            <not><if-empty field="SpecificTitle"/></not>
+                        </condition>
+                        <widgets>
+                            <label style="h2">${SpecificTitle}</label>
+                        </widgets>
+                        <fail-widgets>
+                            <label style="h2">${uiLabelMap.ExampleNoAttributeSet}</label>
+                        </fail-widgets>
+                    </section>
+                </screenlet>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="ExamplePortlet2">
+        <section>
+            <actions>
+                <property-map resource="ExampleUiLabels" map-name="uiLabelMap" global="true"/>   
+                <set field="nextPortalPageId" from-field="nextPortalPageId" default-value=""/>
+                <set field="nextParentPortalPageId" from-field="nextParentPortalPageId" default-value="EXAMPLE"/>             
+            </actions>
+            <widgets>
+                <screenlet title="${uiLabelMap.ExamplePortletSecond}">
+                    <section>
+                        <condition><not><if-empty field="nextPortalPageId"/></not></condition>
+                       <widgets>
+                           <link target="showPortalPage" text="${uiLabelMap.ExamplePortletGoToConfiguredPortalPage} : ${nextPortalPageId} ${uiLabelMap.CommonOf} ${nextParentPortalPageId}" >
+                               <parameter param-name="portalPageId" from-field="nextPortalPageId"/>
+                               <parameter param-name="parentPortalPageId" from-field="nextParentPortalPageId"/>
+                               <image src="${iconsLocation}/application_go.png"/>
+                           </link>
+                       </widgets>
+                       <fail-widgets>
+                           <link target="editPortalPortletAttributes" text="${uiLabelMap.ExamplePortletAttributNeedToBeDefineClickHere}" >
+                               <parameter param-name="portalPageId" from-field="parameters.portalPageId"/>
+                               <parameter param-name="portalPortletId" value="EXAMPLE_2"/>
+                               <parameter param-name="portletSeqId" value="00001"/>
+                               <image src="${iconsLocation}/wrench_orange.png"/>
+                           </link>
+                       </fail-widgets>
+                    </section>
+                </screenlet>
+            </widgets>
+        </section>
+    </screen>
+
+    <screen name="ExamplePortlet3">
+        <section>
+            <actions>
+                <property-map resource="ExampleUiLabels" map-name="uiLabelMap" global="true"/>
+            </actions>
+            <widgets>
+                <screenlet title="${uiLabelMap.ExamplePortletThird}">
+                    <container style="leftclear">
+                        <label style="h1" text="${uiLabelMap.ExamplePortletThird}"/>
+                    </container>
+                    <container style="leftclear">
+                        <label style="h2" text="${uiLabelMap.ExamplePortletSpecificTitle}: ${SpecificTitle}"/>
+                    </container>
+                    <container style="leftclear">
+                        <label style="h2" text="${uiLabelMap.ExamplePortletSpecificSubTitle}: ${SpecificSubTitle}"/>
+                    </container>
+                </screenlet>
+            </widgets>
+        </section>
+    </screen>
+</screens>
diff --git a/framework/images/webapp/images/jquery/jquery-1.5.1.js b/framework/images/webapp/images/jquery/jquery-1.5.1.js
new file mode 100644
index 0000000..7932fc7
--- /dev/null
+++ b/framework/images/webapp/images/jquery/jquery-1.5.1.js
@@ -0,0 +1,8316 @@
+/*!
+ * jQuery JavaScript Library v1.5.1
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Wed Feb 23 13:55:29 2011 -0500
+ */
+(function( window, undefined ) {
+
+// Use the correct document accordingly with window argument (sandbox)
+var document = window.document;
+var jQuery = (function() {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// A simple way to check for HTML strings or ID strings
+	// (both of which we optimize for)
+	quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,
+
+	// Check if a string has a non-whitespace character in it
+	rnotwhite = /\S/,
+
+	// Used for trimming whitespace
+	trimLeft = /^\s+/,
+	trimRight = /\s+$/,
+
+	// Check for digits
+	rdigit = /\d/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+
+	// Useragent RegExp
+	rwebkit = /(webkit)[ \/]([\w.]+)/,
+	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+	rmsie = /(msie) ([\w.]+)/,
+	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+
+	// Keep a UserAgent string for use with jQuery.browser
+	userAgent = navigator.userAgent,
+
+	// For matching the engine and version of the browser
+	browserMatch,
+
+	// Has the ready events already been bound?
+	readyBound = false,
+
+	// The deferred used on DOM ready
+	readyList,
+
+	// Promise methods
+	promiseMethods = "then done fail isResolved isRejected promise".split( " " ),
+
+	// The ready event handler
+	DOMContentLoaded,
+
+	// Save a reference to some core methods
+	toString = Object.prototype.toString,
+	hasOwn = Object.prototype.hasOwnProperty,
+	push = Array.prototype.push,
+	slice = Array.prototype.slice,
+	trim = String.prototype.trim,
+	indexOf = Array.prototype.indexOf,
+
+	// [[Class]] -> type pairs
+	class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem, ret, doc;
+
+		// Handle $(""), $(null), or $(undefined)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// The body element only exists once, optimize finding it
+		if ( selector === "body" && !context && document.body ) {
+			this.context = document;
+			this[0] = document.body;
+			this.selector = "body";
+			this.length = 1;
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			// Are we dealing with HTML string or an ID?
+			match = quickExpr.exec( selector );
+
+			// Verify a match, and that no context was specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+					doc = (context ? context.ownerDocument || context : document);
+
+					// If a single string is passed in and it's a single tag
+					// just do a createElement and skip the rest
+					ret = rsingleTag.exec( selector );
+
+					if ( ret ) {
+						if ( jQuery.isPlainObject( context ) ) {
+							selector = [ document.createElement( ret[1] ) ];
+							jQuery.fn.attr.call( selector, context, true );
+
+						} else {
+							selector = [ doc.createElement( ret[1] ) ];
+						}
+
+					} else {
+						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+						selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
+					}
+
+					return jQuery.merge( this, selector );
+
+				// HANDLE: $("#id")
+				} else {
+					elem = document.getElementById( match[2] );
+
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we inject the element directly into the jQuery object
+						this.length = 1;
+						this[0] = elem;
+					}
+
+					this.context = document;
+					this.selector = selector;
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return (context || rootjQuery).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return rootjQuery.ready( selector );
+		}
+
+		if (selector.selector !== undefined) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return jQuery.makeArray( selector, this );
+	},
+
+	// Start with an empty selector
+	selector: "",
+
+	// The current version of jQuery being used
+	jquery: "1.5.1",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	toArray: function() {
+		return slice.call( this, 0 );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num == null ?
+
+			// Return a 'clean' array
+			this.toArray() :
+
+			// Return just the object
+			( num < 0 ? this[ this.length + num ] : this[ num ] );
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems, name, selector ) {
+		// Build a new jQuery matched element set
+		var ret = this.constructor();
+
+		if ( jQuery.isArray( elems ) ) {
+			push.apply( ret, elems );
+
+		} else {
+			jQuery.merge( ret, elems );
+		}
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		ret.context = this.context;
+
+		if ( name === "find" ) {
+			ret.selector = this.selector + (this.selector ? " " : "") + selector;
+		} else if ( name ) {
+			ret.selector = this.selector + "." + name + "(" + selector + ")";
+		}
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
+	},
+
+	ready: function( fn ) {
+		// Attach the listeners
+		jQuery.bindReady();
+
+		// Add the callback
+		readyList.done( fn );
+
+		return this;
+	},
+
+	eq: function( i ) {
+		return i === -1 ?
+			this.slice( i ) :
+			this.slice( i, +i + 1 );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ),
+			"slice", slice.call(arguments).join(",") );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor(null);
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: push,
+	sort: [].sort,
+	splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[0] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+		target = {};
+	}
+
+	// extend jQuery itself if only one argument is passed
+	if ( length === i ) {
+		target = this;
+		--i;
+	}
+
+	for ( ; i < length; i++ ) {
+		// Only deal with non-null/undefined values
+		if ( (options = arguments[ i ]) != null ) {
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && jQuery.isArray(src) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject(src) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend({
+	noConflict: function( deep ) {
+		window.$ = _$;
+
+		if ( deep ) {
+			window.jQuery = _jQuery;
+		}
+
+		return jQuery;
+	},
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+		// A third-party is pushing the ready event forwards
+		if ( wait === true ) {
+			jQuery.readyWait--;
+		}
+
+		// Make sure that the DOM is not already loaded
+		if ( !jQuery.readyWait || (wait !== true && !jQuery.isReady) ) {
+			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+			if ( !document.body ) {
+				return setTimeout( jQuery.ready, 1 );
+			}
+
+			// Remember that the DOM is ready
+			jQuery.isReady = true;
+
+			// If a normal DOM Ready event fired, decrement, and wait if need be
+			if ( wait !== true && --jQuery.readyWait > 0 ) {
+				return;
+			}
+
+			// If there are functions bound, to execute
+			readyList.resolveWith( document, [ jQuery ] );
+
+			// Trigger any bound ready events
+			if ( jQuery.fn.trigger ) {
+				jQuery( document ).trigger( "ready" ).unbind( "ready" );
+			}
+		}
+	},
+
+	bindReady: function() {
+		if ( readyBound ) {
+			return;
+		}
+
+		readyBound = true;
+
+		// Catch cases where $(document).ready() is called after the
+		// browser event has already occurred.
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			return setTimeout( jQuery.ready, 1 );
+		}
+
+		// Mozilla, Opera and webkit nightlies currently support this event
+		if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", jQuery.ready, false );
+
+		// If IE event model is used
+		} else if ( document.attachEvent ) {
+			// ensure firing before onload,
+			// maybe late but safe also for iframes
+			document.attachEvent("onreadystatechange", DOMContentLoaded);
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", jQuery.ready );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var toplevel = false;
+
+			try {
+				toplevel = window.frameElement == null;
+			} catch(e) {}
+
+			if ( document.documentElement.doScroll && toplevel ) {
+				doScrollCheck();
+			}
+		}
+	},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return jQuery.type(obj) === "function";
+	},
+
+	isArray: Array.isArray || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	// A crude way of determining if an object is a window
+	isWindow: function( obj ) {
+		return obj && typeof obj === "object" && "setInterval" in obj;
+	},
+
+	isNaN: function( obj ) {
+		return obj == null || !rdigit.test( obj ) || isNaN( obj );
+	},
+
+	type: function( obj ) {
+		return obj == null ?
+			String( obj ) :
+			class2type[ toString.call(obj) ] || "object";
+	},
+
+	isPlainObject: function( obj ) {
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		// Not own constructor property must be Object
+		if ( obj.constructor &&
+			!hasOwn.call(obj, "constructor") &&
+			!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+			return false;
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+
+		var key;
+		for ( key in obj ) {}
+
+		return key === undefined || hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		for ( var name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw msg;
+	},
+
+	parseJSON: function( data ) {
+		if ( typeof data !== "string" || !data ) {
+			return null;
+		}
+
+		// Make sure leading/trailing whitespace is removed (IE can't handle it)
+		data = jQuery.trim( data );
+
+		// Make sure the incoming data is actual JSON
+		// Logic borrowed from http://json.org/json2.js
+		if ( rvalidchars.test(data.replace(rvalidescape, "@")
+			.replace(rvalidtokens, "]")
+			.replace(rvalidbraces, "")) ) {
+
+			// Try to use the native JSON parser first
+			return window.JSON && window.JSON.parse ?
+				window.JSON.parse( data ) :
+				(new Function("return " + data))();
+
+		} else {
+			jQuery.error( "Invalid JSON: " + data );
+		}
+	},
+
+	// Cross-browser xml parsing
+	// (xml & tmp used internally)
+	parseXML: function( data , xml , tmp ) {
+
+		if ( window.DOMParser ) { // Standard
+			tmp = new DOMParser();
+			xml = tmp.parseFromString( data , "text/xml" );
+		} else { // IE
+			xml = new ActiveXObject( "Microsoft.XMLDOM" );
+			xml.async = "false";
+			xml.loadXML( data );
+		}
+
+		tmp = xml.documentElement;
+
+		if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evalulates a script in a global context
+	globalEval: function( data ) {
+		if ( data && rnotwhite.test(data) ) {
+			// Inspired by code by Andrea Giammarchi
+			// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
+			var head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement,
+				script = document.createElement( "script" );
+
+			if ( jQuery.support.scriptEval() ) {
+				script.appendChild( document.createTextNode( data ) );
+			} else {
+				script.text = data;
+			}
+
+			// Use insertBefore instead of appendChild to circumvent an IE6 bug.
+			// This arises when a base node is used (#2709).
+			head.insertBefore( script, head.firstChild );
+			head.removeChild( script );
+		}
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+	},
+
+	// args is for internal usage only
+	each: function( object, callback, args ) {
+		var name, i = 0,
+			length = object.length,
+			isObj = length === undefined || jQuery.isFunction(object);
+
+		if ( args ) {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.apply( object[ name ], args ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.apply( object[ i++ ], args ) === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( var value = object[0];
+					i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
+			}
+		}
+
+		return object;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: trim ?
+		function( text ) {
+			return text == null ?
+				"" :
+				trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		function( text ) {
+			return text == null ?
+				"" :
+				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+		},
+
+	// results is for internal usage only
+	makeArray: function( array, results ) {
+		var ret = results || [];
+
+		if ( array != null ) {
+			// The window, strings (and functions) also have 'length'
+			// The extra typeof function check is to prevent crashes
+			// in Safari 2 (See: #3039)
+			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+			var type = jQuery.type(array);
+
+			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+				push.call( ret, array );
+			} else {
+				jQuery.merge( ret, array );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, array ) {
+		if ( array.indexOf ) {
+			return array.indexOf( elem );
+		}
+
+		for ( var i = 0, length = array.length; i < length; i++ ) {
+			if ( array[ i ] === elem ) {
+				return i;
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var i = first.length,
+			j = 0;
+
+		if ( typeof second.length === "number" ) {
+			for ( var l = second.length; j < l; j++ ) {
+				first[ i++ ] = second[ j ];
+			}
+
+		} else {
+			while ( second[j] !== undefined ) {
+				first[ i++ ] = second[ j++ ];
+			}
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, inv ) {
+		var ret = [], retVal;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( var i = 0, length = elems.length; i < length; i++ ) {
+			retVal = !!callback( elems[ i ], i );
+			if ( inv !== retVal ) {
+				ret.push( elems[ i ] );
+			}
+		}
+
+		return ret;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var ret = [], value;
+
+		// Go through the array, translating each of the items to their
+		// new value (or values).
+		for ( var i = 0, length = elems.length; i < length; i++ ) {
+			value = callback( elems[ i ], i, arg );
+
+			if ( value != null ) {
+				ret[ ret.length ] = value;
+			}
+		}
+
+		// Flatten any nested arrays
+		return ret.concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	proxy: function( fn, proxy, thisObject ) {
+		if ( arguments.length === 2 ) {
+			if ( typeof proxy === "string" ) {
+				thisObject = fn;
+				fn = thisObject[ proxy ];
+				proxy = undefined;
+
+			} else if ( proxy && !jQuery.isFunction( proxy ) ) {
+				thisObject = proxy;
+				proxy = undefined;
+			}
+		}
+
+		if ( !proxy && fn ) {
+			proxy = function() {
+				return fn.apply( thisObject || this, arguments );
+			};
+		}
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		if ( fn ) {
+			proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+		}
+
+		// So proxy can be declared as an argument
+		return proxy;
+	},
+
+	// Mutifunctional method to get and set values to a collection
+	// The value/s can be optionally by executed if its a function
+	access: function( elems, key, value, exec, fn, pass ) {
+		var length = elems.length;
+
+		// Setting many attributes
+		if ( typeof key === "object" ) {
+			for ( var k in key ) {
+				jQuery.access( elems, k, key[k], exec, fn, value );
+			}
+			return elems;
+		}
+
+		// Setting one attribute
+		if ( value !== undefined ) {
+			// Optionally, function values get executed if exec is true
+			exec = !pass && exec && jQuery.isFunction(value);
+
+			for ( var i = 0; i < length; i++ ) {
+				fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+			}
+
+			return elems;
+		}
+
+		// Getting an attribute
+		return length ? fn( elems[0], key ) : undefined;
+	},
+
+	now: function() {
+		return (new Date()).getTime();
+	},
+
+	// Create a simple deferred (one callbacks list)
+	_Deferred: function() {
+		var // callbacks list
+			callbacks = [],
+			// stored [ context , args ]
+			fired,
+			// to avoid firing when already doing so
+			firing,
+			// flag to know if the deferred has been cancelled
+			cancelled,
+			// the deferred itself
+			deferred  = {
+
+				// done( f1, f2, ...)
+				done: function() {
+					if ( !cancelled ) {
+						var args = arguments,
+							i,
+							length,
+							elem,
+							type,
+							_fired;
+						if ( fired ) {
+							_fired = fired;
+							fired = 0;
+						}
+						for ( i = 0, length = args.length; i < length; i++ ) {
+							elem = args[ i ];
+							type = jQuery.type( elem );
+							if ( type === "array" ) {
+								deferred.done.apply( deferred, elem );
+							} else if ( type === "function" ) {
+								callbacks.push( elem );
+							}
+						}
+						if ( _fired ) {
+							deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
+						}
+					}
+					return this;
+				},
+
+				// resolve with given context and args
+				resolveWith: function( context, args ) {
+					if ( !cancelled && !fired && !firing ) {
+						firing = 1;
+						try {
+							while( callbacks[ 0 ] ) {
+								callbacks.shift().apply( context, args );
+							}
+						}
+						// We have to add a catch block for
+						// IE prior to 8 or else the finally
+						// block will never get executed
+						catch (e) {
+							throw e;
+						}
+						finally {
+							fired = [ context, args ];
+							firing = 0;
+						}
+					}
+					return this;
+				},
+
+				// resolve with this as context and given arguments
+				resolve: function() {
+					deferred.resolveWith( jQuery.isFunction( this.promise ) ? this.promise() : this, arguments );
+					return this;
+				},
+
+				// Has this deferred been resolved?
+				isResolved: function() {
+					return !!( firing || fired );
+				},
+
+				// Cancel
+				cancel: function() {
+					cancelled = 1;
+					callbacks = [];
+					return this;
+				}
+			};
+
+		return deferred;
+	},
+
+	// Full fledged deferred (two callbacks list)
+	Deferred: function( func ) {
+		var deferred = jQuery._Deferred(),
+			failDeferred = jQuery._Deferred(),
+			promise;
+		// Add errorDeferred methods, then and promise
+		jQuery.extend( deferred, {
+			then: function( doneCallbacks, failCallbacks ) {
+				deferred.done( doneCallbacks ).fail( failCallbacks );
+				return this;
+			},
+			fail: failDeferred.done,
+			rejectWith: failDeferred.resolveWith,
+			reject: failDeferred.resolve,
+			isRejected: failDeferred.isResolved,
+			// Get a promise for this deferred
+			// If obj is provided, the promise aspect is added to the object
+			promise: function( obj ) {
+				if ( obj == null ) {
+					if ( promise ) {
+						return promise;
+					}
+					promise = obj = {};
+				}
+				var i = promiseMethods.length;
+				while( i-- ) {
+					obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
+				}
+				return obj;
+			}
+		} );
+		// Make sure only one callback list will be used
+		deferred.done( failDeferred.cancel ).fail( deferred.cancel );
+		// Unexpose cancel
+		delete deferred.cancel;
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( object ) {
+		var lastIndex = arguments.length,
+			deferred = lastIndex <= 1 && object && jQuery.isFunction( object.promise ) ?
+				object :
+				jQuery.Deferred(),
+			promise = deferred.promise();
+
+		if ( lastIndex > 1 ) {
+			var array = slice.call( arguments, 0 ),
+				count = lastIndex,
+				iCallback = function( index ) {
+					return function( value ) {
+						array[ index ] = arguments.length > 1 ? slice.call( arguments, 0 ) : value;
+						if ( !( --count ) ) {
+							deferred.resolveWith( promise, array );
+						}
+					};
+				};
+			while( ( lastIndex-- ) ) {
+				object = array[ lastIndex ];
+				if ( object && jQuery.isFunction( object.promise ) ) {
+					object.promise().then( iCallback(lastIndex), deferred.reject );
+				} else {
+					--count;
+				}
+			}
+			if ( !count ) {
+				deferred.resolveWith( promise, array );
+			}
+		} else if ( deferred !== object ) {
+			deferred.resolve( object );
+		}
+		return promise;
+	},
+
+	// Use of jQuery.browser is frowned upon.
+	// More details: http://docs.jquery.com/Utilities/jQuery.browser
+	uaMatch: function( ua ) {
+		ua = ua.toLowerCase();
+
+		var match = rwebkit.exec( ua ) ||
+			ropera.exec( ua ) ||
+			rmsie.exec( ua ) ||
+			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+			[];
+
+		return { browser: match[1] || "", version: match[2] || "0" };
+	},
+
+	sub: function() {
+		function jQuerySubclass( selector, context ) {
+			return new jQuerySubclass.fn.init( selector, context );
+		}
+		jQuery.extend( true, jQuerySubclass, this );
+		jQuerySubclass.superclass = this;
+		jQuerySubclass.fn = jQuerySubclass.prototype = this();
+		jQuerySubclass.fn.constructor = jQuerySubclass;
+		jQuerySubclass.subclass = this.subclass;
+		jQuerySubclass.fn.init = function init( selector, context ) {
+			if ( context && context instanceof jQuery && !(context instanceof jQuerySubclass) ) {
+				context = jQuerySubclass(context);
+			}
+
+			return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass );
+		};
+		jQuerySubclass.fn.init.prototype = jQuerySubclass.fn;
+		var rootjQuerySubclass = jQuerySubclass(document);
+		return jQuerySubclass;
+	},
+
+	browser: {}
+});
+
+// Create readyList deferred
+readyList = jQuery._Deferred();
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+	jQuery.browser[ browserMatch.browser ] = true;
+	jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+	jQuery.browser.safari = true;
+}
+
+if ( indexOf ) {
+	jQuery.inArray = function( elem, array ) {
+		return indexOf.call( array, elem );
+	};
+}
+
+// IE doesn't match non-breaking spaces with \s
+if ( rnotwhite.test( "\xA0" ) ) {
+	trimLeft = /^[\s\xA0]+/;
+	trimRight = /[\s\xA0]+$/;
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+	DOMContentLoaded = function() {
+		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+		jQuery.ready();
+	};
+
+} else if ( document.attachEvent ) {
+	DOMContentLoaded = function() {
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( document.readyState === "complete" ) {
+			document.detachEvent( "onreadystatechange", DOMContentLoaded );
+			jQuery.ready();
+		}
+	};
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+	if ( jQuery.isReady ) {
+		return;
+	}
+
+	try {
+		// If IE is used, use the trick by Diego Perini
+		// http://javascript.nwbox.com/IEContentLoaded/
+		document.documentElement.doScroll("left");
+	} catch(e) {
+		setTimeout( doScrollCheck, 1 );
+		return;
+	}
+
+	// and execute any waiting functions
+	jQuery.ready();
+}
+
+// Expose jQuery to the global object
+return jQuery;
+
+})();
+
+
+(function() {
+
+	jQuery.support = {};
+
+	var div = document.createElement("div");
+
+	div.style.display = "none";
+	div.innerHTML = "   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+
+	var all = div.getElementsByTagName("*"),
+		a = div.getElementsByTagName("a")[0],
+		select = document.createElement("select"),
+		opt = select.appendChild( document.createElement("option") ),
+		input = div.getElementsByTagName("input")[0];
+
+	// Can't get basic test support
+	if ( !all || !all.length || !a ) {
+		return;
+	}
+
+	jQuery.support = {
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: div.firstChild.nodeType === 3,
+
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName("tbody").length,
+
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName("link").length,
+
+		// Get the style information from getAttribute
+		// (IE uses .cssText insted)
+		style: /red/.test( a.getAttribute("style") ),
+
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: a.getAttribute("href") === "/a",
+
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		// Use a regex to work around a WebKit issue. See #5145
+		opacity: /^0.55$/.test( a.style.opacity ),
+
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Make sure that if no value is specified for a checkbox
+		// that it defaults to "on".
+		// (WebKit defaults to "" instead)
+		checkOn: input.value === "on",
+
+		// Make sure that a selected-by-default option has a working selected property.
+		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+		optSelected: opt.selected,
+
+		// Will be defined later
+		deleteExpando: true,
+		optDisabled: false,
+		checkClone: false,
+		noCloneEvent: true,
+		noCloneChecked: true,
+		boxModel: null,
+		inlineBlockNeedsLayout: false,
+		shrinkWrapBlocks: false,
+		reliableHiddenOffsets: true
+	};
+
+	input.checked = true;
+	jQuery.support.noCloneChecked = input.cloneNode( true ).checked;
+
+	// Make sure that the options inside disabled selects aren't marked as disabled
+	// (WebKit marks them as diabled)
+	select.disabled = true;
+	jQuery.support.optDisabled = !opt.disabled;
+
+	var _scriptEval = null;
+	jQuery.support.scriptEval = function() {
+		if ( _scriptEval === null ) {
+			var root = document.documentElement,
+				script = document.createElement("script"),
+				id = "script" + jQuery.now();
+
+			try {
+				script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
+			} catch(e) {}
+
+			root.insertBefore( script, root.firstChild );
+
+			// Make sure that the execution of code works by injecting a script
+			// tag with appendChild/createTextNode
+			// (IE doesn't support this, fails, and uses .text instead)
+			if ( window[ id ] ) {
+				_scriptEval = true;
+				delete window[ id ];
+			} else {
+				_scriptEval = false;
+			}
+
+			root.removeChild( script );
+			// release memory in IE
+			root = script = id  = null;
+		}
+
+		return _scriptEval;
+	};
+
+	// Test to see if it's possible to delete an expando from an element
+	// Fails in Internet Explorer
+	try {
+		delete div.test;
+
+	} catch(e) {
+		jQuery.support.deleteExpando = false;
+	}
+
+	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+		div.attachEvent("onclick", function click() {
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			jQuery.support.noCloneEvent = false;
+			div.detachEvent("onclick", click);
+		});
+		div.cloneNode(true).fireEvent("onclick");
+	}
+
+	div = document.createElement("div");
+	div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";
+
+	var fragment = document.createDocumentFragment();
+	fragment.appendChild( div.firstChild );
+
+	// WebKit doesn't clone checked state correctly in fragments
+	jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
+
+	// Figure out if the W3C box model works as expected
+	// document.body must exist before we can do this
+	jQuery(function() {
+		var div = document.createElement("div"),
+			body = document.getElementsByTagName("body")[0];
+
+		// Frameset documents with no body should not run this code
+		if ( !body ) {
+			return;
+		}
+
+		div.style.width = div.style.paddingLeft = "1px";
+		body.appendChild( div );
+		jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
+
+		if ( "zoom" in div.style ) {
+			// Check if natively block-level elements act like inline-block
+			// elements when setting their display to 'inline' and giving
+			// them layout
+			// (IE < 8 does this)
+			div.style.display = "inline";
+			div.style.zoom = 1;
+			jQuery.support.inlineBlockNeedsLayout = div.offsetWidth === 2;
+
+			// Check if elements with layout shrink-wrap their children
+			// (IE 6 does this)
+			div.style.display = "";
+			div.innerHTML = "<div style='width:4px;'></div>";
+			jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2;
+		}
+
+		div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
+		var tds = div.getElementsByTagName("td");
+
+		// Check if table cells still have offsetWidth/Height when they are set
+		// to display:none and there are still other visible table cells in a
+		// table row; if so, offsetWidth/Height are not reliable for use when
+		// determining if an element has been hidden directly using
+		// display:none (it is still safe to use offsets if a parent element is
+		// hidden; don safety goggles and see bug #4512 for more information).
+		// (only IE 8 fails this test)
+		jQuery.support.reliableHiddenOffsets = tds[0].offsetHeight === 0;
+
+		tds[0].style.display = "";
+		tds[1].style.display = "none";
+
+		// Check if empty table cells still have offsetWidth/Height
+		// (IE < 8 fail this test)
+		jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0;
+		div.innerHTML = "";
+
+		body.removeChild( div ).style.display = "none";
+		div = tds = null;
+	});
+
+	// Technique from Juriy Zaytsev
+	// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
+	var eventSupported = function( eventName ) {
+		var el = document.createElement("div");
+		eventName = "on" + eventName;
+
+		// We only care about the case where non-standard event systems
+		// are used, namely in IE. Short-circuiting here helps us to
+		// avoid an eval call (in setAttribute) which can cause CSP
+		// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+		if ( !el.attachEvent ) {
+			return true;
+		}
+
+		var isSupported = (eventName in el);
+		if ( !isSupported ) {
+			el.setAttribute(eventName, "return;");
+			isSupported = typeof el[eventName] === "function";
+		}
+		el = null;
+
+		return isSupported;
+	};
+
+	jQuery.support.submitBubbles = eventSupported("submit");
+	jQuery.support.changeBubbles = eventSupported("change");
+
+	// release memory in IE
+	div = all = a = null;
+})();
+
+
+
+var rbrace = /^(?:\{.*\}|\[.*\])$/;
+
+jQuery.extend({
+	cache: {},
+
+	// Please use with caution
+	uuid: 0,
+
+	// Unique for each copy of jQuery on the page
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"embed": true,
+		// Ban all objects except for Flash (which handle expandos)
+		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+		"applet": true
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache,
+
+			// We have to handle DOM nodes and JS objects differently because IE6-7
+			// can't GC object references properly across the DOM-JS boundary
+			isNode = elem.nodeType,
+
+			// Only DOM nodes need the global jQuery cache; JS object data is
+			// attached directly to the object so GC can occur automatically
+			cache = isNode ? jQuery.cache : elem,
+
+			// Only defining an ID for JS objects if its cache already exists allows
+			// the code to shortcut on the same path as a DOM node with no cache
+			id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
+
+		// Avoid doing any more work than we need to when trying to get data on an
+		// object that has no data at all
+		if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) {
+			return;
+		}
+
+		if ( !id ) {
+			// Only DOM nodes need a new unique ID for each element since their data
+			// ends up in the global cache
+			if ( isNode ) {
+				elem[ jQuery.expando ] = id = ++jQuery.uuid;
+			} else {
+				id = jQuery.expando;
+			}
+		}
+
+		if ( !cache[ id ] ) {
+			cache[ id ] = {};
+
+			// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
+			// metadata on plain JS objects when the object is serialized using
+			// JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+		}
+
+		// An object can be passed to jQuery.data instead of a key/value pair; this gets
+		// shallow copied over onto the existing cache
+		if ( typeof name === "object" || typeof name === "function" ) {
+			if ( pvt ) {
+				cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
+			} else {
+				cache[ id ] = jQuery.extend(cache[ id ], name);
+			}
+		}
+
+		thisCache = cache[ id ];
+
+		// Internal jQuery data is stored in a separate object inside the object's data
+		// cache in order to avoid key collisions between internal data and user-defined
+		// data
+		if ( pvt ) {
+			if ( !thisCache[ internalKey ] ) {
+				thisCache[ internalKey ] = {};
+			}
+
+			thisCache = thisCache[ internalKey ];
+		}
+
+		if ( data !== undefined ) {
+			thisCache[ name ] = data;
+		}
+
+		// TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
+		// not attempt to inspect the internal events object using jQuery.data, as this
+		// internal data object is undocumented and subject to change.
+		if ( name === "events" && !thisCache[name] ) {
+			return thisCache[ internalKey ] && thisCache[ internalKey ].events;
+		}
+
+		return getByName ? thisCache[ name ] : thisCache;
+	},
+
+	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var internalKey = jQuery.expando, isNode = elem.nodeType,
+
+			// See jQuery.data for more information
+			cache = isNode ? jQuery.cache : elem,
+
+			// See jQuery.data for more information
+			id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+		// If there is already no cache entry for this object, there is no
+		// purpose in continuing
+		if ( !cache[ id ] ) {
+			return;
+		}
+
+		if ( name ) {
+			var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
+
+			if ( thisCache ) {
+				delete thisCache[ name ];
+
+				// If there is no data left in the cache, we want to continue
+				// and let the cache object itself get destroyed
+				if ( !isEmptyDataObject(thisCache) ) {
+					return;
+				}
+			}
+		}
+
+		// See jQuery.data for more information
+		if ( pvt ) {
+			delete cache[ id ][ internalKey ];
+
+			// Don't destroy the parent cache unless the internal data object
+			// had been the only thing left in it
+			if ( !isEmptyDataObject(cache[ id ]) ) {
+				return;
+			}
+		}
+
+		var internalCache = cache[ id ][ internalKey ];
+
+		// Browsers that fail expando deletion also refuse to delete expandos on
+		// the window, but it will allow it on all other JS objects; other browsers
+		// don't care
+		if ( jQuery.support.deleteExpando || cache != window ) {
+			delete cache[ id ];
+		} else {
+			cache[ id ] = null;
+		}
+
+		// We destroyed the entire user cache at once because it's faster than
+		// iterating through each key, but we need to continue to persist internal
+		// data if it existed
+		if ( internalCache ) {
+			cache[ id ] = {};
+			// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
+			// metadata on plain JS objects when the object is serialized using
+			// JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+
+			cache[ id ][ internalKey ] = internalCache;
+
+		// Otherwise, we need to eliminate the expando on the node to avoid
+		// false lookups in the cache for entries that no longer exist
+		} else if ( isNode ) {
+			// IE does not allow us to delete expando properties from nodes,
+			// nor does it have a removeAttribute function on Document nodes;
+			// we must handle all of these cases
+			if ( jQuery.support.deleteExpando ) {
+				delete elem[ jQuery.expando ];
+			} else if ( elem.removeAttribute ) {
+				elem.removeAttribute( jQuery.expando );
+			} else {
+				elem[ jQuery.expando ] = null;
+			}
+		}
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return jQuery.data( elem, name, data, true );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		if ( elem.nodeName ) {
+			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+			if ( match ) {
+				return !(match === true || elem.getAttribute("classid") !== match);
+			}
+		}
+
+		return true;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var data = null;
+
+		if ( typeof key === "undefined" ) {
+			if ( this.length ) {
+				data = jQuery.data( this[0] );
+
+				if ( this[0].nodeType === 1 ) {
+					var attr = this[0].attributes, name;
+					for ( var i = 0, l = attr.length; i < l; i++ ) {
+						name = attr[i].name;
+
+						if ( name.indexOf( "data-" ) === 0 ) {
+							name = name.substr( 5 );
+							dataAttr( this[0], name, data[ name ] );
+						}
+					}
+				}
+			}
+
+			return data;
+
+		} else if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		var parts = key.split(".");
+		parts[1] = parts[1] ? "." + parts[1] : "";
+
+		if ( value === undefined ) {
+			data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+			// Try to fetch any internally stored data first
+			if ( data === undefined && this.length ) {
+				data = jQuery.data( this[0], key );
+				data = dataAttr( this[0], key, data );
+			}
+
+			return data === undefined && parts[1] ?
+				this.data( parts[0] ) :
+				data;
+
+		} else {
+			return this.each(function() {
+				var $this = jQuery( this ),
+					args = [ parts[0], value ];
+
+				$this.triggerHandler( "setData" + parts[1] + "!", args );
+				jQuery.data( this, key, value );
+				$this.triggerHandler( "changeData" + parts[1] + "!", args );
+			});
+		}
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+		data = elem.getAttribute( "data-" + key );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = data === "true" ? true :
+				data === "false" ? false :
+				data === "null" ? null :
+				!jQuery.isNaN( data ) ? parseFloat( data ) :
+					rbrace.test( data ) ? jQuery.parseJSON( data ) :
+					data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON
+// property to be considered empty objects; this property always exists in
+// order to make sure JSON.stringify does not expose internal metadata
+function isEmptyDataObject( obj ) {
+	for ( var name in obj ) {
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+
+
+
+jQuery.extend({
+	queue: function( elem, type, data ) {
+		if ( !elem ) {
+			return;
+		}
+
+		type = (type || "fx") + "queue";
+		var q = jQuery._data( elem, type );
+
+		// Speed up dequeue by getting out quickly if this is just a lookup
+		if ( !data ) {
+			return q || [];
+		}
+
+		if ( !q || jQuery.isArray(data) ) {
+			q = jQuery._data( elem, type, jQuery.makeArray(data) );
+
+		} else {
+			q.push( data );
+		}
+
+		return q;
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			fn = queue.shift();
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+		}
+
+		if ( fn ) {
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift("inprogress");
+			}
+
+			fn.call(elem, function() {
+				jQuery.dequeue(elem, type);
+			});
+		}
+
+		if ( !queue.length ) {
+			jQuery.removeData( elem, type + "queue", true );
+		}
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+		}
+
+		if ( data === undefined ) {
+			return jQuery.queue( this[0], type );
+		}
+		return this.each(function( i ) {
+			var queue = jQuery.queue( this, type, data );
+
+			if ( type === "fx" && queue[0] !== "inprogress" ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	},
+	dequeue: function( type ) {
+		return this.each(function() {
+			jQuery.dequeue( this, type );
+		});
+	},
+
+	// Based off of the plugin by Clint Helfers, with permission.
+	// http://blindsignals.com/index.php/2009/07/jquery-delay/
+	delay: function( time, type ) {
+		time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
+		type = type || "fx";
+
+		return this.queue( type, function() {
+			var elem = this;
+			setTimeout(function() {
+				jQuery.dequeue( elem, type );
+			}, time );
+		});
+	},
+
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	}
+});
+
+
+
+
+var rclass = /[\n\t\r]/g,
+	rspaces = /\s+/,
+	rreturn = /\r/g,
+	rspecialurl = /^(?:href|src|style)$/,
+	rtype = /^(?:button|input)$/i,
+	rfocusable = /^(?:button|input|object|select|textarea)$/i,
+	rclickable = /^a(?:rea)?$/i,
+	rradiocheck = /^(?:radio|checkbox)$/i;
+
+jQuery.props = {
+	"for": "htmlFor",
+	"class": "className",
+	readonly: "readOnly",
+	maxlength: "maxLength",
+	cellspacing: "cellSpacing",
+	rowspan: "rowSpan",
+	colspan: "colSpan",
+	tabindex: "tabIndex",
+	usemap: "useMap",
+	frameborder: "frameBorder"
+};
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, name, value, true, jQuery.attr );
+	},
+
+	removeAttr: function( name, fn ) {
+		return this.each(function(){
+			jQuery.attr( this, name, "" );
+			if ( this.nodeType === 1 ) {
+				this.removeAttribute( name );
+			}
+		});
+	},
+
+	addClass: function( value ) {
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				self.addClass( value.call(this, i, self.attr("class")) );
+			});
+		}
+
+		if ( value && typeof value === "string" ) {
+			var classNames = (value || "").split( rspaces );
+
+			for ( var i = 0, l = this.length; i < l; i++ ) {
+				var elem = this[i];
+
+				if ( elem.nodeType === 1 ) {
+					if ( !elem.className ) {
+						elem.className = value;
+
+					} else {
+						var className = " " + elem.className + " ",
+							setClass = elem.className;
+
+						for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
+							if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
+								setClass += " " + classNames[c];
+							}
+						}
+						elem.className = jQuery.trim( setClass );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				self.removeClass( value.call(this, i, self.attr("class")) );
+			});
+		}
+
+		if ( (value && typeof value === "string") || value === undefined ) {
+			var classNames = (value || "").split( rspaces );
+
+			for ( var i = 0, l = this.length; i < l; i++ ) {
+				var elem = this[i];
+
+				if ( elem.nodeType === 1 && elem.className ) {
+					if ( value ) {
+						var className = (" " + elem.className + " ").replace(rclass, " ");
+						for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
+							className = className.replace(" " + classNames[c] + " ", " ");
+						}
+						elem.className = jQuery.trim( className );
+
+					} else {
+						elem.className = "";
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isBool = typeof stateVal === "boolean";
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
+			});
+		}
+
+		return this.each(function() {
+			if ( type === "string" ) {
+				// toggle individual class names
+				var className,
+					i = 0,
+					self = jQuery( this ),
+					state = stateVal,
+					classNames = value.split( rspaces );
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space seperated list
+					state = isBool ? state : !self.hasClass( className );
+					self[ state ? "addClass" : "removeClass" ]( className );
+				}
+
+			} else if ( type === "undefined" || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.className );
+				}
+
+				// toggle whole className
+				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+			}
+		});
+	},
+
+	hasClass: function( selector ) {
+		var className = " " + selector + " ";
+		for ( var i = 0, l = this.length; i < l; i++ ) {
+			if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		if ( !arguments.length ) {
+			var elem = this[0];
+
+			if ( elem ) {
+				if ( jQuery.nodeName( elem, "option" ) ) {
+					// attributes.value is undefined in Blackberry 4.7 but
+					// uses .value. See #6932
+					var val = elem.attributes.value;
+					return !val || val.specified ? elem.value : elem.text;
+				}
+
+				// We need to handle select boxes special
+				if ( jQuery.nodeName( elem, "select" ) ) {
+					var index = elem.selectedIndex,
+						values = [],
+						options = elem.options,
+						one = elem.type === "select-one";
+
+					// Nothing was selected
+					if ( index < 0 ) {
+						return null;
+					}
+
+					// Loop through all the selected options
+					for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
+						var option = options[ i ];
+
+						// Don't return options that are disabled or in a disabled optgroup
+						if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+								(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+
+							// Get the specific value for the option
+							value = jQuery(option).val();
+
+							// We don't need an array for one selects
+							if ( one ) {
+								return value;
+							}
+
+							// Multi-Selects return an array
+							values.push( value );
+						}
+					}
+
+					// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+					if ( one && !values.length && options.length ) {
+						return jQuery( options[ index ] ).val();
+					}
+
+					return values;
+				}
+
+				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+				if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {
+					return elem.getAttribute("value") === null ? "on" : elem.value;
+				}
+
+				// Everything else, we just grab the value
+				return (elem.value || "").replace(rreturn, "");
+
+			}
+
+			return undefined;
+		}
+
+		var isFunction = jQuery.isFunction(value);
+
+		return this.each(function(i) {
+			var self = jQuery(this), val = value;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call(this, i, self.val());
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+			} else if ( typeof val === "number" ) {
+				val += "";
+			} else if ( jQuery.isArray(val) ) {
+				val = jQuery.map(val, function (value) {
+					return value == null ? "" : value + "";
+				});
+			}
+
+			if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
+				this.checked = jQuery.inArray( self.val(), val ) >= 0;
+
+			} else if ( jQuery.nodeName( this, "select" ) ) {
+				var values = jQuery.makeArray(val);
+
+				jQuery( "option", this ).each(function() {
+					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+				});
+
+				if ( !values.length ) {
+					this.selectedIndex = -1;
+				}
+
+			} else {
+				this.value = val;
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	attrFn: {
+		val: true,
+		css: true,
+		html: true,
+		text: true,
+		data: true,
+		width: true,
+		height: true,
+		offset: true
+	},
+
+	attr: function( elem, name, value, pass ) {
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || elem.nodeType === 2 ) {
+			return undefined;
+		}
+
+		if ( pass && name in jQuery.attrFn ) {
+			return jQuery(elem)[name](value);
+		}
+
+		var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
+			// Whether we are setting (or getting)
+			set = value !== undefined;
+
+		// Try to normalize/fix the name
+		name = notxml && jQuery.props[ name ] || name;
+
+		// Only do all the following if this is a node (faster for style)
+		if ( elem.nodeType === 1 ) {
+			// These attributes require special treatment
+			var special = rspecialurl.test( name );
+
+			// Safari mis-reports the default selected property of an option
+			// Accessing the parent's selectedIndex property fixes it
+			if ( name === "selected" && !jQuery.support.optSelected ) {
+				var parent = elem.parentNode;
+				if ( parent ) {
+					parent.selectedIndex;
+
+					// Make sure that it also works with optgroups, see #5701
+					if ( parent.parentNode ) {
+						parent.parentNode.selectedIndex;
+					}
+				}
+			}
+
+			// If applicable, access the attribute via the DOM 0 way
+			// 'in' checks fail in Blackberry 4.7 #6931
+			if ( (name in elem || elem[ name ] !== undefined) && notxml && !special ) {
+				if ( set ) {
+					// We can't allow the type property to be changed (since it causes problems in IE)
+					if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
+						jQuery.error( "type property can't be changed" );
+					}
+
+					if ( value === null ) {
+						if ( elem.nodeType === 1 ) {
+							elem.removeAttribute( name );
+						}
+
+					} else {
+						elem[ name ] = value;
+					}
+				}
+
+				// browsers index elements by id/name on forms, give priority to attributes.
+				if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
+					return elem.getAttributeNode( name ).nodeValue;
+				}
+
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				if ( name === "tabIndex" ) {
+					var attributeNode = elem.getAttributeNode( "tabIndex" );
+
+					return attributeNode && attributeNode.specified ?
+						attributeNode.value :
+						rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+							0 :
+							undefined;
+				}
+
+				return elem[ name ];
+			}
+
+			if ( !jQuery.support.style && notxml && name === "style" ) {
+				if ( set ) {
+					elem.style.cssText = "" + value;
+				}
+
+				return elem.style.cssText;
+			}
+
+			if ( set ) {
+				// convert the value to a string (all browsers do this but IE) see #1070
+				elem.setAttribute( name, "" + value );
+			}
+
+			// Ensure that missing attributes return undefined
+			// Blackberry 4.7 returns "" from getAttribute #6938
+			if ( !elem.attributes[ name ] && (elem.hasAttribute && !elem.hasAttribute( name )) ) {
+				return undefined;
+			}
+
+			var attr = !jQuery.support.hrefNormalized && notxml && special ?
+					// Some attributes require a special call on IE
+					elem.getAttribute( name, 2 ) :
+					elem.getAttribute( name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return attr === null ? undefined : attr;
+		}
+		// Handle everything which isn't a DOM element node
+		if ( set ) {
+			elem[ name ] = value;
+		}
+		return elem[ name ];
+	}
+});
+
+
+
+
+var rnamespaces = /\.(.*)$/,
+	rformElems = /^(?:textarea|input|select)$/i,
+	rperiod = /\./g,
+	rspace = / /g,
+	rescape = /[^\w\s.|`]/g,
+	fcleanup = function( nm ) {
+		return nm.replace(rescape, "\\$&");
+	};
+
+/*
+ * A number of helper functions used for managing events.
+ * Many of the ideas behind this code originated from
+ * Dean Edwards' addEvent library.
+ */
+jQuery.event = {
+
+	// Bind an event to an element
+	// Original by Dean Edwards
+	add: function( elem, types, handler, data ) {
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		// TODO :: Use a try/catch until it's safe to pull this out (likely 1.6)
+		// Minor release fix for bug #8018
+		try {
+			// For whatever reason, IE has trouble passing the window object
+			// around, causing it to be cloned in the process
+			if ( jQuery.isWindow( elem ) && ( elem !== window && !elem.frameElement ) ) {
+				elem = window;
+			}
+		}
+		catch ( e ) {}
+
+		if ( handler === false ) {
+			handler = returnFalse;
+		} else if ( !handler ) {
+			// Fixes bug #7229. Fix recommended by jdalton
+			return;
+		}
+
+		var handleObjIn, handleObj;
+
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+		}
+
+		// Make sure that the function being executed has a unique ID
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure
+		var elemData = jQuery._data( elem );
+
+		// If no elemData is found then we must be trying to bind to one of the
+		// banned noData elements
+		if ( !elemData ) {
+			return;
+		}
+
+		var events = elemData.events,
+			eventHandle = elemData.handle;
+
+		if ( !events ) {
+			elemData.events = events = {};
+		}
+
+		if ( !eventHandle ) {
+			elemData.handle = eventHandle = function() {
+				// Handle the second event of a trigger and when
+				// an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
+					jQuery.event.handle.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+		}
+
+		// Add elem as a property of the handle function
+		// This is to prevent a memory leak with non-native events in IE.
+		eventHandle.elem = elem;
+
+		// Handle multiple events separated by a space
+		// jQuery(...).bind("mouseover mouseout", fn);
+		types = types.split(" ");
+
+		var type, i = 0, namespaces;
+
+		while ( (type = types[ i++ ]) ) {
+			handleObj = handleObjIn ?
+				jQuery.extend({}, handleObjIn) :
+				{ handler: handler, data: data };
+
+			// Namespaced event handlers
+			if ( type.indexOf(".") > -1 ) {
+				namespaces = type.split(".");
+				type = namespaces.shift();
+				handleObj.namespace = namespaces.slice(0).sort().join(".");
+
+			} else {
+				namespaces = [];
+				handleObj.namespace = "";
+			}
+
+			handleObj.type = type;
+			if ( !handleObj.guid ) {
+				handleObj.guid = handler.guid;
+			}
+
+			// Get the current list of functions bound to this event
+			var handlers = events[ type ],
+				special = jQuery.event.special[ type ] || {};
+
+			// Init the event handler queue
+			if ( !handlers ) {
+				handlers = events[ type ] = [];
+
+				// Check for a special event handler
+				// Only use addEventListener/attachEvent if the special
+				// events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add the function to the element's handler list
+			handlers.push( handleObj );
+
+			// Keep track of which events have been used, for global triggering
+			jQuery.event.global[ type ] = true;
+		}
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	global: {},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, pos ) {
+		// don't do events on text and comment nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		if ( handler === false ) {
+			handler = returnFalse;
+		}
+
+		var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
+			elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+			events = elemData && elemData.events;
+
+		if ( !elemData || !events ) {
+			return;
+		}
+
+		// types is actually an event object here
+		if ( types && types.type ) {
+			handler = types.handler;
+			types = types.type;
+		}
+
+		// Unbind all events for the element
+		if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
+			types = types || "";
+
+			for ( type in events ) {
+				jQuery.event.remove( elem, type + types );
+			}
+
+			return;
+		}
+
+		// Handle multiple events separated by a space
+		// jQuery(...).unbind("mouseover mouseout", fn);
+		types = types.split(" ");
+
+		while ( (type = types[ i++ ]) ) {
+			origType = type;
+			handleObj = null;
+			all = type.indexOf(".") < 0;
+			namespaces = [];
+
+			if ( !all ) {
+				// Namespaced event handlers
+				namespaces = type.split(".");
+				type = namespaces.shift();
+
+				namespace = new RegExp("(^|\\.)" +
+					jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
+			}
+
+			eventType = events[ type ];
+
+			if ( !eventType ) {
+				continue;
+			}
+
+			if ( !handler ) {
+				for ( j = 0; j < eventType.length; j++ ) {
+					handleObj = eventType[ j ];
+
+					if ( all || namespace.test( handleObj.namespace ) ) {
+						jQuery.event.remove( elem, origType, handleObj.handler, j );
+						eventType.splice( j--, 1 );
+					}
+				}
+
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+
+			for ( j = pos || 0; j < eventType.length; j++ ) {
+				handleObj = eventType[ j ];
+
+				if ( handler.guid === handleObj.guid ) {
+					// remove the given handler for the given type
+					if ( all || namespace.test( handleObj.namespace ) ) {
+						if ( pos == null ) {
+							eventType.splice( j--, 1 );
+						}
+
+						if ( special.remove ) {
+							special.remove.call( elem, handleObj );
+						}
+					}
+
+					if ( pos != null ) {
+						break;
+					}
+				}
+			}
+
+			// remove generic event handler if no more handlers exist
+			if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				ret = null;
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			var handle = elemData.handle;
+			if ( handle ) {
+				handle.elem = null;
+			}
+
+			delete elemData.events;
+			delete elemData.handle;
+
+			if ( jQuery.isEmptyObject( elemData ) ) {
+				jQuery.removeData( elem, undefined, true );
+			}
+		}
+	},
+
+	// bubbling is internal
+	trigger: function( event, data, elem /*, bubbling */ ) {
+		// Event object or event type
+		var type = event.type || event,
+			bubbling = arguments[3];
+
+		if ( !bubbling ) {
+			event = typeof event === "object" ?
+				// jQuery.Event object
+				event[ jQuery.expando ] ? event :
+				// Object literal
+				jQuery.extend( jQuery.Event(type), event ) :
+				// Just the event type (string)
+				jQuery.Event(type);
+
+			if ( type.indexOf("!") >= 0 ) {
+				event.type = type = type.slice(0, -1);
+				event.exclusive = true;
+			}
+
+			// Handle a global trigger
+			if ( !elem ) {
+				// Don't bubble custom events when global (to avoid too much overhead)
+				event.stopPropagation();
+
+				// Only trigger if we've ever bound an event for it
+				if ( jQuery.event.global[ type ] ) {
+					// XXX This code smells terrible. event.js should not be directly
+					// inspecting the data cache
+					jQuery.each( jQuery.cache, function() {
+						// internalKey variable is just used to make it easier to find
+						// and potentially change this stuff later; currently it just
+						// points to jQuery.expando
+						var internalKey = jQuery.expando,
+							internalCache = this[ internalKey ];
+						if ( internalCache && internalCache.events && internalCache.events[ type ] ) {
+							jQuery.event.trigger( event, data, internalCache.handle.elem );
+						}
+					});
+				}
+			}
+
+			// Handle triggering a single element
+
+			// don't do events on text and comment nodes
+			if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
+				return undefined;
+			}
+
+			// Clean up in case it is reused
+			event.result = undefined;
+			event.target = elem;
+
+			// Clone the incoming data, if any
+			data = jQuery.makeArray( data );
+			data.unshift( event );
+		}
+
+		event.currentTarget = elem;
+
+		// Trigger the event, it is assumed that "handle" is a function
+		var handle = jQuery._data( elem, "handle" );
+
+		if ( handle ) {
+			handle.apply( elem, data );
+		}
+
+		var parent = elem.parentNode || elem.ownerDocument;
+
+		// Trigger an inline bound script
+		try {
+			if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
+				if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) {
+					event.result = false;
+					event.preventDefault();
+				}
+			}
+
+		// prevent IE from throwing an error for some elements with some event types, see #3533
+		} catch (inlineError) {}
+
+		if ( !event.isPropagationStopped() && parent ) {
+			jQuery.event.trigger( event, data, parent, true );
+
+		} else if ( !event.isDefaultPrevented() ) {
+			var old,
+				target = event.target,
+				targetType = type.replace( rnamespaces, "" ),
+				isClick = jQuery.nodeName( target, "a" ) && targetType === "click",
+				special = jQuery.event.special[ targetType ] || {};
+
+			if ( (!special._default || special._default.call( elem, event ) === false) &&
+				!isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
+
+				try {
+					if ( target[ targetType ] ) {
+						// Make sure that we don't accidentally re-trigger the onFOO events
+						old = target[ "on" + targetType ];
+
+						if ( old ) {
+							target[ "on" + targetType ] = null;
+						}
+
+						jQuery.event.triggered = true;
+						target[ targetType ]();
+					}
+
+				// prevent IE from throwing an error for some elements with some event types, see #3533
+				} catch (triggerError) {}
+
+				if ( old ) {
+					target[ "on" + targetType ] = old;
+				}
+
+				jQuery.event.triggered = false;
+			}
+		}
+	},
+
+	handle: function( event ) {
+		var all, handlers, namespaces, namespace_re, events,
+			namespace_sort = [],
+			args = jQuery.makeArray( arguments );
+
+		event = args[0] = jQuery.event.fix( event || window.event );
+		event.currentTarget = this;
+
+		// Namespaced event handlers
+		all = event.type.indexOf(".") < 0 && !event.exclusive;
+
+		if ( !all ) {
+			namespaces = event.type.split(".");
+			event.type = namespaces.shift();
+			namespace_sort = namespaces.slice(0).sort();
+			namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)");
+		}
+
+		event.namespace = event.namespace || namespace_sort.join(".");
+
+		events = jQuery._data(this, "events");
+
+		handlers = (events || {})[ event.type ];
+
+		if ( events && handlers ) {
+			// Clone the handlers to prevent manipulation
+			handlers = handlers.slice(0);
+
+			for ( var j = 0, l = handlers.length; j < l; j++ ) {
+				var handleObj = handlers[ j ];
+
+				// Filter the functions by class
+				if ( all || namespace_re.test( handleObj.namespace ) ) {
+					// Pass in a reference to the handler function itself
+					// So that we can later remove it
+					event.handler = handleObj.handler;
+					event.data = handleObj.data;
+					event.handleObj = handleObj;
+
+					var ret = handleObj.handler.apply( this, args );
+
+					if ( ret !== undefined ) {
+						event.result = ret;
+						if ( ret === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+
+					if ( event.isImmediatePropagationStopped() ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// store a copy of the original event object
+		// and "clone" to set read-only properties
+		var originalEvent = event;
+		event = jQuery.Event( originalEvent );
+
+		for ( var i = this.props.length, prop; i; ) {
+			prop = this.props[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Fix target property, if necessary
+		if ( !event.target ) {
+			// Fixes #1925 where srcElement might not be defined either
+			event.target = event.srcElement || document;
+		}
+
+		// check if target is a textnode (safari)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// Add relatedTarget, if necessary
+		if ( !event.relatedTarget && event.fromElement ) {
+			event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
+		}
+
+		// Calculate pageX/Y if missing and clientX/Y available
+		if ( event.pageX == null && event.clientX != null ) {
+			var doc = document.documentElement,
+				body = document.body;
+
+			event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
+			event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
+		}
+
+		// Add which for key events
+		if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
+			event.which = event.charCode != null ? event.charCode : event.keyCode;
+		}
+
+		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
+		if ( !event.metaKey && event.ctrlKey ) {
+			event.metaKey = event.ctrlKey;
+		}
+
+		// Add which for click: 1 === left; 2 === middle; 3 === right
+		// Note: button is not normalized, so don't use it
+		if ( !event.which && event.button !== undefined ) {
+			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
+		}
+
+		return event;
+	},
+
+	// Deprecated, use jQuery.guid instead
+	guid: 1E8,
+
+	// Deprecated, use jQuery.proxy instead
+	proxy: jQuery.proxy,
+
+	special: {
+		ready: {
+			// Make sure the ready event is setup
+			setup: jQuery.bindReady,
+			teardown: jQuery.noop
+		},
+
+		live: {
+			add: function( handleObj ) {
+				jQuery.event.add( this,
+					liveConvert( handleObj.origType, handleObj.selector ),
+					jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
+			},
+
+			remove: function( handleObj ) {
+				jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
+			}
+		},
+
+		beforeunload: {
+			setup: function( data, namespaces, eventHandle ) {
+				// We only want to do this special case on windows
+				if ( jQuery.isWindow( this ) ) {
+					this.onbeforeunload = eventHandle;
+				}
+			},
+
+			teardown: function( namespaces, eventHandle ) {
+				if ( this.onbeforeunload === eventHandle ) {
+					this.onbeforeunload = null;
+				}
+			}
+		}
+	}
+};
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		if ( elem.detachEvent ) {
+			elem.detachEvent( "on" + type, handle );
+		}
+	};
+
+jQuery.Event = function( src ) {
+	// Allow instantiation without the 'new' keyword
+	if ( !this.preventDefault ) {
+		return new jQuery.Event( src );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
+			src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// timeStamp is buggy for some events on Firefox(#3843)
+	// So we won't rely on the native value
+	this.timeStamp = jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+function returnFalse() {
+	return false;
+}
+function returnTrue() {
+	return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	preventDefault: function() {
+		this.isDefaultPrevented = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+
+		// if preventDefault exists run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// otherwise set the returnValue property of the original event to false (IE)
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		this.isPropagationStopped = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+		// if stopPropagation exists run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+		// otherwise set the cancelBubble property of the original event to true (IE)
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	},
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse
+};
+
+// Checks if an event happened on an element within another element
+// Used in jQuery.event.special.mouseenter and mouseleave handlers
+var withinElement = function( event ) {
+	// Check if mouse(over|out) are still within the same parent element
+	var parent = event.relatedTarget;
+
+	// Firefox sometimes assigns relatedTarget a XUL element
+	// which we cannot access the parentNode property of
+	try {
+
+		// Chrome does something similar, the parentNode property
+		// can be accessed but is null.
+		if ( parent !== document && !parent.parentNode ) {
+			return;
+		}
+		// Traverse up the tree
+		while ( parent && parent !== this ) {
+			parent = parent.parentNode;
+		}
+
+		if ( parent !== this ) {
+			// set the correct event type
+			event.type = event.data;
+
+			// handle event if we actually just moused on to a non sub-element
+			jQuery.event.handle.apply( this, arguments );
+		}
+
+	// assuming we've left the element since we most likely mousedover a xul element
+	} catch(e) { }
+},
+
+// In case of event delegation, we only need to rename the event.type,
+// liveHandler will take care of the rest.
+delegate = function( event ) {
+	event.type = event.data;
+	jQuery.event.handle.apply( this, arguments );
+};
+
+// Create mouseenter and mouseleave events
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		setup: function( data ) {
+			jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
+		},
+		teardown: function( data ) {
+			jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
+		}
+	};
+});
+
+// submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function( data, namespaces ) {
+			if ( this.nodeName && this.nodeName.toLowerCase() !== "form" ) {
+				jQuery.event.add(this, "click.specialSubmit", function( e ) {
+					var elem = e.target,
+						type = elem.type;
+
+					if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
+						trigger( "submit", this, arguments );
+					}
+				});
+
+				jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
+					var elem = e.target,
+						type = elem.type;
+
+					if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
+						trigger( "submit", this, arguments );
+					}
+				});
+
+			} else {
+				return false;
+			}
+		},
+
+		teardown: function( namespaces ) {
+			jQuery.event.remove( this, ".specialSubmit" );
+		}
+	};
+
+}
+
+// change delegation, happens here so we have bind.
+if ( !jQuery.support.changeBubbles ) {
+
+	var changeFilters,
+
+	getVal = function( elem ) {
+		var type = elem.type, val = elem.value;
+
+		if ( type === "radio" || type === "checkbox" ) {
+			val = elem.checked;
+
+		} else if ( type === "select-multiple" ) {
+			val = elem.selectedIndex > -1 ?
+				jQuery.map( elem.options, function( elem ) {
+					return elem.selected;
+				}).join("-") :
+				"";
+
+		} else if ( elem.nodeName.toLowerCase() === "select" ) {
+			val = elem.selectedIndex;
+		}
+
+		return val;
+	},
+
+	testChange = function testChange( e ) {
+		var elem = e.target, data, val;
+
+		if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
+			return;
+		}
+
+		data = jQuery._data( elem, "_change_data" );
+		val = getVal(elem);
+
+		// the current data will be also retrieved by beforeactivate
+		if ( e.type !== "focusout" || elem.type !== "radio" ) {
+			jQuery._data( elem, "_change_data", val );
+		}
+
+		if ( data === undefined || val === data ) {
+			return;
+		}
+
+		if ( data != null || val ) {
+			e.type = "change";
+			e.liveFired = undefined;
+			jQuery.event.trigger( e, arguments[1], elem );
+		}
+	};
+
+	jQuery.event.special.change = {
+		filters: {
+			focusout: testChange,
+
+			beforedeactivate: testChange,
+
+			click: function( e ) {
+				var elem = e.target, type = elem.type;
+
+				if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
+					testChange.call( this, e );
+				}
+			},
+
+			// Change has to be called before submit
+			// Keydown will be called before keypress, which is used in submit-event delegation
+			keydown: function( e ) {
+				var elem = e.target, type = elem.type;
+
+				if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
+					(e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
+					type === "select-multiple" ) {
+					testChange.call( this, e );
+				}
+			},
+
+			// Beforeactivate happens also before the previous element is blurred
+			// with this event you can't trigger a change event, but you can store
+			// information
+			beforeactivate: function( e ) {
+				var elem = e.target;
+				jQuery._data( elem, "_change_data", getVal(elem) );
+			}
+		},
+
+		setup: function( data, namespaces ) {
+			if ( this.type === "file" ) {
+				return false;
+			}
+
+			for ( var type in changeFilters ) {
+				jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
+			}
+
+			return rformElems.test( this.nodeName );
+		},
+
+		teardown: function( namespaces ) {
+			jQuery.event.remove( this, ".specialChange" );
+
+			return rformElems.test( this.nodeName );
+		}
+	};
+
+	changeFilters = jQuery.event.special.change.filters;
+
+	// Handle when the input is .focus()'d
+	changeFilters.focus = changeFilters.beforeactivate;
+}
+
+function trigger( type, elem, args ) {
+	// Piggyback on a donor event to simulate a different one.
+	// Fake originalEvent to avoid donor's stopPropagation, but if the
+	// simulated event prevents default then we do the same on the donor.
+	// Don't pass args or remember liveFired; they apply to the donor event.
+	var event = jQuery.extend( {}, args[ 0 ] );
+	event.type = type;
+	event.originalEvent = {};
+	event.liveFired = undefined;
+	jQuery.event.handle.call( elem, event );
+	if ( event.isDefaultPrevented() ) {
+		args[ 0 ].preventDefault();
+	}
+}
+
+// Create "bubbling" focus and blur events
+if ( document.addEventListener ) {
+	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				this.addEventListener( orig, handler, true );
+			},
+			teardown: function() {
+				this.removeEventListener( orig, handler, true );
+			}
+		};
+
+		function handler( e ) {
+			e = jQuery.event.fix( e );
+			e.type = fix;
+			return jQuery.event.handle.call( this, e );
+		}
+	});
+}
+
+jQuery.each(["bind", "one"], function( i, name ) {
+	jQuery.fn[ name ] = function( type, data, fn ) {
+		// Handle object literals
+		if ( typeof type === "object" ) {
+			for ( var key in type ) {
+				this[ name ](key, data, type[key], fn);
+			}
+			return this;
+		}
+
+		if ( jQuery.isFunction( data ) || data === false ) {
+			fn = data;
+			data = undefined;
+		}
+
+		var handler = name === "one" ? jQuery.proxy( fn, function( event ) {
+			jQuery( this ).unbind( event, handler );
+			return fn.apply( this, arguments );
+		}) : fn;
+
+		if ( type === "unload" && name !== "one" ) {
+			this.one( type, data, fn );
+
+		} else {
+			for ( var i = 0, l = this.length; i < l; i++ ) {
+				jQuery.event.add( this[i], type, handler, data );
+			}
+		}
+
+		return this;
+	};
+});
+
+jQuery.fn.extend({
+	unbind: function( type, fn ) {
+		// Handle object literals
+		if ( typeof type === "object" && !type.preventDefault ) {
+			for ( var key in type ) {
+				this.unbind(key, type[key]);
+			}
+
+		} else {
+			for ( var i = 0, l = this.length; i < l; i++ ) {
+				jQuery.event.remove( this[i], type, fn );
+			}
+		}
+
+		return this;
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.live( types, data, fn, selector );
+	},
+
+	undelegate: function( selector, types, fn ) {
+		if ( arguments.length === 0 ) {
+				return this.unbind( "live" );
+
+		} else {
+			return this.die( types, null, fn, selector );
+		}
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function() {
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+
+	triggerHandler: function( type, data ) {
+		if ( this[0] ) {
+			var event = jQuery.Event( type );
+			event.preventDefault();
+			event.stopPropagation();
+			jQuery.event.trigger( event, data, this[0] );
+			return event.result;
+		}
+	},
+
+	toggle: function( fn ) {
+		// Save reference to arguments for access in closure
+		var args = arguments,
+			i = 1;
+
+		// link all the functions, so any of them can unbind this click handler
+		while ( i < args.length ) {
+			jQuery.proxy( fn, args[ i++ ] );
+		}
+
+		return this.click( jQuery.proxy( fn, function( event ) {
+			// Figure out which function to execute
+			var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+			jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+			// Make sure that clicks stop
+			event.preventDefault();
+
+			// and execute the function
+			return args[ lastToggle ].apply( this, arguments ) || false;
+		}));
+	},
+
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+});
+
+var liveMap = {
+	focus: "focusin",
+	blur: "focusout",
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+};
+
+jQuery.each(["live", "die"], function( i, name ) {
+	jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
+		var type, i = 0, match, namespaces, preType,
+			selector = origSelector || this.selector,
+			context = origSelector ? this : jQuery( this.context );
+
+		if ( typeof types === "object" && !types.preventDefault ) {
+			for ( var key in types ) {
+				context[ name ]( key, data, types[key], selector );
+			}
+
+			return this;
+		}
+
+		if ( jQuery.isFunction( data ) ) {
+			fn = data;
+			data = undefined;
+		}
+
+		types = (types || "").split(" ");
+
+		while ( (type = types[ i++ ]) != null ) {
+			match = rnamespaces.exec( type );
+			namespaces = "";
+
+			if ( match )  {
+				namespaces = match[0];
+				type = type.replace( rnamespaces, "" );
+			}
+
+			if ( type === "hover" ) {
+				types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
+				continue;
+			}
+
+			preType = type;
+
+			if ( type === "focus" || type === "blur" ) {
+				types.push( liveMap[ type ] + namespaces );
+				type = type + namespaces;
+
+			} else {
+				type = (liveMap[ type ] || type) + namespaces;
+			}
+
+			if ( name === "live" ) {
+				// bind live handler
+				for ( var j = 0, l = context.length; j < l; j++ ) {
+					jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
+						{ data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
+				}
+
+			} else {
+				// unbind live handler
+				context.unbind( "live." + liveConvert( type, selector ), fn );
+			}
+		}
+
+		return this;
+	};
+});
+
+function liveHandler( event ) {
+	var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
+		elems = [],
+		selectors = [],
+		events = jQuery._data( this, "events" );
+
+	// Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
+	if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
+		return;
+	}
+
+	if ( event.namespace ) {
+		namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
+	}
+
+	event.liveFired = this;
+
+	var live = events.live.slice(0);
+
+	for ( j = 0; j < live.length; j++ ) {
+		handleObj = live[j];
+
+		if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
+			selectors.push( handleObj.selector );
+
+		} else {
+			live.splice( j--, 1 );
+		}
+	}
+
+	match = jQuery( event.target ).closest( selectors, event.currentTarget );
+
+	for ( i = 0, l = match.length; i < l; i++ ) {
+		close = match[i];
+
+		for ( j = 0; j < live.length; j++ ) {
+			handleObj = live[j];
+
+			if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) {
+				elem = close.elem;
+				related = null;
+
+				// Those two events require additional checking
+				if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
+					event.type = handleObj.preType;
+					related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
+				}
+
+				if ( !related || related !== elem ) {
+					elems.push({ elem: elem, handleObj: handleObj, level: close.level });
+				}
+			}
+		}
+	}
+
+	for ( i = 0, l = elems.length; i < l; i++ ) {
+		match = elems[i];
+
+		if ( maxLevel && match.level > maxLevel ) {
+			break;
+		}
+
+		event.currentTarget = match.elem;
+		event.data = match.handleObj.data;
+		event.handleObj = match.handleObj;
+
+		ret = match.handleObj.origHandler.apply( match.elem, arguments );
+
+		if ( ret === false || event.isPropagationStopped() ) {
+			maxLevel = match.level;
+
+			if ( ret === false ) {
+				stop = false;
+			}
+			if ( event.isImmediatePropagationStopped() ) {
+				break;
+			}
+		}
+	}
+
+	return stop;
+}
+
+function liveConvert( type, selector ) {
+	return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspace, "&");
+}
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup error").split(" "), function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		if ( fn == null ) {
+			fn = data;
+			data = null;
+		}
+
+		return arguments.length > 0 ?
+			this.bind( name, data, fn ) :
+			this.trigger( name );
+	};
+
+	if ( jQuery.attrFn ) {
+		jQuery.attrFn[ name ] = true;
+	}
+});
+
+
+/*!
+ * Sizzle CSS Selector Engine
+ *  Copyright 2011, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+	done = 0,
+	toString = Object.prototype.toString,
+	hasDuplicate = false,
+	baseHasDuplicate = true,
+	rBackslash = /\\/g,
+	rNonWord = /\W/;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+//   Thus far that includes Google Chrome.
+[0, 0].sort(function() {
+	baseHasDuplicate = false;
+	return 0;
+});
+
+var Sizzle = function( selector, context, results, seed ) {
+	results = results || [];
+	context = context || document;
+
+	var origContext = context;
+
+	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+		return [];
+	}
+
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	var m, set, checkSet, extra, ret, cur, pop, i,
+		prune = true,
+		contextXML = Sizzle.isXML( context ),
+		parts = [],
+		soFar = selector;
+
+	// Reset the position of the chunker regexp (start from head)
+	do {
+		chunker.exec( "" );
+		m = chunker.exec( soFar );
+
+		if ( m ) {
+			soFar = m[3];
+
+			parts.push( m[1] );
+
+			if ( m[2] ) {
+				extra = m[3];
+				break;
+			}
+		}
+	} while ( m );
+
+	if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
+		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+			set = posProcess( parts[0] + parts[1], context );
+
+		} else {
+			set = Expr.relative[ parts[0] ] ?
+				[ context ] :
+				Sizzle( parts.shift(), context );
+
+			while ( parts.length ) {
+				selector = parts.shift();
+
+				if ( Expr.relative[ selector ] ) {
+					selector += parts.shift();
+				}
+
+				set = posProcess( selector, set );
+			}
+		}
+
+	} else {
+		// Take a shortcut and set the context if the root selector is an ID
+		// (but not if it'll be faster if the inner selector is an ID)
+		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
+			ret = Sizzle.find( parts.shift(), context, contextXML );
+			context = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set )[0] :
+				ret.set[0];
+		}
+
+		if ( context ) {
+			ret = seed ?
+				{ expr: parts.pop(), set: makeArray(seed) } :
+				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+
+			set = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set ) :
+				ret.set;
+
+			if ( parts.length > 0 ) {
+				checkSet = makeArray( set );
+
+			} else {
+				prune = false;
+			}
+
+			while ( parts.length ) {
+				cur = parts.pop();
+				pop = cur;
+
+				if ( !Expr.relative[ cur ] ) {
+					cur = "";
+				} else {
+					pop = parts.pop();
+				}
+
+				if ( pop == null ) {
+					pop = context;
+				}
+
+				Expr.relative[ cur ]( checkSet, pop, contextXML );
+			}
+
+		} else {
+			checkSet = parts = [];
+		}
+	}
+
+	if ( !checkSet ) {
+		checkSet = set;
+	}
+
+	if ( !checkSet ) {
+		Sizzle.error( cur || selector );
+	}
+
+	if ( toString.call(checkSet) === "[object Array]" ) {
+		if ( !prune ) {
+			results.push.apply( results, checkSet );
+
+		} else if ( context && context.nodeType === 1 ) {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+					results.push( set[i] );
+				}
+			}
+
+		} else {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+					results.push( set[i] );
+				}
+			}
+		}
+
+	} else {
+		makeArray( checkSet, results );
+	}
+
+	if ( extra ) {
+		Sizzle( extra, origContext, results, seed );
+		Sizzle.uniqueSort( results );
+	}
+
+	return results;
+};
+
+Sizzle.uniqueSort = function( results ) {
+	if ( sortOrder ) {
+		hasDuplicate = baseHasDuplicate;
+		results.sort( sortOrder );
+
+		if ( hasDuplicate ) {
+			for ( var i = 1; i < results.length; i++ ) {
+				if ( results[i] === results[ i - 1 ] ) {
+					results.splice( i--, 1 );
+				}
+			}
+		}
+	}
+
+	return results;
+};
+
+Sizzle.matches = function( expr, set ) {
+	return Sizzle( expr, null, null, set );
+};
+
+Sizzle.matchesSelector = function( node, expr ) {
+	return Sizzle( expr, null, null, [node] ).length > 0;
+};
+
+Sizzle.find = function( expr, context, isXML ) {
+	var set;
+
+	if ( !expr ) {
+		return [];
+	}
+
+	for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
+		var match,
+			type = Expr.order[i];
+
+		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+			var left = match[1];
+			match.splice( 1, 1 );
+
+			if ( left.substr( left.length - 1 ) !== "\\" ) {
+				match[1] = (match[1] || "").replace( rBackslash, "" );
+				set = Expr.find[ type ]( match, context, isXML );
+
+				if ( set != null ) {
+					expr = expr.replace( Expr.match[ type ], "" );
+					break;
+				}
+			}
+		}
+	}
+
+	if ( !set ) {
+		set = typeof context.getElementsByTagName !== "undefined" ?
+			context.getElementsByTagName( "*" ) :
+			[];
+	}
+
+	return { set: set, expr: expr };
+};
+
+Sizzle.filter = function( expr, set, inplace, not ) {
+	var match, anyFound,
+		old = expr,
+		result = [],
+		curLoop = set,
+		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
+
+	while ( expr && set.length ) {
+		for ( var type in Expr.filter ) {
+			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+				var found, item,
+					filter = Expr.filter[ type ],
+					left = match[1];
+
+				anyFound = false;
+
+				match.splice(1,1);
+
+				if ( left.substr( left.length - 1 ) === "\\" ) {
+					continue;
+				}
+
+				if ( curLoop === result ) {
+					result = [];
+				}
+
+				if ( Expr.preFilter[ type ] ) {
+					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+					if ( !match ) {
+						anyFound = found = true;
+
+					} else if ( match === true ) {
+						continue;
+					}
+				}
+
+				if ( match ) {
+					for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
+						if ( item ) {
+							found = filter( item, match, i, curLoop );
+							var pass = not ^ !!found;
+
+							if ( inplace && found != null ) {
+								if ( pass ) {
+									anyFound = true;
+
+								} else {
+									curLoop[i] = false;
+								}
+
+							} else if ( pass ) {
+								result.push( item );
+								anyFound = true;
+							}
+						}
+					}
+				}
+
+				if ( found !== undefined ) {
+					if ( !inplace ) {
+						curLoop = result;
+					}
+
+					expr = expr.replace( Expr.match[ type ], "" );
+
+					if ( !anyFound ) {
+						return [];
+					}
+
+					break;
+				}
+			}
+		}
+
+		// Improper expression
+		if ( expr === old ) {
+			if ( anyFound == null ) {
+				Sizzle.error( expr );
+
+			} else {
+				break;
+			}
+		}
+
+		old = expr;
+	}
+
+	return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+	throw "Syntax error, unrecognized expression: " + msg;
+};
+
+var Expr = Sizzle.selectors = {
+	order: [ "ID", "NAME", "TAG" ],
+
+	match: {
+		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
+		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
+		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+	},
+
+	leftMatch: {},
+
+	attrMap: {
+		"class": "className",
+		"for": "htmlFor"
+	},
+
+	attrHandle: {
+		href: function( elem ) {
+			return elem.getAttribute( "href" );
+		},
+		type: function( elem ) {
+			return elem.getAttribute( "type" );
+		}
+	},
+
+	relative: {
+		"+": function(checkSet, part){
+			var isPartStr = typeof part === "string",
+				isTag = isPartStr && !rNonWord.test( part ),
+				isPartStrNotTag = isPartStr && !isTag;
+
+			if ( isTag ) {
+				part = part.toLowerCase();
+			}
+
+			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+				if ( (elem = checkSet[i]) ) {
+					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+						elem || false :
+						elem === part;
+				}
+			}
+
+			if ( isPartStrNotTag ) {
+				Sizzle.filter( part, checkSet, true );
+			}
+		},
+
+		">": function( checkSet, part ) {
+			var elem,
+				isPartStr = typeof part === "string",
+				i = 0,
+				l = checkSet.length;
+
+			if ( isPartStr && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						var parent = elem.parentNode;
+						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+					}
+				}
+
+			} else {
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						checkSet[i] = isPartStr ?
+							elem.parentNode :
+							elem.parentNode === part;
+					}
+				}
+
+				if ( isPartStr ) {
+					Sizzle.filter( part, checkSet, true );
+				}
+			}
+		},
+
+		"": function(checkSet, part, isXML){
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
+		},
+
+		"~": function( checkSet, part, isXML ) {
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+		}
+	},
+
+	find: {
+		ID: function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+				// Check parentNode to catch when Blackberry 4.6 returns
+				// nodes that are no longer in the document #6963
+				return m && m.parentNode ? [m] : [];
+			}
+		},
+
+		NAME: function( match, context ) {
+			if ( typeof context.getElementsByName !== "undefined" ) {
+				var ret = [],
+					results = context.getElementsByName( match[1] );
+
+				for ( var i = 0, l = results.length; i < l; i++ ) {
+					if ( results[i].getAttribute("name") === match[1] ) {
+						ret.push( results[i] );
+					}
+				}
+
+				return ret.length === 0 ? null : ret;
+			}
+		},
+
+		TAG: function( match, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( match[1] );
+			}
+		}
+	},
+	preFilter: {
+		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+			match = " " + match[1].replace( rBackslash, "" ) + " ";
+
+			if ( isXML ) {
+				return match;
+			}
+
+			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+				if ( elem ) {
+					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
+						if ( !inplace ) {
+							result.push( elem );
+						}
+
+					} else if ( inplace ) {
+						curLoop[i] = false;
+					}
+				}
+			}
+
+			return false;
+		},
+
+		ID: function( match ) {
+			return match[1].replace( rBackslash, "" );
+		},
+
+		TAG: function( match, curLoop ) {
+			return match[1].replace( rBackslash, "" ).toLowerCase();
+		},
+
+		CHILD: function( match ) {
+			if ( match[1] === "nth" ) {
+				if ( !match[2] ) {
+					Sizzle.error( match[0] );
+				}
+
+				match[2] = match[2].replace(/^\+|\s*/g, '');
+
+				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
+					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+				// calculate the numbers (first)n+(last) including if they are negative
+				match[2] = (test[1] + (test[2] || 1)) - 0;
+				match[3] = test[3] - 0;
+			}
+			else if ( match[2] ) {
+				Sizzle.error( match[0] );
+			}
+
+			// TODO: Move to normal caching system
+			match[0] = done++;
+
+			return match;
+		},
+
+		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+			var name = match[1] = match[1].replace( rBackslash, "" );
+
+			if ( !isXML && Expr.attrMap[name] ) {
+				match[1] = Expr.attrMap[name];
+			}
+
+			// Handle if an un-quoted value was used
+			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
+
+			if ( match[2] === "~=" ) {
+				match[4] = " " + match[4] + " ";
+			}
+
+			return match;
+		},
+
+		PSEUDO: function( match, curLoop, inplace, result, not ) {
+			if ( match[1] === "not" ) {
+				// If we're dealing with a complex expression, or a simple one
+				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+					match[3] = Sizzle(match[3], null, null, curLoop);
+
+				} else {
+					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+
+					if ( !inplace ) {
+						result.push.apply( result, ret );
+					}
+
+					return false;
+				}
+
+			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+				return true;
+			}
+
+			return match;
+		},
+
+		POS: function( match ) {
+			match.unshift( true );
+
+			return match;
+		}
+	},
+
+	filters: {
+		enabled: function( elem ) {
+			return elem.disabled === false && elem.type !== "hidden";
+		},
+
+		disabled: function( elem ) {
+			return elem.disabled === true;
+		},
+
+		checked: function( elem ) {
+			return elem.checked === true;
+		},
+
+		selected: function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+
+			return elem.selected === true;
+		},
+
+		parent: function( elem ) {
+			return !!elem.firstChild;
+		},
+
+		empty: function( elem ) {
+			return !elem.firstChild;
+		},
+
+		has: function( elem, i, match ) {
+			return !!Sizzle( match[3], elem ).length;
+		},
+
+		header: function( elem ) {
+			return (/h\d/i).test( elem.nodeName );
+		},
+
+		text: function( elem ) {
+			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
+			// use getAttribute instead to test this case
+			return "text" === elem.getAttribute( 'type' );
+		},
+		radio: function( elem ) {
+			return "radio" === elem.type;
+		},
+
+		checkbox: function( elem ) {
+			return "checkbox" === elem.type;
+		},
+
+		file: function( elem ) {
+			return "file" === elem.type;
+		},
+		password: function( elem ) {
+			return "password" === elem.type;
+		},
+
+		submit: function( elem ) {
+			return "submit" === elem.type;
+		},
+
+		image: function( elem ) {
+			return "image" === elem.type;
+		},
+
+		reset: function( elem ) {
+			return "reset" === elem.type;
+		},
+
+		button: function( elem ) {
+			return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
+		},
+
+		input: function( elem ) {
+			return (/input|select|textarea|button/i).test( elem.nodeName );
+		}
+	},
+	setFilters: {
+		first: function( elem, i ) {
+			return i === 0;
+		},
+
+		last: function( elem, i, match, array ) {
+			return i === array.length - 1;
+		},
+
+		even: function( elem, i ) {
+			return i % 2 === 0;
+		},
+
+		odd: function( elem, i ) {
+			return i % 2 === 1;
+		},
+
+		lt: function( elem, i, match ) {
+			return i < match[3] - 0;
+		},
+
+		gt: function( elem, i, match ) {
+			return i > match[3] - 0;
+		},
+
+		nth: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		},
+
+		eq: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		}
+	},
+	filter: {
+		PSEUDO: function( elem, match, i, array ) {
+			var name = match[1],
+				filter = Expr.filters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+
+			} else if ( name === "contains" ) {
+				return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
+			} else if ( name === "not" ) {
+				var not = match[3];
+
+				for ( var j = 0, l = not.length; j < l; j++ ) {
+					if ( not[j] === elem ) {
+						return false;
+					}
+				}
+
+				return true;
+
+			} else {
+				Sizzle.error( name );
+			}
+		},
+
+		CHILD: function( elem, match ) {
+			var type = match[1],
+				node = elem;
+
+			switch ( type ) {
+				case "only":
+				case "first":
+					while ( (node = node.previousSibling) )	 {
+						if ( node.nodeType === 1 ) {
+							return false;
+						}
+					}
+
+					if ( type === "first" ) {
+						return true;
+					}
+
+					node = elem;
+
+				case "last":
+					while ( (node = node.nextSibling) )	 {
+						if ( node.nodeType === 1 ) {
+							return false;
+						}
+					}
+
+					return true;
+
+				case "nth":
+					var first = match[2],
+						last = match[3];
+
+					if ( first === 1 && last === 0 ) {
+						return true;
+					}
+
+					var doneName = match[0],
+						parent = elem.parentNode;
+
+					if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
+						var count = 0;
+
+						for ( node = parent.firstChild; node; node = node.nextSibling ) {
+							if ( node.nodeType === 1 ) {
+								node.nodeIndex = ++count;
+							}
+						}
+
+						parent.sizcache = doneName;
+					}
+
+					var diff = elem.nodeIndex - last;
+
+					if ( first === 0 ) {
+						return diff === 0;
+
+					} else {
+						return ( diff % first === 0 && diff / first >= 0 );
+					}
+			}
+		},
+
+		ID: function( elem, match ) {
+			return elem.nodeType === 1 && elem.getAttribute("id") === match;
+		},
+
+		TAG: function( elem, match ) {
+			return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
+		},
+
+		CLASS: function( elem, match ) {
+			return (" " + (elem.className || elem.getAttribute("class")) + " ")
+				.indexOf( match ) > -1;
+		},
+
+		ATTR: function( elem, match ) {
+			var name = match[1],
+				result = Expr.attrHandle[ name ] ?
+					Expr.attrHandle[ name ]( elem ) :
+					elem[ name ] != null ?
+						elem[ name ] :
+						elem.getAttribute( name ),
+				value = result + "",
+				type = match[2],
+				check = match[4];
+
+			return result == null ?
+				type === "!=" :
+				type === "=" ?
+				value === check :
+				type === "*=" ?
+				value.indexOf(check) >= 0 :
+				type === "~=" ?
+				(" " + value + " ").indexOf(check) >= 0 :
+				!check ?
+				value && result !== false :
+				type === "!=" ?
+				value !== check :
+				type === "^=" ?
+				value.indexOf(check) === 0 :
+				type === "$=" ?
+				value.substr(value.length - check.length) === check :
+				type === "|=" ?
+				value === check || value.substr(0, check.length + 1) === check + "-" :
+				false;
+		},
+
+		POS: function( elem, match, i, array ) {
+			var name = match[2],
+				filter = Expr.setFilters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+			}
+		}
+	}
+};
+
+var origPOS = Expr.match.POS,
+	fescape = function(all, num){
+		return "\\" + (num - 0 + 1);
+	};
+
+for ( var type in Expr.match ) {
+	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+}
+
+var makeArray = function( array, results ) {
+	array = Array.prototype.slice.call( array, 0 );
+
+	if ( results ) {
+		results.push.apply( results, array );
+		return results;
+	}
+
+	return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch( e ) {
+	makeArray = function( array, results ) {
+		var i = 0,
+			ret = results || [];
+
+		if ( toString.call(array) === "[object Array]" ) {
+			Array.prototype.push.apply( ret, array );
+
+		} else {
+			if ( typeof array.length === "number" ) {
+				for ( var l = array.length; i < l; i++ ) {
+					ret.push( array[i] );
+				}
+
+			} else {
+				for ( ; array[i]; i++ ) {
+					ret.push( array[i] );
+				}
+			}
+		}
+
+		return ret;
+	};
+}
+
+var sortOrder, siblingCheck;
+
+if ( document.documentElement.compareDocumentPosition ) {
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+			return a.compareDocumentPosition ? -1 : 1;
+		}
+
+		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+	};
+
+} else {
+	sortOrder = function( a, b ) {
+		var al, bl,
+			ap = [],
+			bp = [],
+			aup = a.parentNode,
+			bup = b.parentNode,
+			cur = aup;
+
+		// The nodes are identical, we can exit early
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// If the nodes are siblings (or identical) we can do a quick check
+		} else if ( aup === bup ) {
+			return siblingCheck( a, b );
+
+		// If no parents were found then the nodes are disconnected
+		} else if ( !aup ) {
+			return -1;
+
+		} else if ( !bup ) {
+			return 1;
+		}
+
+		// Otherwise they're somewhere else in the tree so we need
+		// to build up a full list of the parentNodes for comparison
+		while ( cur ) {
+			ap.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		cur = bup;
+
+		while ( cur ) {
+			bp.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		al = ap.length;
+		bl = bp.length;
+
+		// Start walking down the tree looking for a discrepancy
+		for ( var i = 0; i < al && i < bl; i++ ) {
+			if ( ap[i] !== bp[i] ) {
+				return siblingCheck( ap[i], bp[i] );
+			}
+		}
+
+		// We ended someplace up the tree so do a sibling check
+		return i === al ?
+			siblingCheck( a, bp[i], -1 ) :
+			siblingCheck( ap[i], b, 1 );
+	};
+
+	siblingCheck = function( a, b, ret ) {
+		if ( a === b ) {
+			return ret;
+		}
+
+		var cur = a.nextSibling;
+
+		while ( cur ) {
+			if ( cur === b ) {
+				return -1;
+			}
+
+			cur = cur.nextSibling;
+		}
+
+		return 1;
+	};
+}
+
+// Utility function for retreiving the text value of an array of DOM nodes
+Sizzle.getText = function( elems ) {
+	var ret = "", elem;
+
+	for ( var i = 0; elems[i]; i++ ) {
+		elem = elems[i];
+
+		// Get the text from text nodes and CDATA nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
+			ret += elem.nodeValue;
+
+		// Traverse everything else, except comment nodes
+		} else if ( elem.nodeType !== 8 ) {
+			ret += Sizzle.getText( elem.childNodes );
+		}
+	}
+
+	return ret;
+};
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+	// We're going to inject a fake input element with a specified name
+	var form = document.createElement("div"),
+		id = "script" + (new Date()).getTime(),
+		root = document.documentElement;
+
+	form.innerHTML = "<a name='" + id + "'/>";
+
+	// Inject it into the root element, check its status, and remove it quickly
+	root.insertBefore( form, root.firstChild );
+
+	// The workaround has to do additional checks after a getElementById
+	// Which slows things down for other browsers (hence the branching)
+	if ( document.getElementById( id ) ) {
+		Expr.find.ID = function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+
+				return m ?
+					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+						[m] :
+						undefined :
+					[];
+			}
+		};
+
+		Expr.filter.ID = function( elem, match ) {
+			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+
+			return elem.nodeType === 1 && node && node.nodeValue === match;
+		};
+	}
+
+	root.removeChild( form );
+
+	// release memory in IE
+	root = form = null;
+})();
+
+(function(){
+	// Check to see if the browser returns only elements
+	// when doing getElementsByTagName("*")
+
+	// Create a fake element
+	var div = document.createElement("div");
+	div.appendChild( document.createComment("") );
+
+	// Make sure no comments are found
+	if ( div.getElementsByTagName("*").length > 0 ) {
+		Expr.find.TAG = function( match, context ) {
+			var results = context.getElementsByTagName( match[1] );
+
+			// Filter out possible comments
+			if ( match[1] === "*" ) {
+				var tmp = [];
+
+				for ( var i = 0; results[i]; i++ ) {
+					if ( results[i].nodeType === 1 ) {
+						tmp.push( results[i] );
+					}
+				}
+
+				results = tmp;
+			}
+
+			return results;
+		};
+	}
+
+	// Check to see if an attribute returns normalized href attributes
+	div.innerHTML = "<a href='#'></a>";
+
+	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+			div.firstChild.getAttribute("href") !== "#" ) {
+
+		Expr.attrHandle.href = function( elem ) {
+			return elem.getAttribute( "href", 2 );
+		};
+	}
+
+	// release memory in IE
+	div = null;
+})();
+
+if ( document.querySelectorAll ) {
+	(function(){
+		var oldSizzle = Sizzle,
+			div = document.createElement("div"),
+			id = "__sizzle__";
+
+		div.innerHTML = "<p class='TEST'></p>";
+
+		// Safari can't handle uppercase or unicode characters when
+		// in quirks mode.
+		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+			return;
+		}
+
+		Sizzle = function( query, context, extra, seed ) {
+			context = context || document;
+
+			// Only use querySelectorAll on non-XML documents
+			// (ID selectors don't work in non-HTML documents)
+			if ( !seed && !Sizzle.isXML(context) ) {
+				// See if we find a selector to speed up
+				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
+
+				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
+					// Speed-up: Sizzle("TAG")
+					if ( match[1] ) {
+						return makeArray( context.getElementsByTagName( query ), extra );
+
+					// Speed-up: Sizzle(".CLASS")
+					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
+						return makeArray( context.getElementsByClassName( match[2] ), extra );
+					}
+				}
+
+				if ( context.nodeType === 9 ) {
+					// Speed-up: Sizzle("body")
+					// The body element only exists once, optimize finding it
+					if ( query === "body" && context.body ) {
+						return makeArray( [ context.body ], extra );
+
+					// Speed-up: Sizzle("#ID")
+					} else if ( match && match[3] ) {
+						var elem = context.getElementById( match[3] );
+
+						// Check parentNode to catch when Blackberry 4.6 returns
+						// nodes that are no longer in the document #6963
+						if ( elem && elem.parentNode ) {
+							// Handle the case where IE and Opera return items
+							// by name instead of ID
+							if ( elem.id === match[3] ) {
+								return makeArray( [ elem ], extra );
+							}
+
+						} else {
+							return makeArray( [], extra );
+						}
+					}
+
+					try {
+						return makeArray( context.querySelectorAll(query), extra );
+					} catch(qsaError) {}
+
+				// qSA works strangely on Element-rooted queries
+				// We can work around this by specifying an extra ID on the root
+				// and working up from there (Thanks to Andrew Dupont for the technique)
+				// IE 8 doesn't work on object elements
+				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+					var oldContext = context,
+						old = context.getAttribute( "id" ),
+						nid = old || id,
+						hasParent = context.parentNode,
+						relativeHierarchySelector = /^\s*[+~]/.test( query );
+
+					if ( !old ) {
+						context.setAttribute( "id", nid );
+					} else {
+						nid = nid.replace( /'/g, "\\$&" );
+					}
+					if ( relativeHierarchySelector && hasParent ) {
+						context = context.parentNode;
+					}
+
+					try {
+						if ( !relativeHierarchySelector || hasParent ) {
+							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
+						}
+
+					} catch(pseudoError) {
+					} finally {
+						if ( !old ) {
+							oldContext.removeAttribute( "id" );
+						}
+					}
+				}
+			}
+
+			return oldSizzle(query, context, extra, seed);
+		};
+
+		for ( var prop in oldSizzle ) {
+			Sizzle[ prop ] = oldSizzle[ prop ];
+		}
+
+		// release memory in IE
+		div = null;
+	})();
+}
+
+(function(){
+	var html = document.documentElement,
+		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector,
+		pseudoWorks = false;
+
+	try {
+		// This should fail with an exception
+		// Gecko does not error, returns false instead
+		matches.call( document.documentElement, "[test!='']:sizzle" );
+
+	} catch( pseudoError ) {
+		pseudoWorks = true;
+	}
+
+	if ( matches ) {
+		Sizzle.matchesSelector = function( node, expr ) {
+			// Make sure that attribute selectors are quoted
+			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+			if ( !Sizzle.isXML( node ) ) {
+				try {
+					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+						return matches.call( node, expr );
+					}
+				} catch(e) {}
+			}
+
+			return Sizzle(expr, null, null, [node]).length > 0;
+		};
+	}
+})();
+
+(function(){
+	var div = document.createElement("div");
+
+	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+	// Opera can't find a second classname (in 9.6)
+	// Also, make sure that getElementsByClassName actually exists
+	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+		return;
+	}
+
+	// Safari caches class attributes, doesn't catch changes (in 3.2)
+	div.lastChild.className = "e";
+
+	if ( div.getElementsByClassName("e").length === 1 ) {
+		return;
+	}
+
+	Expr.order.splice(1, 0, "CLASS");
+	Expr.find.CLASS = function( match, context, isXML ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+			return context.getElementsByClassName(match[1]);
+		}
+	};
+
+	// release memory in IE
+	div = null;
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem.sizcache === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 && !isXML ){
+					elem.sizcache = doneName;
+					elem.sizset = i;
+				}
+
+				if ( elem.nodeName.toLowerCase() === cur ) {
+					match = elem;
+					break;
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem.sizcache === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 ) {
+					if ( !isXML ) {
+						elem.sizcache = doneName;
+						elem.sizset = i;
+					}
+
+					if ( typeof cur !== "string" ) {
+						if ( elem === cur ) {
+							match = true;
+							break;
+						}
+
+					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+						match = elem;
+						break;
+					}
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+if ( document.documentElement.contains ) {
+	Sizzle.contains = function( a, b ) {
+		return a !== b && (a.contains ? a.contains(b) : true);
+	};
+
+} else if ( document.documentElement.compareDocumentPosition ) {
+	Sizzle.contains = function( a, b ) {
+		return !!(a.compareDocumentPosition(b) & 16);
+	};
+
+} else {
+	Sizzle.contains = function() {
+		return false;
+	};
+}
+
+Sizzle.isXML = function( elem ) {
+	// documentElement is verified for cases where it doesn't yet exist
+	// (such as loading iframes in IE - #4833)
+	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function( selector, context ) {
+	var match,
+		tmpSet = [],
+		later = "",
+		root = context.nodeType ? [context] : context;
+
+	// Position selectors must be done after the filter
+	// And so must :not(positional) so we move all PSEUDOs to the end
+	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+		later += match[0];
+		selector = selector.replace( Expr.match.PSEUDO, "" );
+	}
+
+	selector = Expr.relative[selector] ? selector + "*" : selector;
+
+	for ( var i = 0, l = root.length; i < l; i++ ) {
+		Sizzle( selector, root[i], tmpSet );
+	}
+
+	return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})();
+
+
+var runtil = /Until$/,
+	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+	// Note: This RegExp should be improved, or likely pulled from Sizzle
+	rmultiselector = /,/,
+	isSimple = /^.[^:#\[\.,]*$/,
+	slice = Array.prototype.slice,
+	POS = jQuery.expr.match.POS,
+	// methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend({
+	find: function( selector ) {
+		var ret = this.pushStack( "", "find", selector ),
+			length = 0;
+
+		for ( var i = 0, l = this.length; i < l; i++ ) {
+			length = ret.length;
+			jQuery.find( selector, this[i], ret );
+
+			if ( i > 0 ) {
+				// Make sure that the results are unique
+				for ( var n = length; n < ret.length; n++ ) {
+					for ( var r = 0; r < length; r++ ) {
+						if ( ret[r] === ret[n] ) {
+							ret.splice(n--, 1);
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	has: function( target ) {
+		var targets = jQuery( target );
+		return this.filter(function() {
+			for ( var i = 0, l = targets.length; i < l; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector, false), "not", selector);
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector, true), "filter", selector );
+	},
+
+	is: function( selector ) {
+		return !!selector && jQuery.filter( selector, this ).length > 0;
+	},
+
+	closest: function( selectors, context ) {
+		var ret = [], i, l, cur = this[0];
+
+		if ( jQuery.isArray( selectors ) ) {
+			var match, selector,
+				matches = {},
+				level = 1;
+
+			if ( cur && selectors.length ) {
+				for ( i = 0, l = selectors.length; i < l; i++ ) {
+					selector = selectors[i];
+
+					if ( !matches[selector] ) {
+						matches[selector] = jQuery.expr.match.POS.test( selector ) ?
+							jQuery( selector, context || this.context ) :
+							selector;
+					}
+				}
+
+				while ( cur && cur.ownerDocument && cur !== context ) {
+					for ( selector in matches ) {
+						match = matches[selector];
+
+						if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
+							ret.push({ selector: selector, elem: cur, level: level });
+						}
+					}
+
+					cur = cur.parentNode;
+					level++;
+				}
+			}
+
+			return ret;
+		}
+
+		var pos = POS.test( selectors ) ?
+			jQuery( selectors, context || this.context ) : null;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			cur = this[i];
+
+			while ( cur ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+					ret.push( cur );
+					break;
+
+				} else {
+					cur = cur.parentNode;
+					if ( !cur || !cur.ownerDocument || cur === context ) {
+						break;
+					}
+				}
+			}
+		}
+
+		ret = ret.length > 1 ? jQuery.unique(ret) : ret;
+
+		return this.pushStack( ret, "closest", selectors );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	index: function( elem ) {
+		if ( !elem || typeof elem === "string" ) {
+			return jQuery.inArray( this[0],
+				// If it receives a string, the selector is used
+				// If it receives nothing, the siblings are used
+				elem ? jQuery( elem ) : this.parent().children() );
+		}
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	add: function( selector, context ) {
+		var set = typeof selector === "string" ?
+				jQuery( selector, context ) :
+				jQuery.makeArray( selector ),
+			all = jQuery.merge( this.get(), set );
+
+		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+			all :
+			jQuery.unique( all ) );
+	},
+
+	andSelf: function() {
+		return this.add( this.prevObject );
+	}
+});
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+	return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+jQuery.each({
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return jQuery.dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return jQuery.nth( elem, 2, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return jQuery.nth( elem, 2, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return jQuery.dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return jQuery.dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return jQuery.sibling( elem.parentNode.firstChild, elem );
+	},
+	children: function( elem ) {
+		return jQuery.sibling( elem.firstChild );
+	},
+	contents: function( elem ) {
+		return jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.makeArray( elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until ),
+			// The variable 'args' was introduced in
+			// https://github.com/jquery/jquery/commit/52a0238
+			// to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
+			// http://code.google.com/p/v8/issues/detail?id=1050
+			args = slice.call(arguments);
+
+		if ( !runtil.test( name ) ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+			ret = ret.reverse();
+		}
+
+		return this.pushStack( ret, name, args.join(",") );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 ?
+			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+			jQuery.find.matches(expr, elems);
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	nth: function( cur, result, dir, elem ) {
+		result = result || 1;
+		var num = 0;
+
+		for ( ; cur; cur = cur[dir] ) {
+			if ( cur.nodeType === 1 && ++num === result ) {
+				break;
+			}
+		}
+
+		return cur;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			var retVal = !!qualifier.call( elem, i, elem );
+			return retVal === keep;
+		});
+
+	} else if ( qualifier.nodeType ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			return (elem === qualifier) === keep;
+		});
+
+	} else if ( typeof qualifier === "string" ) {
+		var filtered = jQuery.grep(elements, function( elem ) {
+			return elem.nodeType === 1;
+		});
+
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter(qualifier, filtered, !keep);
+		} else {
+			qualifier = jQuery.filter( qualifier, filtered );
+		}
+	}
+
+	return jQuery.grep(elements, function( elem, i ) {
+		return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
+	});
+}
+
+
+
+
+var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnocache = /<(?:script|object|embed|option|style)/i,
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		area: [ 1, "<map>", "</map>" ],
+		_default: [ 0, "", "" ]
+	};
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+	wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+	text: function( text ) {
+		if ( jQuery.isFunction(text) ) {
+			return this.each(function(i) {
+				var self = jQuery( this );
+
+				self.text( text.call(this, i, self.text()) );
+			});
+		}
+
+		if ( typeof text !== "object" && text !== undefined ) {
+			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+		}
+
+		return jQuery.text( this );
+	},
+
+	wrapAll: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapAll( html.call(this, i) );
+			});
+		}
+
+		if ( this[0] ) {
+			// The elements to wrap the target around
+			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+			if ( this[0].parentNode ) {
+				wrap.insertBefore( this[0] );
+			}
+
+			wrap.map(function() {
+				var elem = this;
+
+				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				return elem;
+			}).append(this);
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapInner( html.call(this, i) );
+			});
+		}
+
+		return this.each(function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		});
+	},
+
+	wrap: function( html ) {
+		return this.each(function() {
+			jQuery( this ).wrapAll( html );
+		});
+	},
+
+	unwrap: function() {
+		return this.parent().each(function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		}).end();
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this );
+			});
+		} else if ( arguments.length ) {
+			var set = jQuery(arguments[0]);
+			set.push.apply( set, this.toArray() );
+			return this.pushStack( set, "before", arguments );
+		}
+	},
+
+	after: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			});
+		} else if ( arguments.length ) {
+			var set = this.pushStack( this, "after", arguments );
+			set.push.apply( set, jQuery(arguments[0]).toArray() );
+			return set;
+		}
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+				if ( !keepData && elem.nodeType === 1 ) {
+					jQuery.cleanData( elem.getElementsByTagName("*") );
+					jQuery.cleanData( [ elem ] );
+				}
+
+				if ( elem.parentNode ) {
+					elem.parentNode.removeChild( elem );
+				}
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( elem.getElementsByTagName("*") );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function () {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		});
+	},
+
+	html: function( value ) {
+		if ( value === undefined ) {
+			return this[0] && this[0].nodeType === 1 ?
+				this[0].innerHTML.replace(rinlinejQuery, "") :
+				null;
+
+		// See if we can take a shortcut and just use innerHTML
+		} else if ( typeof value === "string" && !rnocache.test( value ) &&
+			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
+			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
+
+			value = value.replace(rxhtmlTag, "<$1></$2>");
+
+			try {
+				for ( var i = 0, l = this.length; i < l; i++ ) {
+					// Remove element nodes and prevent memory leaks
+					if ( this[i].nodeType === 1 ) {
+						jQuery.cleanData( this[i].getElementsByTagName("*") );
+						this[i].innerHTML = value;
+					}
+				}
+
+			// If using innerHTML throws an exception, use the fallback method
+			} catch(e) {
+				this.empty().append( value );
+			}
+
+		} else if ( jQuery.isFunction( value ) ) {
+			this.each(function(i){
+				var self = jQuery( this );
+
+				self.html( value.call(this, i, self.html()) );
+			});
+
+		} else {
+			this.empty().append( value );
+		}
+
+		return this;
+	},
+
+	replaceWith: function( value ) {
+		if ( this[0] && this[0].parentNode ) {
+			// Make sure that the elements are removed from the DOM before they are inserted
+			// this can help fix replacing a parent with child elements
+			if ( jQuery.isFunction( value ) ) {
+				return this.each(function(i) {
+					var self = jQuery(this), old = self.html();
+					self.replaceWith( value.call( this, i, old ) );
+				});
+			}
+
+			if ( typeof value !== "string" ) {
+				value = jQuery( value ).detach();
+			}
+
+			return this.each(function() {
+				var next = this.nextSibling,
+					parent = this.parentNode;
+
+				jQuery( this ).remove();
+
+				if ( next ) {
+					jQuery(next).before( value );
+				} else {
+					jQuery(parent).append( value );
+				}
+			});
+		} else {
+			return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
+		}
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, table, callback ) {
+		var results, first, fragment, parent,
+			value = args[0],
+			scripts = [];
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+			return this.each(function() {
+				jQuery(this).domManip( args, table, callback, true );
+			});
+		}
+
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				args[0] = value.call(this, i, table ? self.html() : undefined);
+				self.domManip( args, table, callback );
+			});
+		}
+
+		if ( this[0] ) {
+			parent = value && value.parentNode;
+
+			// If we're in a fragment, just use that instead of building a new one
+			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+				results = { fragment: parent };
+
+			} else {
+				results = jQuery.buildFragment( args, this, scripts );
+			}
+
+			fragment = results.fragment;
+
+			if ( fragment.childNodes.length === 1 ) {
+				first = fragment = fragment.firstChild;
+			} else {
+				first = fragment.firstChild;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+
+				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
+					callback.call(
+						table ?
+							root(this[i], first) :
+							this[i],
+						// Make sure that we do not leak memory by inadvertently discarding
+						// the original fragment (which might have attached data) instead of
+						// using it; in addition, use the original fragment object for the last
+						// item instead of first because it can end up being emptied incorrectly
+						// in certain situations (Bug #8070).
+						// Fragments from the fragment cache must always be cloned and never used
+						// in place.
+						results.cacheable || (l > 1 && i < lastIndex) ?
+							jQuery.clone( fragment, true, true ) :
+							fragment
+					);
+				}
+			}
+
+			if ( scripts.length ) {
+				jQuery.each( scripts, evalScript );
+			}
+		}
+
+		return this;
+	}
+});
+
+function root( elem, cur ) {
+	return jQuery.nodeName(elem, "table") ?
+		(elem.getElementsByTagName("tbody")[0] ||
+		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+		elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var internalKey = jQuery.expando,
+		oldData = jQuery.data( src ),
+		curData = jQuery.data( dest, oldData );
+
+	// Switch to use the internal data object, if it exists, for the next
+	// stage of data copying
+	if ( (oldData = oldData[ internalKey ]) ) {
+		var events = oldData.events;
+				curData = curData[ internalKey ] = jQuery.extend({}, oldData);
+
+		if ( events ) {
+			delete curData.handle;
+			curData.events = {};
+
+			for ( var type in events ) {
+				for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
+					jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
+				}
+			}
+		}
+	}
+}
+
+function cloneFixAttributes(src, dest) {
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	var nodeName = dest.nodeName.toLowerCase();
+
+	// clearAttributes removes the attributes, which we don't want,
+	// but also removes the attachEvent events, which we *do* want
+	dest.clearAttributes();
+
+	// mergeAttributes, in contrast, only merges back on the
+	// original attributes, not the events
+	dest.mergeAttributes(src);
+
+	// IE6-8 fail to clone children inside object elements that use
+	// the proprietary classid attribute value (rather than the type
+	// attribute) to identify the type of content to display
+	if ( nodeName === "object" ) {
+		dest.outerHTML = src.outerHTML;
+
+	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+		if ( src.checked ) {
+			dest.defaultChecked = dest.checked = src.checked;
+		}
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+
+	// Event data gets referenced instead of copied if the expando
+	// gets copied too
+	dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, nodes, scripts ) {
+	var fragment, cacheable, cacheresults,
+		doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
+
+	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+	// Cloning options loses the selected state, so don't cache them
+	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+	if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
+		args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
+
+		cacheable = true;
+		cacheresults = jQuery.fragments[ args[0] ];
+		if ( cacheresults ) {
+			if ( cacheresults !== 1 ) {
+				fragment = cacheresults;
+			}
+		}
+	}
+
+	if ( !fragment ) {
+		fragment = doc.createDocumentFragment();
+		jQuery.clean( args, doc, fragment, scripts );
+	}
+
+	if ( cacheable ) {
+		jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
+	}
+
+	return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var ret = [],
+			insert = jQuery( selector ),
+			parent = this.length === 1 && this[0].parentNode;
+
+		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+			insert[ original ]( this[0] );
+			return this;
+
+		} else {
+			for ( var i = 0, l = insert.length; i < l; i++ ) {
+				var elems = (i > 0 ? this.clone(true) : this).get();
+				jQuery( insert[i] )[ original ]( elems );
+				ret = ret.concat( elems );
+			}
+
+			return this.pushStack( ret, name, insert.selector );
+		}
+	};
+});
+
+function getAll( elem ) {
+	if ( "getElementsByTagName" in elem ) {
+		return elem.getElementsByTagName( "*" );
+
+	} else if ( "querySelectorAll" in elem ) {
+		return elem.querySelectorAll( "*" );
+
+	} else {
+		return [];
+	}
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var clone = elem.cloneNode(true),
+				srcElements,
+				destElements,
+				i;
+
+		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+			// IE copies events bound via attachEvent when using cloneNode.
+			// Calling detachEvent on the clone will also remove the events
+			// from the original. In order to get around this, we use some
+			// proprietary methods to clear the events. Thanks to MooTools
+			// guys for this hotness.
+
+			cloneFixAttributes( elem, clone );
+
+			// Using Sizzle here is crazy slow, so we use getElementsByTagName
+			// instead
+			srcElements = getAll( elem );
+			destElements = getAll( clone );
+
+			// Weird iteration because IE will replace the length property
+			// with an element if you are cloning the body and one of the
+			// elements on the page has a name or id of "length"
+			for ( i = 0; srcElements[i]; ++i ) {
+				cloneFixAttributes( srcElements[i], destElements[i] );
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			cloneCopyEvent( elem, clone );
+
+			if ( deepDataAndEvents ) {
+				srcElements = getAll( elem );
+				destElements = getAll( clone );
+
+				for ( i = 0; srcElements[i]; ++i ) {
+					cloneCopyEvent( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		// Return the cloned set
+		return clone;
+},
+	clean: function( elems, context, fragment, scripts ) {
+		context = context || document;
+
+		// !context.createElement fails in IE with an error but returns typeof 'object'
+		if ( typeof context.createElement === "undefined" ) {
+			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+		}
+
+		var ret = [];
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( typeof elem === "number" ) {
+				elem += "";
+			}
+
+			if ( !elem ) {
+				continue;
+			}
+
+			// Convert html string into DOM nodes
+			if ( typeof elem === "string" && !rhtml.test( elem ) ) {
+				elem = context.createTextNode( elem );
+
+			} else if ( typeof elem === "string" ) {
+				// Fix "XHTML"-style tags in all browsers
+				elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+				// Trim whitespace, otherwise indexOf won't work as expected
+				var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
+					wrap = wrapMap[ tag ] || wrapMap._default,
+					depth = wrap[0],
+					div = context.createElement("div");
+
+				// Go to html and back, then peel off extra wrappers
+				div.innerHTML = wrap[1] + elem + wrap[2];
+
+				// Move to the right depth
+				while ( depth-- ) {
+					div = div.lastChild;
+				}
+
+				// Remove IE's autoinserted <tbody> from table fragments
+				if ( !jQuery.support.tbody ) {
+
+					// String was a <table>, *may* have spurious <tbody>
+					var hasBody = rtbody.test(elem),
+						tbody = tag === "table" && !hasBody ?
+							div.firstChild && div.firstChild.childNodes :
+
+							// String was a bare <thead> or <tfoot>
+							wrap[1] === "<table>" && !hasBody ?
+								div.childNodes :
+								[];
+
+					for ( var j = tbody.length - 1; j >= 0 ; --j ) {
+						if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+							tbody[ j ].parentNode.removeChild( tbody[ j ] );
+						}
+					}
+
+				}
+
+				// IE completely kills leading whitespace when innerHTML is used
+				if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+					div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+				}
+
+				elem = div.childNodes;
+			}
+
+			if ( elem.nodeType ) {
+				ret.push( elem );
+			} else {
+				ret = jQuery.merge( ret, elem );
+			}
+		}
+
+		if ( fragment ) {
+			for ( i = 0; ret[i]; i++ ) {
+				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
+					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+
+				} else {
+					if ( ret[i].nodeType === 1 ) {
+						ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
+					}
+					fragment.appendChild( ret[i] );
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	cleanData: function( elems ) {
+		var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
+			deleteExpando = jQuery.support.deleteExpando;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+				continue;
+			}
+
+			id = elem[ jQuery.expando ];
+
+			if ( id ) {
+				data = cache[ id ] && cache[ id ][ internalKey ];
+
+				if ( data && data.events ) {
+					for ( var type in data.events ) {
+						if ( special[ type ] ) {
+							jQuery.event.remove( elem, type );
+
+						// This is a shortcut to avoid jQuery.event.remove's overhead
+						} else {
+							jQuery.removeEvent( elem, type, data.handle );
+						}
+					}
+
+					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
+					if ( data.handle ) {
+						data.handle.elem = null;
+					}
+				}
+
+				if ( deleteExpando ) {
+					delete elem[ jQuery.expando ];
+
+				} else if ( elem.removeAttribute ) {
+					elem.removeAttribute( jQuery.expando );
+				}
+
+				delete cache[ id ];
+			}
+		}
+	}
+});
+
+function evalScript( i, elem ) {
+	if ( elem.src ) {
+		jQuery.ajax({
+			url: elem.src,
+			async: false,
+			dataType: "script"
+		});
+	} else {
+		jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
+	}
+
+	if ( elem.parentNode ) {
+		elem.parentNode.removeChild( elem );
+	}
+}
+
+
+
+
+var ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity=([^)]*)/,
+	rdashAlpha = /-([a-z])/ig,
+	rupper = /([A-Z])/g,
+	rnumpx = /^-?\d+(?:px)?$/i,
+	rnum = /^-?\d/,
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssWidth = [ "Left", "Right" ],
+	cssHeight = [ "Top", "Bottom" ],
+	curCSS,
+
+	getComputedStyle,
+	currentStyle,
+
+	fcamelCase = function( all, letter ) {
+		return letter.toUpperCase();
+	};
+
+jQuery.fn.css = function( name, value ) {
+	// Setting 'undefined' is a no-op
+	if ( arguments.length === 2 && value === undefined ) {
+		return this;
+	}
+
+	return jQuery.access( this, name, value, true, function( elem, name, value ) {
+		return value !== undefined ?
+			jQuery.style( elem, name, value ) :
+			jQuery.css( elem, name );
+	});
+};
+
+jQuery.extend({
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity", "opacity" );
+					return ret === "" ? "1" : ret;
+
+				} else {
+					return elem.style.opacity;
+				}
+			}
+		}
+	},
+
+	// Exclude the following css properties to add px
+	cssNumber: {
+		"zIndex": true,
+		"fontWeight": true,
+		"opacity": true,
+		"zoom": true,
+		"lineHeight": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+		// normalize float css property
+		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, origName = jQuery.camelCase( name ),
+			style = elem.style, hooks = jQuery.cssHooks[ origName ];
+
+		name = jQuery.cssProps[ origName ] || origName;
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			// Make sure that NaN and null values aren't set. See: #7116
+			if ( typeof value === "number" && isNaN( value ) || value == null ) {
+				return;
+			}
+
+			// If a number was passed in, add 'px' to the (except for certain CSS properties)
+			if ( typeof value === "number" && !jQuery.cssNumber[ origName ] ) {
+				value += "px";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} else {
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra ) {
+		// Make sure that we're working with the right name
+		var ret, origName = jQuery.camelCase( name ),
+			hooks = jQuery.cssHooks[ origName ];
+
+		name = jQuery.cssProps[ origName ] || origName;
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+			return ret;
+
+		// Otherwise, if a way to get the computed value exists, use that
+		} else if ( curCSS ) {
+			return curCSS( elem, name, origName );
+		}
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var old = {};
+
+		// Remember the old values, and insert the new ones
+		for ( var name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		callback.call( elem );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+	},
+
+	camelCase: function( string ) {
+		return string.replace( rdashAlpha, fcamelCase );
+	}
+});
+
+// DEPRECATED, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
+
+jQuery.each(["height", "width"], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			var val;
+
+			if ( computed ) {
+				if ( elem.offsetWidth !== 0 ) {
+					val = getWH( elem, name, extra );
+
+				} else {
+					jQuery.swap( elem, cssShow, function() {
+						val = getWH( elem, name, extra );
+					});
+				}
+
+				if ( val <= 0 ) {
+					val = curCSS( elem, name, name );
+
+					if ( val === "0px" && currentStyle ) {
+						val = currentStyle( elem, name, name );
+					}
+
+					if ( val != null ) {
+						// Should return "auto" instead of 0, use 0 for
+						// temporary backwards-compat
+						return val === "" || val === "auto" ? "0px" : val;
+					}
+				}
+
+				if ( val < 0 || val == null ) {
+					val = elem.style[ name ];
+
+					// Should return "auto" instead of 0, use 0 for
+					// temporary backwards-compat
+					return val === "" || val === "auto" ? "0px" : val;
+				}
+
+				return typeof val === "string" ? val : val + "px";
+			}
+		},
+
+		set: function( elem, value ) {
+			if ( rnumpx.test( value ) ) {
+				// ignore negative width and height values #1599
+				value = parseFloat(value);
+
+				if ( value >= 0 ) {
+					return value + "px";
+				}
+
+			} else {
+				return value;
+			}
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test((computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "") ?
+				(parseFloat(RegExp.$1) / 100) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style;
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// Set the alpha filter to set the opacity
+			var opacity = jQuery.isNaN(value) ?
+				"" :
+				"alpha(opacity=" + value * 100 + ")",
+				filter = style.filter || "";
+
+			style.filter = ralpha.test(filter) ?
+				filter.replace(ralpha, opacity) :
+				style.filter + ' ' + opacity;
+		}
+	};
+}
+
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+	getComputedStyle = function( elem, newName, name ) {
+		var ret, defaultView, computedStyle;
+
+		name = name.replace( rupper, "-$1" ).toLowerCase();
+
+		if ( !(defaultView = elem.ownerDocument.defaultView) ) {
+			return undefined;
+		}
+
+		if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+			ret = computedStyle.getPropertyValue( name );
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+		}
+
+		return ret;
+	};
+}
+
+if ( document.documentElement.currentStyle ) {
+	currentStyle = function( elem, name ) {
+		var left,
+			ret = elem.currentStyle && elem.currentStyle[ name ],
+			rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],
+			style = elem.style;
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
+			// Remember the original values
+			left = style.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : (ret || 0);
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+curCSS = getComputedStyle || currentStyle;
+
+function getWH( elem, name, extra ) {
+	var which = name === "width" ? cssWidth : cssHeight,
+		val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
+
+	if ( extra === "border" ) {
+		return val;
+	}
+
+	jQuery.each( which, function() {
+		if ( !extra ) {
+			val -= parseFloat(jQuery.css( elem, "padding" + this )) || 0;
+		}
+
+		if ( extra === "margin" ) {
+			val += parseFloat(jQuery.css( elem, "margin" + this )) || 0;
+
+		} else {
+			val -= parseFloat(jQuery.css( elem, "border" + this + "Width" )) || 0;
+		}
+	});
+
+	return val;
+}
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		var width = elem.offsetWidth,
+			height = elem.offsetHeight;
+
+		return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+
+
+
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rhash = /#.*$/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /(?:^file|^widget|\-extension):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rquery = /\?/,
+	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+	rselectTextarea = /^(?:select|textarea)/i,
+	rspacesAjax = /\s+/,
+	rts = /([?&])_=[^&]*/,
+	rucHeaders = /(^|\-)([a-z])/g,
+	rucHeadersFunc = function( _, $1, $2 ) {
+		return $1 + $2.toUpperCase();
+	},
+	rurl = /^([\w\+\.\-]+:)\/\/([^\/?#:]*)(?::(\d+))?/,
+
+	// Keep a copy of the old load method
+	_load = jQuery.fn.load,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Document location
+	ajaxLocation,
+
+	// Document location segments
+	ajaxLocParts;
+
+// #8138, IE may throw an exception when accessing
+// a field from document.location if document.domain has been set
+try {
+	ajaxLocation = document.location.href;
+} catch( e ) {
+	// Use the href attribute of an A element
+	// since IE will modify it given document.location
+	ajaxLocation = document.createElement( "a" );
+	ajaxLocation.href = "";
+	ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() );
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		if ( jQuery.isFunction( func ) ) {
+			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+				i = 0,
+				length = dataTypes.length,
+				dataType,
+				list,
+				placeBefore;
+
+			// For each dataType in the dataTypeExpression
+			for(; i < length; i++ ) {
+				dataType = dataTypes[ i ];
+				// We control if we're asked to add before
+				// any existing element
+				placeBefore = /^\+/.test( dataType );
+				if ( placeBefore ) {
+					dataType = dataType.substr( 1 ) || "*";
+				}
+				list = structure[ dataType ] = structure[ dataType ] || [];
+				// then we add to the structure accordingly
+				list[ placeBefore ? "unshift" : "push" ]( func );
+			}
+		}
+	};
+}
+
+//Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+		dataType /* internal */, inspected /* internal */ ) {
+
+	dataType = dataType || options.dataTypes[ 0 ];
+	inspected = inspected || {};
+
+	inspected[ dataType ] = true;
+
+	var list = structure[ dataType ],
+		i = 0,
+		length = list ? list.length : 0,
+		executeOnly = ( structure === prefilters ),
+		selection;
+
+	for(; i < length && ( executeOnly || !selection ); i++ ) {
+		selection = list[ i ]( options, originalOptions, jqXHR );
+		// If we got redirected to another dataType
+		// we try there if executing only and not done already
+		if ( typeof selection === "string" ) {
+			if ( !executeOnly || inspected[ selection ] ) {
+				selection = undefined;
+			} else {
+				options.dataTypes.unshift( selection );
+				selection = inspectPrefiltersOrTransports(
+						structure, options, originalOptions, jqXHR, selection, inspected );
+			}
+		}
+	}
+	// If we're only executing or nothing was selected
+	// we try the catchall dataType if not done already
+	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+		selection = inspectPrefiltersOrTransports(
+				structure, options, originalOptions, jqXHR, "*", inspected );
+	}
+	// unnecessary when only executing (prefilters)
+	// but it'll be ignored by the caller in that case
+	return selection;
+}
+
+jQuery.fn.extend({
+	load: function( url, params, callback ) {
+		if ( typeof url !== "string" && _load ) {
+			return _load.apply( this, arguments );
+
+		// Don't do a request if no elements are being requested
+		} else if ( !this.length ) {
+			return this;
+		}
+
+		var off = url.indexOf( " " );
+		if ( off >= 0 ) {
+			var selector = url.slice( off, url.length );
+			url = url.slice( 0, off );
+		}
+
+		// Default to a GET request
+		var type = "GET";
+
+		// If the second parameter was provided
+		if ( params ) {
+			// If it's a function
+			if ( jQuery.isFunction( params ) ) {
+				// We assume that it's the callback
+				callback = params;
+				params = undefined;
+
+			// Otherwise, build a param string
+			} else if ( typeof params === "object" ) {
+				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+				type = "POST";
+			}
+		}
+
+		var self = this;
+
+		// Request the remote document
+		jQuery.ajax({
+			url: url,
+			type: type,
+			dataType: "html",
+			data: params,
+			// Complete callback (responseText is used internally)
+			complete: function( jqXHR, status, responseText ) {
+				// Store the response as specified by the jqXHR object
+				responseText = jqXHR.responseText;
+				// If successful, inject the HTML into all the matched elements
+				if ( jqXHR.isResolved() ) {
+					// #4825: Get the actual response in case
+					// a dataFilter is present in ajaxSettings
+					jqXHR.done(function( r ) {
+						responseText = r;
+					});
+					// See if a selector was specified
+					self.html( selector ?
+						// Create a dummy div to hold the results
+						jQuery("<div>")
+							// inject the contents of the document in, removing the scripts
+							// to avoid any 'Permission Denied' errors in IE
+							.append(responseText.replace(rscript, ""))
+
+							// Locate the specified elements
+							.find(selector) :
+
+						// If not, just inject the full result
+						responseText );
+				}
+
+				if ( callback ) {
+					self.each( callback, [ responseText, status, jqXHR ] );
+				}
+			}
+		});
+
+		return this;
+	},
+
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+
+	serializeArray: function() {
+		return this.map(function(){
+			return this.elements ? jQuery.makeArray( this.elements ) : this;
+		})
+		.filter(function(){
+			return this.name && !this.disabled &&
+				( this.checked || rselectTextarea.test( this.nodeName ) ||
+					rinput.test( this.type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val, i ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+	jQuery.fn[ o ] = function( f ){
+		return this.bind( o, f );
+	};
+} );
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+		// shift arguments if data argument was omitted
+		if ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		return jQuery.ajax({
+			type: method,
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	};
+} );
+
+jQuery.extend({
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function ( target, settings ) {
+		if ( !settings ) {
+			// Only one parameter, we extend ajaxSettings
+			settings = target;
+			target = jQuery.extend( true, jQuery.ajaxSettings, settings );
+		} else {
+			// target was provided, we extend into it
+			jQuery.extend( true, target, jQuery.ajaxSettings, settings );
+		}
+		// Flatten fields we don't want deep extended
+		for( var field in { context: 1, url: 1 } ) {
+			if ( field in settings ) {
+				target[ field ] = settings[ field ];
+			} else if( field in jQuery.ajaxSettings ) {
+				target[ field ] = jQuery.ajaxSettings[ field ];
+			}
+		}
+		return target;
+	},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		type: "GET",
+		contentType: "application/x-www-form-urlencoded",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		traditional: false,
+		headers: {},
+		crossDomain: null,
+		*/
+
+		accepts: {
+			xml: "application/xml, text/xml",
+			html: "text/html",
+			text: "text/plain",
+			json: "application/json, text/javascript",
+			"*": "*/*"
+		},
+
+		contents: {
+			xml: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText"
+		},
+
+		// List of data converters
+		// 1) key format is "source_type destination_type" (a single space in-between)
+		// 2) the catchall symbol "*" can be used for source_type
+		converters: {
+
+			// Convert anything to text
+			"* text": window.String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": jQuery.parseJSON,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		}
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var // Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+			// Callbacks context
+			callbackContext = s.context || s,
+			// Context for global events
+			// It's the callbackContext if one was provided in the options
+			// and if it's a DOM node or a jQuery collection
+			globalEventContext = callbackContext !== s &&
+				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+						jQuery( callbackContext ) : jQuery.event,
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery._Deferred(),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// ifModified key
+			ifModifiedKey,
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+			// transport
+			transport,
+			// timeout handle
+			timeoutTimer,
+			// Cross-domain detection vars
+			parts,
+			// The jqXHR state
+			state = 0,
+			// To know if global events are to be dispatched
+			fireGlobals,
+			// Loop variable
+			i,
+			// Fake xhr
+			jqXHR = {
+
+				readyState: 0,
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( !state ) {
+						requestHeaders[ name.toLowerCase().replace( rucHeaders, rucHeadersFunc ) ] = value;
+					}
+					return this;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() ];
+					}
+					return match === undefined ? null : match;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					statusText = statusText || "abort";
+					if ( transport ) {
+						transport.abort( statusText );
+					}
+					done( 0, statusText );
+					return this;
+				}
+			};
+
+		// Callback for when everything is done
+		// It is defined here because jslint complains if it is declared
+		// at the end of the function (which would be more logical and readable)
+		function done( status, statusText, responses, headers ) {
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status ? 4 : 0;
+
+			var isSuccess,
+				success,
+				error,
+				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+				lastModified,
+				etag;
+
+			// If successful, handle type chaining
+			if ( status >= 200 && status < 300 || status === 304 ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+
+					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+						jQuery.lastModified[ ifModifiedKey ] = lastModified;
+					}
+					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+						jQuery.etag[ ifModifiedKey ] = etag;
+					}
+				}
+
+				// If not modified
+				if ( status === 304 ) {
+
+					statusText = "notmodified";
+					isSuccess = true;
+
+				// If we have data
+				} else {
+
+					try {
+						success = ajaxConvert( s, response );
+						statusText = "success";
+						isSuccess = true;
+					} catch(e) {
+						// We have a parsererror
+						statusText = "parsererror";
+						error = e;
+					}
+				}
+			} else {
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if( !statusText || status ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = statusText;
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+						[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s] );
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+		jqXHR.complete = completeDeferred.done;
+
+		// Status-dependent callbacks
+		jqXHR.statusCode = function( map ) {
+			if ( map ) {
+				var tmp;
+				if ( state < 2 ) {
+					for( tmp in map ) {
+						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+					}
+				} else {
+					tmp = map[ jqXHR.status ];
+					jqXHR.then( tmp, tmp );
+				}
+			}
+			return this;
+		};
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
+
+		// Determine if a cross-domain request is in order
+		if ( !s.crossDomain ) {
+			parts = rurl.exec( s.url.toLowerCase() );
+			s.crossDomain = !!( parts &&
+				( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
+					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+			);
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefiler, stop there
+		if ( state === 2 ) {
+			return false;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = s.global;
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+			}
+
+			// Get ifModifiedKey before adding the anti-cache parameter
+			ifModifiedKey = s.url;
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+
+				var ts = jQuery.now(),
+					// try replacing _= if it is there
+					ret = s.url.replace( rts, "$1_=" + ts );
+
+				// if nothing was replaced, add timestamp to the end
+				s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			requestHeaders[ "Content-Type" ] = s.contentType;
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			ifModifiedKey = ifModifiedKey || s.url;
+			if ( jQuery.lastModified[ ifModifiedKey ] ) {
+				requestHeaders[ "If-Modified-Since" ] = jQuery.lastModified[ ifModifiedKey ];
+			}
+			if ( jQuery.etag[ ifModifiedKey ] ) {
+				requestHeaders[ "If-None-Match" ] = jQuery.etag[ ifModifiedKey ];
+			}
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		requestHeaders.Accept = s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+			s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", */*; q=0.01" : "" ) :
+			s.accepts[ "*" ];
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+				// Abort if not done already
+				jqXHR.abort();
+				return false;
+
+		}
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = setTimeout( function(){
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch (e) {
+				// Propagate exception as error if not done
+				if ( status < 2 ) {
+					done( -1, e );
+				// Simply rethrow otherwise
+				} else {
+					jQuery.error( e );
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	// Serialize an array of form elements or a set of
+	// key/values into a query string
+	param: function( a, traditional ) {
+		var s = [],
+			add = function( key, value ) {
+				// If value is a function, invoke it and return its value
+				value = jQuery.isFunction( value ) ? value() : value;
+				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+			};
+
+		// Set traditional to true for jQuery <= 1.3.2 behavior.
+		if ( traditional === undefined ) {
+			traditional = jQuery.ajaxSettings.traditional;
+		}
+
+		// If an array was passed in, assume that it is an array of form elements.
+		if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+			// Serialize the form elements
+			jQuery.each( a, function() {
+				add( this.name, this.value );
+			} );
+
+		} else {
+			// If traditional, encode the "old" way (the way 1.3.2 or older
+			// did it), otherwise encode params recursively.
+			for ( var prefix in a ) {
+				buildParams( prefix, a[ prefix ], traditional, add );
+			}
+		}
+
+		// Return the resulting serialization
+		return s.join( "&" ).replace( r20, "+" );
+	}
+});
+
+function buildParams( prefix, obj, traditional, add ) {
+	if ( jQuery.isArray( obj ) && obj.length ) {
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+				// If array item is non-scalar (array or object), encode its
+				// numeric index to resolve deserialization ambiguity issues.
+				// Note that rack (as of 1.0.0) can't currently deserialize
+				// nested arrays properly, and attempting to do so may cause
+				// a server error. Possible fixes are to modify rack's
+				// deserialization algorithm or to provide an option or flag
+				// to force array serialization to be shallow.
+				buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && obj != null && typeof obj === "object" ) {
+		// If we see an array here, it is empty and should be treated as an empty
+		// object
+		if ( jQuery.isArray( obj ) || jQuery.isEmptyObject( obj ) ) {
+			add( prefix, "" );
+
+		// Serialize object item.
+		} else {
+			for ( var name in obj ) {
+				buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+			}
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields,
+		ct,
+		type,
+		finalDataType,
+		firstDataType;
+
+	// Fill responseXXX fields
+	for( type in responseFields ) {
+		if ( type in responses ) {
+			jqXHR[ responseFields[type] ] = responses[ type ];
+		}
+	}
+
+	// Remove auto dataType and get content-type in the process
+	while( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	var dataTypes = s.dataTypes,
+		converters = {},
+		i,
+		key,
+		length = dataTypes.length,
+		tmp,
+		// Current and previous dataTypes
+		current = dataTypes[ 0 ],
+		prev,
+		// Conversion expression
+		conversion,
+		// Conversion function
+		conv,
+		// Conversion functions (transitive conversion)
+		conv1,
+		conv2;
+
+	// For each dataType in the chain
+	for( i = 1; i < length; i++ ) {
+
+		// Create converters map
+		// with lowercased keys
+		if ( i === 1 ) {
+			for( key in s.converters ) {
+				if( typeof key === "string" ) {
+					converters[ key.toLowerCase() ] = s.converters[ key ];
+				}
+			}
+		}
+
+		// Get the dataTypes
+		prev = current;
+		current = dataTypes[ i ];
+
+		// If current is auto dataType, update it to prev
+		if( current === "*" ) {
+			current = prev;
+		// If no auto and dataTypes are actually different
+		} else if ( prev !== "*" && prev !== current ) {
+
+			// Get the converter
+			conversion = prev + " " + current;
+			conv = converters[ conversion ] || converters[ "* " + current ];
+
+			// If there is no direct converter, search transitively
+			if ( !conv ) {
+				conv2 = undefined;
+				for( conv1 in converters ) {
+					tmp = conv1.split( " " );
+					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
+						conv2 = converters[ tmp[1] + " " + current ];
+						if ( conv2 ) {
+							conv1 = converters[ conv1 ];
+							if ( conv1 === true ) {
+								conv = conv2;
+							} else if ( conv2 === true ) {
+								conv = conv1;
+							}
+							break;
+						}
+					}
+				}
+			}
+			// If we found no converter, dispatch an error
+			if ( !( conv || conv2 ) ) {
+				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
+			}
+			// If found converter is not an equivalence
+			if ( conv !== true ) {
+				// Convert with 1 or 2 converters accordingly
+				response = conv ? conv( response ) : conv2( conv1(response) );
+			}
+		}
+	}
+	return response;
+}
+
+
+
+
+var jsc = jQuery.now(),
+	jsre = /(\=)\?(&|$)|()\?\?()/i;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		return jQuery.expando + "_" + ( jsc++ );
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var dataIsString = ( typeof s.data === "string" );
+
+	if ( s.dataTypes[ 0 ] === "jsonp" ||
+		originalSettings.jsonpCallback ||
+		originalSettings.jsonp != null ||
+		s.jsonp !== false && ( jsre.test( s.url ) ||
+				dataIsString && jsre.test( s.data ) ) ) {
+
+		var responseContainer,
+			jsonpCallback = s.jsonpCallback =
+				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
+			previous = window[ jsonpCallback ],
+			url = s.url,
+			data = s.data,
+			replace = "$1" + jsonpCallback + "$2",
+			cleanUp = function() {
+				// Set callback back to previous value
+				window[ jsonpCallback ] = previous;
+				// Call if it was a function and we have a response
+				if ( responseContainer && jQuery.isFunction( previous ) ) {
+					window[ jsonpCallback ]( responseContainer[ 0 ] );
+				}
+			};
+
+		if ( s.jsonp !== false ) {
+			url = url.replace( jsre, replace );
+			if ( s.url === url ) {
+				if ( dataIsString ) {
+					data = data.replace( jsre, replace );
+				}
+				if ( s.data === data ) {
+					// Add callback manually
+					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+				}
+			}
+		}
+
+		s.url = url;
+		s.data = data;
+
+		// Install callback
+		window[ jsonpCallback ] = function( response ) {
+			responseContainer = [ response ];
+		};
+
+		// Install cleanUp function
+		jqXHR.then( cleanUp, cleanUp );
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( jsonpCallback + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Delegate to script
+		return "script";
+	}
+} );
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /javascript|ecmascript/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+} );
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement( "script" );
+
+				script.async = "async";
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( head && script.parentNode ) {
+							head.removeChild( script );
+						}
+
+						// Dereference the script
+						script = undefined;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+				// This arises when a base node is used (#2709 and #4378).
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( 0, 1 );
+				}
+			}
+		};
+	}
+} );
+
+
+
+
+var // #5280: next active xhr id and list of active xhrs' callbacks
+	xhrId = jQuery.now(),
+	xhrCallbacks,
+
+	// XHR used to determine supports properties
+	testXHR;
+
+// #5280: Internet Explorer will keep connections alive if we don't abort on unload
+function xhrOnUnloadAbort() {
+	jQuery( window ).unload(function() {
+		// Abort all pending requests
+		for ( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( 0, 1 );
+		}
+	});
+}
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Test if we can create an xhr object
+testXHR = jQuery.ajaxSettings.xhr();
+jQuery.support.ajax = !!testXHR;
+
+// Does this browser support crossDomain XHR requests
+jQuery.support.cors = testXHR && ( "withCredentials" in testXHR );
+
+// No need for the temporary xhr anymore
+testXHR = undefined;
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var xhr = s.xhr(),
+						handle,
+						i;
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.mimeType );
+					}
+
+					// Requested-With header
+					// Not set for crossDomain requests with no content
+					// (see why at http://trac.dojotoolkit.org/ticket/9486)
+					// Won't change header if already provided
+					if ( !( s.crossDomain && !s.hasContent ) && !headers["X-Requested-With"] ) {
+						headers[ "X-Requested-With" ] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( _ ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+
+						var status,
+							statusText,
+							responseHeaders,
+							responses,
+							xml;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occured
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									delete xhrCallbacks[ handle ];
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+									responses = {};
+									xml = xhr.responseXML;
+
+									// Construct response list
+									if ( xml && xml.documentElement /* #4958 */ ) {
+										responses.xml = xml;
+									}
+									responses.text = xhr.responseText;
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					// if we're in sync mode or it's in cache
+					// and has been retrieved directly (IE6 & IE7)
+					// we need to manually fire the callback
+					if ( !s.async || xhr.readyState === 4 ) {
+						callback();
+					} else {
+						// Create the active xhrs callbacks list if needed
+						// and attach the unload handler
+						if ( !xhrCallbacks ) {
+							xhrCallbacks = {};
+							xhrOnUnloadAbort();
+						}
+						// Add to list of active xhrs callbacks
+						handle = xhrId++;
+						xhr.onreadystatechange = xhrCallbacks[ handle ] = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback(0,1);
+					}
+				}
+			};
+		}
+	});
+}
+
+
+
+
+var elemdisplay = {},
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
+	timerId,
+	fxAttrs = [
+		// height animations
+		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+		// width animations
+		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+		// opacity animations
+		[ "opacity" ]
+	];
+
+jQuery.fn.extend({
+	show: function( speed, easing, callback ) {
+		var elem, display;
+
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("show", 3), speed, easing, callback);
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				elem = this[i];
+				display = elem.style.display;
+
+				// Reset the inline display of this element to learn if it is
+				// being hidden by cascaded rules or not
+				if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
+					display = elem.style.display = "";
+				}
+
+				// Set elements which have been overridden with display: none
+				// in a stylesheet to whatever the default browser style is
+				// for such an element
+				if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
+					jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
+				}
+			}
+
+			// Set the display of most of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				elem = this[i];
+				display = elem.style.display;
+
+				if ( display === "" || display === "none" ) {
+					elem.style.display = jQuery._data(elem, "olddisplay") || "";
+				}
+			}
+
+			return this;
+		}
+	},
+
+	hide: function( speed, easing, callback ) {
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("hide", 3), speed, easing, callback);
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				var display = jQuery.css( this[i], "display" );
+
+				if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
+					jQuery._data( this[i], "olddisplay", display );
+				}
+			}
+
+			// Set the display of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				this[i].style.display = "none";
+			}
+
+			return this;
+		}
+	},
+
+	// Save the old toggle function
+	_toggle: jQuery.fn.toggle,
+
+	toggle: function( fn, fn2, callback ) {
+		var bool = typeof fn === "boolean";
+
+		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+			this._toggle.apply( this, arguments );
+
+		} else if ( fn == null || bool ) {
+			this.each(function() {
+				var state = bool ? fn : jQuery(this).is(":hidden");
+				jQuery(this)[ state ? "show" : "hide" ]();
+			});
+
+		} else {
+			this.animate(genFx("toggle", 3), fn, fn2, callback);
+		}
+
+		return this;
+	},
+
+	fadeTo: function( speed, to, easing, callback ) {
+		return this.filter(":hidden").css("opacity", 0).show().end()
+					.animate({opacity: to}, speed, easing, callback);
+	},
+
+	animate: function( prop, speed, easing, callback ) {
+		var optall = jQuery.speed(speed, easing, callback);
+
+		if ( jQuery.isEmptyObject( prop ) ) {
+			return this.each( optall.complete );
+		}
+
+		return this[ optall.queue === false ? "each" : "queue" ](function() {
+			// XXX 'this' does not always have a nodeName when running the
+			// test suite
+
+			var opt = jQuery.extend({}, optall), p,
+				isElement = this.nodeType === 1,
+				hidden = isElement && jQuery(this).is(":hidden"),
+				self = this;
+
+			for ( p in prop ) {
+				var name = jQuery.camelCase( p );
+
+				if ( p !== name ) {
+					prop[ name ] = prop[ p ];
+					delete prop[ p ];
+					p = name;
+				}
+
+				if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) {
+					return opt.complete.call(this);
+				}
+
+				if ( isElement && ( p === "height" || p === "width" ) ) {
+					// Make sure that nothing sneaks out
+					// Record all 3 overflow attributes because IE does not
+					// change the overflow attribute when overflowX and
+					// overflowY are set to the same value
+					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+
+					// Set display property to inline-block for height/width
+					// animations on inline elements that are having width/height
+					// animated
+					if ( jQuery.css( this, "display" ) === "inline" &&
+							jQuery.css( this, "float" ) === "none" ) {
+						if ( !jQuery.support.inlineBlockNeedsLayout ) {
+							this.style.display = "inline-block";
+
+						} else {
+							var display = defaultDisplay(this.nodeName);
+
+							// inline-level elements accept inline-block;
+							// block-level elements need to be inline with layout
+							if ( display === "inline" ) {
+								this.style.display = "inline-block";
+
+							} else {
+								this.style.display = "inline";
+								this.style.zoom = 1;
+							}
+						}
+					}
+				}
+
+				if ( jQuery.isArray( prop[p] ) ) {
+					// Create (if needed) and add to specialEasing
+					(opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];
+					prop[p] = prop[p][0];
+				}
+			}
+
+			if ( opt.overflow != null ) {
+				this.style.overflow = "hidden";
+			}
+
+			opt.curAnim = jQuery.extend({}, prop);
+
+			jQuery.each( prop, function( name, val ) {
+				var e = new jQuery.fx( self, opt, name );
+
+				if ( rfxtypes.test(val) ) {
+					e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop );
+
+				} else {
+					var parts = rfxnum.exec(val),
+						start = e.cur();
+
+					if ( parts ) {
+						var end = parseFloat( parts[2] ),
+							unit = parts[3] || ( jQuery.cssNumber[ name ] ? "" : "px" );
+
+						// We need to compute starting value
+						if ( unit !== "px" ) {
+							jQuery.style( self, name, (end || 1) + unit);
+							start = ((end || 1) / e.cur()) * start;
+							jQuery.style( self, name, start + unit);
+						}
+
+						// If a +=/-= token was provided, we're doing a relative animation
+						if ( parts[1] ) {
+							end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
+						}
+
+						e.custom( start, end, unit );
+
+					} else {
+						e.custom( start, val, "" );
+					}
+				}
+			});
+
+			// For JS strict compliance
+			return true;
+		});
+	},
+
+	stop: function( clearQueue, gotoEnd ) {
+		var timers = jQuery.timers;
+
+		if ( clearQueue ) {
+			this.queue([]);
+		}
+
+		this.each(function() {
+			// go in reverse order so anything added to the queue during the loop is ignored
+			for ( var i = timers.length - 1; i >= 0; i-- ) {
+				if ( timers[i].elem === this ) {
+					if (gotoEnd) {
+						// force the next step to be the last
+						timers[i](true);
+					}
+
+					timers.splice(i, 1);
+				}
+			}
+		});
+
+		// start the next in the queue if the last step wasn't forced
+		if ( !gotoEnd ) {
+			this.dequeue();
+		}
+
+		return this;
+	}
+
+});
+
+function genFx( type, num ) {
+	var obj = {};
+
+	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
+		obj[ this ] = type;
+	});
+
+	return obj;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx("show", 1),
+	slideUp: genFx("hide", 1),
+	slideToggle: genFx("toggle", 1),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+});
+
+jQuery.extend({
+	speed: function( speed, easing, fn ) {
+		var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
+			complete: fn || !fn && easing ||
+				jQuery.isFunction( speed ) && speed,
+			duration: speed,
+			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
+		};
+
+		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+			opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
+
+		// Queueing
+		opt.old = opt.complete;
+		opt.complete = function() {
+			if ( opt.queue !== false ) {
+				jQuery(this).dequeue();
+			}
+			if ( jQuery.isFunction( opt.old ) ) {
+				opt.old.call( this );
+			}
+		};
+
+		return opt;
+	},
+
+	easing: {
+		linear: function( p, n, firstNum, diff ) {
+			return firstNum + diff * p;
+		},
+		swing: function( p, n, firstNum, diff ) {
+			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
+		}
+	},
+
+	timers: [],
+
+	fx: function( elem, options, prop ) {
+		this.options = options;
+		this.elem = elem;
+		this.prop = prop;
+
+		if ( !options.orig ) {
+			options.orig = {};
+		}
+	}
+
+});
+
+jQuery.fx.prototype = {
+	// Simple function for setting a style value
+	update: function() {
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
+	},
+
+	// Get the current size
+	cur: function() {
+		if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
+			return this.elem[ this.prop ];
+		}
+
+		var parsed,
+			r = jQuery.css( this.elem, this.prop );
+		// Empty strings, null, undefined and "auto" are converted to 0,
+		// complex values such as "rotate(1rad)" are returned as is,
+		// simple values such as "10px" are parsed to Float.
+		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
+	},
+
+	// Start an animation from one number to another
+	custom: function( from, to, unit ) {
+		var self = this,
+			fx = jQuery.fx;
+
+		this.startTime = jQuery.now();
+		this.start = from;
+		this.end = to;
+		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+		this.now = this.start;
+		this.pos = this.state = 0;
+
+		function t( gotoEnd ) {
+			return self.step(gotoEnd);
+		}
+
+		t.elem = this.elem;
+
+		if ( t() && jQuery.timers.push(t) && !timerId ) {
+			timerId = setInterval(fx.tick, fx.interval);
+		}
+	},
+
+	// Simple 'show' function
+	show: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+		this.options.show = true;
+
+		// Begin the animation
+		// Make sure that we start at a small width/height to avoid any
+		// flash of content
+		this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
+
+		// Start by showing the element
+		jQuery( this.elem ).show();
+	},
+
+	// Simple 'hide' function
+	hide: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+		this.options.hide = true;
+
+		// Begin the animation
+		this.custom(this.cur(), 0);
+	},
+
+	// Each step of an animation
+	step: function( gotoEnd ) {
+		var t = jQuery.now(), done = true;
+
+		if ( gotoEnd || t >= this.options.duration + this.startTime ) {
+			this.now = this.end;
+			this.pos = this.state = 1;
+			this.update();
+
+			this.options.curAnim[ this.prop ] = true;
+
+			for ( var i in this.options.curAnim ) {
+				if ( this.options.curAnim[i] !== true ) {
+					done = false;
+				}
+			}
+
+			if ( done ) {
+				// Reset the overflow
+				if ( this.options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+					var elem = this.elem,
+						options = this.options;
+
+					jQuery.each( [ "", "X", "Y" ], function (index, value) {
+						elem.style[ "overflow" + value ] = options.overflow[index];
+					} );
+				}
+
+				// Hide the element if the "hide" operation was done
+				if ( this.options.hide ) {
+					jQuery(this.elem).hide();
+				}
+
+				// Reset the properties, if the item has been hidden or shown
+				if ( this.options.hide || this.options.show ) {
+					for ( var p in this.options.curAnim ) {
+						jQuery.style( this.elem, p, this.options.orig[p] );
+					}
+				}
+
+				// Execute the complete function
+				this.options.complete.call( this.elem );
+			}
+
+			return false;
+
+		} else {
+			var n = t - this.startTime;
+			this.state = n / this.options.duration;
+
+			// Perform the easing function, defaults to swing
+			var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
+			var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear");
+			this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
+			this.now = this.start + ((this.end - this.start) * this.pos);
+
+			// Perform the next step of the animation
+			this.update();
+		}
+
+		return true;
+	}
+};
+
+jQuery.extend( jQuery.fx, {
+	tick: function() {
+		var timers = jQuery.timers;
+
+		for ( var i = 0; i < timers.length; i++ ) {
+			if ( !timers[i]() ) {
+				timers.splice(i--, 1);
+			}
+		}
+
+		if ( !timers.length ) {
+			jQuery.fx.stop();
+		}
+	},
+
+	interval: 13,
+
+	stop: function() {
+		clearInterval( timerId );
+		timerId = null;
+	},
+
+	speeds: {
+		slow: 600,
+		fast: 200,
+		// Default speed
+		_default: 400
+	},
+
+	step: {
+		opacity: function( fx ) {
+			jQuery.style( fx.elem, "opacity", fx.now );
+		},
+
+		_default: function( fx ) {
+			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+				fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
+			} else {
+				fx.elem[ fx.prop ] = fx.now;
+			}
+		}
+	}
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+
+function defaultDisplay( nodeName ) {
+	if ( !elemdisplay[ nodeName ] ) {
+		var elem = jQuery("<" + nodeName + ">").appendTo("body"),
+			display = elem.css("display");
+
+		elem.remove();
+
+		if ( display === "none" || display === "" ) {
+			display = "block";
+		}
+
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return elemdisplay[ nodeName ];
+}
+
+
+
+
+var rtable = /^t(?:able|d|h)$/i,
+	rroot = /^(?:body|html)$/i;
+
+if ( "getBoundingClientRect" in document.documentElement ) {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0], box;
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		try {
+			box = elem.getBoundingClientRect();
+		} catch(e) {}
+
+		var doc = elem.ownerDocument,
+			docElem = doc.documentElement;
+
+		// Make sure we're not dealing with a disconnected DOM node
+		if ( !box || !jQuery.contains( docElem, elem ) ) {
+			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
+		}
+
+		var body = doc.body,
+			win = getWindow(doc),
+			clientTop  = docElem.clientTop  || body.clientTop  || 0,
+			clientLeft = docElem.clientLeft || body.clientLeft || 0,
+			scrollTop  = (win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop ),
+			scrollLeft = (win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft),
+			top  = box.top  + scrollTop  - clientTop,
+			left = box.left + scrollLeft - clientLeft;
+
+		return { top: top, left: left };
+	};
+
+} else {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0];
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		jQuery.offset.initialize();
+
+		var computedStyle,
+			offsetParent = elem.offsetParent,
+			prevOffsetParent = elem,
+			doc = elem.ownerDocument,
+			docElem = doc.documentElement,
+			body = doc.body,
+			defaultView = doc.defaultView,
+			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+			top = elem.offsetTop,
+			left = elem.offsetLeft;
+
+		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+			if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+				break;
+			}
+
+			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+			top  -= elem.scrollTop;
+			left -= elem.scrollLeft;
+
+			if ( elem === offsetParent ) {
+				top  += elem.offsetTop;
+				left += elem.offsetLeft;
+
+				if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+				}
+
+				prevOffsetParent = offsetParent;
+				offsetParent = elem.offsetParent;
+			}
+
+			if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+			}
+
+			prevComputedStyle = computedStyle;
+		}
+
+		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+			top  += body.offsetTop;
+			left += body.offsetLeft;
+		}
+
+		if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+			top  += Math.max( docElem.scrollTop, body.scrollTop );
+			left += Math.max( docElem.scrollLeft, body.scrollLeft );
+		}
+
+		return { top: top, left: left };
+	};
+}
+
+jQuery.offset = {
+	initialize: function() {
+		var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
+			html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
+
+		jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
+
+		container.innerHTML = html;
+		body.insertBefore( container, body.firstChild );
+		innerDiv = container.firstChild;
+		checkDiv = innerDiv.firstChild;
+		td = innerDiv.nextSibling.firstChild.firstChild;
+
+		this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
+		this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
+
+		checkDiv.style.position = "fixed";
+		checkDiv.style.top = "20px";
+
+		// safari subtracts parent border width here which is 5px
+		this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
+		checkDiv.style.position = checkDiv.style.top = "";
+
+		innerDiv.style.overflow = "hidden";
+		innerDiv.style.position = "relative";
+
+		this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
+
+		this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
+
+		body.removeChild( container );
+		body = container = innerDiv = checkDiv = table = td = null;
+		jQuery.offset.initialize = jQuery.noop;
+	},
+
+	bodyOffset: function( body ) {
+		var top = body.offsetTop,
+			left = body.offsetLeft;
+
+		jQuery.offset.initialize();
+
+		if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
+			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+		}
+
+		return { top: top, left: left };
+	},
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = (position === "absolute" && jQuery.inArray('auto', [curCSSTop, curCSSLeft]) > -1),
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// need to be able to calculate position if either top or left is auto and position is absolute
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+		}
+
+		curTop  = calculatePosition ? curPosition.top  : parseInt( curCSSTop,  10 ) || 0;
+		curLeft = calculatePosition ? curPosition.left : parseInt( curCSSLeft, 10 ) || 0;
+
+		if ( jQuery.isFunction( options ) ) {
+			options = options.call( elem, i, curOffset );
+		}
+
+		if (options.top != null) {
+			props.top = (options.top - curOffset.top) + curTop;
+		}
+		if (options.left != null) {
+			props.left = (options.left - curOffset.left) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+
+jQuery.fn.extend({
+	position: function() {
+		if ( !this[0] ) {
+			return null;
+		}
+
+		var elem = this[0],
+
+		// Get *real* offsetParent
+		offsetParent = this.offsetParent(),
+
+		// Get correct offsets
+		offset       = this.offset(),
+		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+		// Subtract element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+		// Add offsetParent borders
+		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+		// Subtract the two offsets
+		return {
+			top:  offset.top  - parentOffset.top,
+			left: offset.left - parentOffset.left
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || document.body;
+			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ["Left", "Top"], function( i, name ) {
+	var method = "scroll" + name;
+
+	jQuery.fn[ method ] = function(val) {
+		var elem = this[0], win;
+
+		if ( !elem ) {
+			return null;
+		}
+
+		if ( val !== undefined ) {
+			// Set the scroll offset
+			return this.each(function() {
+				win = getWindow( this );
+
+				if ( win ) {
+					win.scrollTo(
+						!i ? val : jQuery(win).scrollLeft(),
+						i ? val : jQuery(win).scrollTop()
+					);
+
+				} else {
+					this[ method ] = val;
+				}
+			});
+		} else {
+			win = getWindow( elem );
+
+			// Return the scroll offset
+			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
+				jQuery.support.boxModel && win.document.documentElement[ method ] ||
+					win.document.body[ method ] :
+				elem[ method ];
+		}
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+
+
+
+
+// Create innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function( i, name ) {
+
+	var type = name.toLowerCase();
+
+	// innerHeight and innerWidth
+	jQuery.fn["inner" + name] = function() {
+		return this[0] ?
+			parseFloat( jQuery.css( this[0], type, "padding" ) ) :
+			null;
+	};
+
+	// outerHeight and outerWidth
+	jQuery.fn["outer" + name] = function( margin ) {
+		return this[0] ?
+			parseFloat( jQuery.css( this[0], type, margin ? "margin" : "border" ) ) :
+			null;
+	};
+
+	jQuery.fn[ type ] = function( size ) {
+		// Get window width or height
+		var elem = this[0];
+		if ( !elem ) {
+			return size == null ? null : this;
+		}
+
+		if ( jQuery.isFunction( size ) ) {
+			return this.each(function( i ) {
+				var self = jQuery( this );
+				self[ type ]( size.call( this, i, self[ type ]() ) );
+			});
+		}
+
+		if ( jQuery.isWindow( elem ) ) {
+			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+			// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+			var docElemProp = elem.document.documentElement[ "client" + name ];
+			return elem.document.compatMode === "CSS1Compat" && docElemProp ||
+				elem.document.body[ "client" + name ] || docElemProp;
+
+		// Get document width or height
+		} else if ( elem.nodeType === 9 ) {
+			// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+			return Math.max(
+				elem.documentElement["client" + name],
+				elem.body["scroll" + name], elem.documentElement["scroll" + name],
+				elem.body["offset" + name], elem.documentElement["offset" + name]
+			);
+
+		// Get or set width or height on the element
+		} else if ( size === undefined ) {
+			var orig = jQuery.css( elem, type ),
+				ret = parseFloat( orig );
+
+			return jQuery.isNaN( ret ) ? orig : ret;
+
+		// Set the width or height on the element (default to pixels if value is unitless)
+		} else {
+			return this.css( type, typeof size === "string" ? size : size + "px" );
+		}
+	};
+
+});
+
+
+window.jQuery = window.$ = jQuery;
+})(window);
diff --git a/framework/images/webapp/images/jquery/jquery-1.5.1.min.js b/framework/images/webapp/images/jquery/jquery-1.5.1.min.js
new file mode 100644
index 0000000..6437874
--- /dev/null
+++ b/framework/images/webapp/images/jquery/jquery-1.5.1.min.js
@@ -0,0 +1,16 @@
+/*!
+ * jQuery JavaScript Library v1.5.1
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Wed Feb 23 13:55:29 2011 -0500
+ */
+(function(a,b){function cg(a){return d.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cd(a){if(!bZ[a]){var b=d("<"+a+">").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";bZ[a]=c}return bZ[a]}function cc(a,b){var c={};d.each(cb.concat.apply([],cb.slice(0,b)),function(){c[this]=a});return c}function bY(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function bX(){try{return new a.XMLHttpRequest}catch(b){}}function bW(){d(a).unload(function(){for(var a in bU)bU[a](0,1)})}function bQ(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var e=a.dataTypes,f={},g,h,i=e.length,j,k=e[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h==="string"&&(f[h.toLowerCase()]=a.converters[h]);l=k,k=e[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=f[m]||f["* "+k];if(!n){p=b;for(o in f){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=f[j[1]+" "+k];if(p){o=f[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&d.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bP(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bO(a,b,c,e){if(d.isArray(b)&&b.length)d.each(b,function(b,f){c||bq.test(a)?e(a,f):bO(a+"["+(typeof f==="object"||d.isArray(f)?b:"")+"]",f,c,e)});else if(c||b==null||typeof b!=="object")e(a,b);else if(d.isArray(b)||d.isEmptyObject(b))e(a,"");else for(var f in b)bO(a+"["+f+"]",b[f],c,e)}function bN(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bH,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bN(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bN(a,c,d,e,"*",g));return l}function bM(a){return function(b,c){typeof b!=="string"&&(c=b,b="*");if(d.isFunction(c)){var e=b.toLowerCase().split(bB),f=0,g=e.length,h,i,j;for(;f<g;f++)h=e[f],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bo(a,b,c){var e=b==="width"?bi:bj,f=b==="width"?a.offsetWidth:a.offsetHeight;if(c==="border")return f;d.each(e,function(){c||(f-=parseFloat(d.css(a,"padding"+this))||0),c==="margin"?f+=parseFloat(d.css(a,"margin"+this))||0:f-=parseFloat(d.css(a,"border"+this+"Width"))||0});return f}function ba(a,b){b.src?d.ajax({url:b.src,async:!1,dataType:"script"}):d.globalEval(b.text||b.textContent||b.innerHTML||""),b.parentNode&&b.parentNode.removeChild(b)}function _(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function $(a,b){if(b.nodeType===1){var c=b.nodeName.toLowerCase();b.clearAttributes(),b.mergeAttributes(a);if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(d.expando)}}function Z(a,b){if(b.nodeType===1&&d.hasData(a)){var c=d.expando,e=d.data(a),f=d.data(b,e);if(e=e[c]){var g=e.events;f=f[c]=d.extend({},e);if(g){delete f.handle,f.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)d.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function Y(a,b){return d.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function O(a,b,c){if(d.isFunction(b))return d.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return d.grep(a,function(a,d){return a===b===c});if(typeof b==="string"){var e=d.grep(a,function(a){return a.nodeType===1});if(J.test(b))return d.filter(b,e,!c);b=d.filter(b,e)}return d.grep(a,function(a,e){return d.inArray(a,b)>=0===c})}function N(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function F(a,b){return(a&&a!=="*"?a+".":"")+b.replace(r,"`").replace(s,"&")}function E(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,q=[],r=[],s=d._data(this,"events");if(a.liveFired!==this&&s&&s.live&&!a.target.disabled&&(!a.button||a.type!=="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var t=s.live.slice(0);for(i=0;i<t.length;i++)g=t[i],g.origType.replace(p,"")===a.type?r.push(g.selector):t.splice(i--,1);f=d(a.target).closest(r,a.currentTarget);for(j=0,k=f.length;j<k;j++){m=f[j];for(i=0;i<t.length;i++){g=t[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,e=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,e=d(a.relatedTarget).closest(g.selector)[0];(!e||e!==h)&&q.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=q.length;j<k;j++){f=q[j];if(c&&f.level>c)break;a.currentTarget=f.elem,a.data=f.handleObj.data,a.handleObj=f.handleObj,o=f.handleObj.origHandler.apply(f.elem,arguments);if(o===!1||a.isPropagationStopped()){c=f.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function C(a,c,e){var f=d.extend({},e[0]);f.type=a,f.originalEvent={},f.liveFired=b,d.event.handle.call(c,f),f.isDefaultPrevented()&&e[0].preventDefault()}function w(){return!0}function v(){return!1}function g(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function f(a,c,f){if(f===b&&a.nodeType===1){f=a.getAttribute("data-"+c);if(typeof f==="string"){try{f=f==="true"?!0:f==="false"?!1:f==="null"?null:d.isNaN(f)?e.test(f)?d.parseJSON(f):f:parseFloat(f)}catch(g){}d.data(a,c,f)}else f=b}return f}var c=a.document,d=function(){function I(){if(!d.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(I,1);return}d.ready()}}var d=function(a,b){return new d.fn.init(a,b,g)},e=a.jQuery,f=a.$,g,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,i=/\S/,j=/^\s+/,k=/\s+$/,l=/\d/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=navigator.userAgent,w,x=!1,y,z="then done fail isResolved isRejected promise".split(" "),A,B=Object.prototype.toString,C=Object.prototype.hasOwnProperty,D=Array.prototype.push,E=Array.prototype.slice,F=String.prototype.trim,G=Array.prototype.indexOf,H={};d.fn=d.prototype={constructor:d,init:function(a,e,f){var g,i,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!e&&c.body){this.context=c,this[0]=c.body,this.selector="body",this.length=1;return this}if(typeof a==="string"){g=h.exec(a);if(!g||!g[1]&&e)return!e||e.jquery?(e||f).find(a):this.constructor(e).find(a);if(g[1]){e=e instanceof d?e[0]:e,k=e?e.ownerDocument||e:c,j=m.exec(a),j?d.isPlainObject(e)?(a=[c.createElement(j[1])],d.fn.attr.call(a,e,!0)):a=[k.createElement(j[1])]:(j=d.buildFragment([g[1]],[k]),a=(j.cacheable?d.clone(j.fragment):j.fragment).childNodes);return d.merge(this,a)}i=c.getElementById(g[2]);if(i&&i.parentNode){if(i.id!==g[2])return f.find(a);this.length=1,this[0]=i}this.context=c,this.selector=a;return this}if(d.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return d.makeArray(a,this)},selector:"",jquery:"1.5.1",length:0,size:function(){return this.length},toArray:function(){return E.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var e=this.constructor();d.isArray(a)?D.apply(e,a):d.merge(e,a),e.prevObject=this,e.context=this.context,b==="find"?e.selector=this.selector+(this.selector?" ":"")+c:b&&(e.selector=this.selector+"."+b+"("+c+")");return e},each:function(a,b){return d.each(this,a,b)},ready:function(a){d.bindReady(),y.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(E.apply(this,arguments),"slice",E.call(arguments).join(","))},map:function(a){return this.pushStack(d.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:D,sort:[].sort,splice:[].splice},d.fn.init.prototype=d.fn,d.extend=d.fn.extend=function(){var a,c,e,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i==="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!=="object"&&!d.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){e=i[c],f=a[c];if(i===f)continue;l&&f&&(d.isPlainObject(f)||(g=d.isArray(f)))?(g?(g=!1,h=e&&d.isArray(e)?e:[]):h=e&&d.isPlainObject(e)?e:{},i[c]=d.extend(l,h,f)):f!==b&&(i[c]=f)}return i},d.extend({noConflict:function(b){a.$=f,b&&(a.jQuery=e);return d},isReady:!1,readyWait:1,ready:function(a){a===!0&&d.readyWait--;if(!d.readyWait||a!==!0&&!d.isReady){if(!c.body)return setTimeout(d.ready,1);d.isReady=!0;if(a!==!0&&--d.readyWait>0)return;y.resolveWith(c,[d]),d.fn.trigger&&d(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!x){x=!0;if(c.readyState==="complete")return setTimeout(d.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",A,!1),a.addEventListener("load",d.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",A),a.attachEvent("onload",d.ready);var b=!1;try{b=a.frameElement==null}catch(e){}c.documentElement.doScroll&&b&&I()}}},isFunction:function(a){return d.type(a)==="function"},isArray:Array.isArray||function(a){return d.type(a)==="array"},isWindow:function(a){return a&&typeof a==="object"&&"setInterval"in a},isNaN:function(a){return a==null||!l.test(a)||isNaN(a)},type:function(a){return a==null?String(a):H[B.call(a)]||"object"},isPlainObject:function(a){if(!a||d.type(a)!=="object"||a.nodeType||d.isWindow(a))return!1;if(a.constructor&&!C.call(a,"constructor")&&!C.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a){}return c===b||C.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!=="string"||!b)return null;b=d.trim(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return a.JSON&&a.JSON.parse?a.JSON.parse(b):(new Function("return "+b))();d.error("Invalid JSON: "+b)},parseXML:function(b,c,e){a.DOMParser?(e=new DOMParser,c=e.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),e=c.documentElement,(!e||!e.nodeName||e.nodeName==="parsererror")&&d.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(a){if(a&&i.test(a)){var b=c.head||c.getElementsByTagName("head")[0]||c.documentElement,e=c.createElement("script");d.support.scriptEval()?e.appendChild(c.createTextNode(a)):e.text=a,b.insertBefore(e,b.firstChild),b.removeChild(e)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,e){var f,g=0,h=a.length,i=h===b||d.isFunction(a);if(e){if(i){for(f in a)if(c.apply(a[f],e)===!1)break}else for(;g<h;)if(c.apply(a[g++],e)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(var j=a[0];g<h&&c.call(j,g,j)!==!1;j=a[++g]){}return a},trim:F?function(a){return a==null?"":F.call(a)}:function(a){return a==null?"":(a+"").replace(j,"").replace(k,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var e=d.type(a);a.length==null||e==="string"||e==="function"||e==="regexp"||d.isWindow(a)?D.call(c,a):d.merge(c,a)}return c},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length==="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,b,c){var d=[],e;for(var f=0,g=a.length;f<g;f++)e=b(a[f],f,c),e!=null&&(d[d.length]=e);return d.concat.apply([],d)},guid:1,proxy:function(a,c,e){arguments.length===2&&(typeof c==="string"?(e=a,a=e[c],c=b):c&&!d.isFunction(c)&&(e=c,c=b)),!c&&a&&(c=function(){return a.apply(e||this,arguments)}),a&&(c.guid=a.guid=a.guid||c.guid||d.guid++);return c},access:function(a,c,e,f,g,h){var i=a.length;if(typeof c==="object"){for(var j in c)d.access(a,j,c[j],f,g,e);return a}if(e!==b){f=!h&&f&&d.isFunction(e);for(var k=0;k<i;k++)g(a[k],c,f?e.call(a[k],k,g(a[k],c)):e,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},_Deferred:function(){var a=[],b,c,e,f={done:function(){if(!e){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=d.type(i),j==="array"?f.done.apply(f,i):j==="function"&&a.push(i);k&&f.resolveWith(k[0],k[1])}return this},resolveWith:function(d,f){if(!e&&!b&&!c){c=1;try{while(a[0])a.shift().apply(d,f)}catch(g){throw g}finally{b=[d,f],c=0}}return this},resolve:function(){f.resolveWith(d.isFunction(this.promise)?this.promise():this,arguments);return this},isResolved:function(){return c||b},cancel:function(){e=1,a=[];return this}};return f},Deferred:function(a){var b=d._Deferred(),c=d._Deferred(),e;d.extend(b,{then:function(a,c){b.done(a).fail(c);return this},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,promise:function(a){if(a==null){if(e)return e;e=a={}}var c=z.length;while(c--)a[z[c]]=b[z[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){var b=arguments.length,c=b<=1&&a&&d.isFunction(a.promise)?a:d.Deferred(),e=c.promise();if(b>1){var f=E.call(arguments,0),g=b,h=function(a){return function(b){f[a]=arguments.length>1?E.call(arguments,0):b,--g||c.resolveWith(e,f)}};while(b--)a=f[b],a&&d.isFunction(a.promise)?a.promise().then(h(b),c.reject):--g;g||c.resolveWith(e,f)}else c!==a&&c.resolve(a);return e},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}d.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.subclass=this.subclass,a.fn.init=function b(b,c){c&&c instanceof d&&!(c instanceof a)&&(c=a(c));return d.fn.init.call(this,b,c,e)},a.fn.init.prototype=a.fn;var e=a(c);return a},browser:{}}),y=d._Deferred(),d.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){H["[object "+b+"]"]=b.toLowerCase()}),w=d.uaMatch(v),w.browser&&(d.browser[w.browser]=!0,d.browser.version=w.version),d.browser.webkit&&(d.browser.safari=!0),G&&(d.inArray=function(a,b){return G.call(b,a)}),i.test(" ")&&(j=/^[\s\xA0]+/,k=/[\s\xA0]+$/),g=d(c),c.addEventListener?A=function(){c.removeEventListener("DOMContentLoaded",A,!1),d.ready()}:c.attachEvent&&(A=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",A),d.ready())});return d}();(function(){d.support={};var b=c.createElement("div");b.style.display="none",b.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=b.getElementsByTagName("*"),f=b.getElementsByTagName("a")[0],g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=b.getElementsByTagName("input")[0];if(e&&e.length&&f){d.support={leadingWhitespace:b.firstChild.nodeType===3,tbody:!b.getElementsByTagName("tbody").length,htmlSerialize:!!b.getElementsByTagName("link").length,style:/red/.test(f.getAttribute("style")),hrefNormalized:f.getAttribute("href")==="/a",opacity:/^0.55$/.test(f.style.opacity),cssFloat:!!f.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,deleteExpando:!0,optDisabled:!1,checkClone:!1,noCloneEvent:!0,noCloneChecked:!0,boxModel:null,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableHiddenOffsets:!0},i.checked=!0,d.support.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,d.support.optDisabled=!h.disabled;var j=null;d.support.scriptEval=function(){if(j===null){var b=c.documentElement,e=c.createElement("script"),f="script"+d.now();try{e.appendChild(c.createTextNode("window."+f+"=1;"))}catch(g){}b.insertBefore(e,b.firstChild),a[f]?(j=!0,delete a[f]):j=!1,b.removeChild(e),b=e=f=null}return j};try{delete b.test}catch(k){d.support.deleteExpando=!1}!b.addEventListener&&b.attachEvent&&b.fireEvent&&(b.attachEvent("onclick",function l(){d.support.noCloneEvent=!1,b.detachEvent("onclick",l)}),b.cloneNode(!0).fireEvent("onclick")),b=c.createElement("div"),b.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";var m=c.createDocumentFragment();m.appendChild(b.firstChild),d.support.checkClone=m.cloneNode(!0).cloneNode(!0).lastChild.checked,d(function(){var a=c.createElement("div"),b=c.getElementsByTagName("body")[0];if(b){a.style.width=a.style.paddingLeft="1px",b.appendChild(a),d.boxModel=d.support.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,d.support.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",d.support.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";var e=a.getElementsByTagName("td");d.support.reliableHiddenOffsets=e[0].offsetHeight===0,e[0].style.display="",e[1].style.display="none",d.support.reliableHiddenOffsets=d.support.reliableHiddenOffsets&&e[0].offsetHeight===0,a.innerHTML="",b.removeChild(a).style.display="none",a=e=null}});var n=function(a){var b=c.createElement("div");a="on"+a;if(!b.attachEvent)return!0;var d=a in b;d||(b.setAttribute(a,"return;"),d=typeof b[a]==="function"),b=null;return d};d.support.submitBubbles=n("submit"),d.support.changeBubbles=n("change"),b=e=f=null}})();var e=/^(?:\{.*\}|\[.*\])$/;d.extend({cache:{},uuid:0,expando:"jQuery"+(d.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?d.cache[a[d.expando]]:a[d.expando];return!!a&&!g(a)},data:function(a,c,e,f){if(d.acceptData(a)){var g=d.expando,h=typeof c==="string",i,j=a.nodeType,k=j?d.cache:a,l=j?a[d.expando]:a[d.expando]&&d.expando;if((!l||f&&l&&!k[l][g])&&h&&e===b)return;l||(j?a[d.expando]=l=++d.uuid:l=d.expando),k[l]||(k[l]={},j||(k[l].toJSON=d.noop));if(typeof c==="object"||typeof c==="function")f?k[l][g]=d.extend(k[l][g],c):k[l]=d.extend(k[l],c);i=k[l],f&&(i[g]||(i[g]={}),i=i[g]),e!==b&&(i[c]=e);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[c]:i}},removeData:function(b,c,e){if(d.acceptData(b)){var f=d.expando,h=b.nodeType,i=h?d.cache:b,j=h?b[d.expando]:d.expando;if(!i[j])return;if(c){var k=e?i[j][f]:i[j];if(k){delete k[c];if(!g(k))return}}if(e){delete i[j][f];if(!g(i[j]))return}var l=i[j][f];d.support.deleteExpando||i!=a?delete i[j]:i[j]=null,l?(i[j]={},h||(i[j].toJSON=d.noop),i[j][f]=l):h&&(d.support.deleteExpando?delete b[d.expando]:b.removeAttribute?b.removeAttribute(d.expando):b[d.expando]=null)}},_data:function(a,b,c){return d.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=d.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),d.fn.extend({data:function(a,c){var e=null;if(typeof a==="undefined"){if(this.length){e=d.data(this[0]);if(this[0].nodeType===1){var g=this[0].attributes,h;for(var i=0,j=g.length;i<j;i++)h=g[i].name,h.indexOf("data-")===0&&(h=h.substr(5),f(this[0],h,e[h]))}}return e}if(typeof a==="object")return this.each(function(){d.data(this,a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(c===b){e=this.triggerHandler("getData"+k[1]+"!",[k[0]]),e===b&&this.length&&(e=d.data(this[0],a),e=f(this[0],a,e));return e===b&&k[1]?this.data(k[0]):e}return this.each(function(){var b=d(this),e=[k[0],c];b.triggerHandler("setData"+k[1]+"!",e),d.data(this,a,c),b.triggerHandler("changeData"+k[1]+"!",e)})},removeData:function(a){return this.each(function(){d.removeData(this,a)})}}),d.extend({queue:function(a,b,c){if(a){b=(b||"fx")+"queue";var e=d._data(a,b);if(!c)return e||[];!e||d.isArray(c)?e=d._data(a,b,d.makeArray(c)):e.push(c);return e}},dequeue:function(a,b){b=b||"fx";var c=d.queue(a,b),e=c.shift();e==="inprogress"&&(e=c.shift()),e&&(b==="fx"&&c.unshift("inprogress"),e.call(a,function(){d.dequeue(a,b)})),c.length||d.removeData(a,b+"queue",!0)}}),d.fn.extend({queue:function(a,c){typeof a!=="string"&&(c=a,a="fx");if(c===b)return d.queue(this[0],a);return this.each(function(b){var e=d.queue(this,a,c);a==="fx"&&e[0]!=="inprogress"&&d.dequeue(this,a)})},dequeue:function(a){return this.each(function(){d.dequeue(this,a)})},delay:function(a,b){a=d.fx?d.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){d.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var h=/[\n\t\r]/g,i=/\s+/,j=/\r/g,k=/^(?:href|src|style)$/,l=/^(?:button|input)$/i,m=/^(?:button|input|object|select|textarea)$/i,n=/^a(?:rea)?$/i,o=/^(?:radio|checkbox)$/i;d.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"},d.fn.extend({attr:function(a,b){return d.access(this,a,b,!0,d.attr)},removeAttr:function(a,b){return this.each(function(){d.attr(this,a,""),this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.addClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"){var b=(a||"").split(i);for(var c=0,e=this.length;c<e;c++){var f=this[c];if(f.nodeType===1)if(f.className){var g=" "+f.className+" ",h=f.className;for(var j=0,k=b.length;j<k;j++)g.indexOf(" "+b[j]+" ")<0&&(h+=" "+b[j]);f.className=d.trim(h)}else f.className=a}}return this},removeClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.removeClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"||a===b){var c=(a||"").split(i);for(var e=0,f=this.length;e<f;e++){var g=this[e];if(g.nodeType===1&&g.className)if(a){var j=(" "+g.className+" ").replace(h," ");for(var k=0,l=c.length;k<l;k++)j=j.replace(" "+c[k]+" "," ");g.className=d.trim(j)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,e=typeof b==="boolean";if(d.isFunction(a))return this.each(function(c){var e=d(this);e.toggleClass(a.call(this,c,e.attr("class"),b),b)});return this.each(function(){if(c==="string"){var f,g=0,h=d(this),j=b,k=a.split(i);while(f=k[g++])j=e?j:!h.hasClass(f),h[j?"addClass":"removeClass"](f)}else if(c==="undefined"||c==="boolean")this.className&&d._data(this,"__className__",this.className),this.className=this.className||a===!1?"":d._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(h," ").indexOf(b)>-1)return!0;return!1},val:function(a){if(!arguments.length){var c=this[0];if(c){if(d.nodeName(c,"option")){var e=c.attributes.value;return!e||e.specified?c.value:c.text}if(d.nodeName(c,"select")){var f=c.selectedIndex,g=[],h=c.options,i=c.type==="select-one";if(f<0)return null;for(var k=i?f:0,l=i?f+1:h.length;k<l;k++){var m=h[k];if(m.selected&&(d.support.optDisabled?!m.disabled:m.getAttribute("disabled")===null)&&(!m.parentNode.disabled||!d.nodeName(m.parentNode,"optgroup"))){a=d(m).val();if(i)return a;g.push(a)}}if(i&&!g.length&&h.length)return d(h[f]).val();return g}if(o.test(c.type)&&!d.support.checkOn)return c.getAttribute("value")===null?"on":c.value;return(c.value||"").replace(j,"")}return b}var n=d.isFunction(a);return this.each(function(b){var c=d(this),e=a;if(this.nodeType===1){n&&(e=a.call(this,b,c.val())),e==null?e="":typeof e==="number"?e+="":d.isArray(e)&&(e=d.map(e,function(a){return a==null?"":a+""}));if(d.isArray(e)&&o.test(this.type))this.checked=d.inArray(c.val(),e)>=0;else if(d.nodeName(this,"select")){var f=d.makeArray(e);d("option",this).each(function(){this.selected=d.inArray(d(this).val(),f)>=0}),f.length||(this.selectedIndex=-1)}else this.value=e}})}}),d.extend({attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,e,f){if(!a||a.nodeType===3||a.nodeType===8||a.nodeType===2)return b;if(f&&c in d.attrFn)return d(a)[c](e);var g=a.nodeType!==1||!d.isXMLDoc(a),h=e!==b;c=g&&d.props[c]||c;if(a.nodeType===1){var i=k.test(c);if(c==="selected"&&!d.support.optSelected){var j=a.parentNode;j&&(j.selectedIndex,j.parentNode&&j.parentNode.selectedIndex)}if((c in a||a[c]!==b)&&g&&!i){h&&(c==="type"&&l.test(a.nodeName)&&a.parentNode&&d.error("type property can't be changed"),e===null?a.nodeType===1&&a.removeAttribute(c):a[c]=e);if(d.nodeName(a,"form")&&a.getAttributeNode(c))return a.getAttributeNode(c).nodeValue;if(c==="tabIndex"){var o=a.getAttributeNode("tabIndex");return o&&o.specified?o.value:m.test(a.nodeName)||n.test(a.nodeName)&&a.href?0:b}return a[c]}if(!d.support.style&&g&&c==="style"){h&&(a.style.cssText=""+e);return a.style.cssText}h&&a.setAttribute(c,""+e);if(!a.attributes[c]&&(a.hasAttribute&&!a.hasAttribute(c)))return b;var p=!d.support.hrefNormalized&&g&&i?a.getAttribute(c,2):a.getAttribute(c);return p===null?b:p}h&&(a[c]=e);return a[c]}});var p=/\.(.*)$/,q=/^(?:textarea|input|select)$/i,r=/\./g,s=/ /g,t=/[^\w\s.|`]/g,u=function(a){return a.replace(t,"\\$&")};d.event={add:function(c,e,f,g){if(c.nodeType!==3&&c.nodeType!==8){try{d.isWindow(c)&&(c!==a&&!c.frameElement)&&(c=a)}catch(h){}if(f===!1)f=v;else if(!f)return;var i,j;f.handler&&(i=f,f=i.handler),f.guid||(f.guid=d.guid++);var k=d._data(c);if(!k)return;var l=k.events,m=k.handle;l||(k.events=l={}),m||(k.handle=m=function(){return typeof d!=="undefined"&&!d.event.triggered?d.event.handle.apply(m.elem,arguments):b}),m.elem=c,e=e.split(" ");var n,o=0,p;while(n=e[o++]){j=i?d.extend({},i):{handler:f,data:g},n.indexOf(".")>-1?(p=n.split("."),n=p.shift(),j.namespace=p.slice(0).sort().join(".")):(p=[],j.namespace=""),j.type=n,j.guid||(j.guid=f.guid);var q=l[n],r=d.event.special[n]||{};if(!q){q=l[n]=[];if(!r.setup||r.setup.call(c,g,p,m)===!1)c.addEventListener?c.addEventListener(n,m,!1):c.attachEvent&&c.attachEvent("on"+n,m)}r.add&&(r.add.call(c,j),j.handler.guid||(j.handler.guid=f.guid)),q.push(j),d.event.global[n]=!0}c=null}},global:{},remove:function(a,c,e,f){if(a.nodeType!==3&&a.nodeType!==8){e===!1&&(e=v);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=d.hasData(a)&&d._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(e=c.handler,c=c.type);if(!c||typeof c==="string"&&c.charAt(0)==="."){c=c||"";for(h in t)d.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+d.map(m.slice(0).sort(),u).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!e){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))d.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=d.event.special[h]||{};for(j=f||0;j<p.length;j++){q=p[j];if(e.guid===q.guid){if(l||n.test(q.namespace))f==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(f!=null)break}}if(p.length===0||f!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&d.removeEvent(a,h,s.handle),g=null,delete t[h]}if(d.isEmptyObject(t)){var w=s.handle;w&&(w.elem=null),delete s.events,delete s.handle,d.isEmptyObject(s)&&d.removeData(a,b,!0)}}},trigger:function(a,c,e){var f=a.type||a,g=arguments[3];if(!g){a=typeof a==="object"?a[d.expando]?a:d.extend(d.Event(f),a):d.Event(f),f.indexOf("!")>=0&&(a.type=f=f.slice(0,-1),a.exclusive=!0),e||(a.stopPropagation(),d.event.global[f]&&d.each(d.cache,function(){var b=d.expando,e=this[b];e&&e.events&&e.events[f]&&d.event.trigger(a,c,e.handle.elem)}));if(!e||e.nodeType===3||e.nodeType===8)return b;a.result=b,a.target=e,c=d.makeArray(c),c.unshift(a)}a.currentTarget=e;var h=d._data(e,"handle");h&&h.apply(e,c);var i=e.parentNode||e.ownerDocument;try{e&&e.nodeName&&d.noData[e.nodeName.toLowerCase()]||e["on"+f]&&e["on"+f].apply(e,c)===!1&&(a.result=!1,a.preventDefault())}catch(j){}if(!a.isPropagationStopped()&&i)d.event.trigger(a,c,i,!0);else if(!a.isDefaultPrevented()){var k,l=a.target,m=f.replace(p,""),n=d.nodeName(l,"a")&&m==="click",o=d.event.special[m]||{};if((!o._default||o._default.call(e,a)===!1)&&!n&&!(l&&l.nodeName&&d.noData[l.nodeName.toLowerCase()])){try{l[m]&&(k=l["on"+m],k&&(l["on"+m]=null),d.event.triggered=!0,l[m]())}catch(q){}k&&(l["on"+m]=k),d.event.triggered=!1}}},handle:function(c){var e,f,g,h,i,j=[],k=d.makeArray(arguments);c=k[0]=d.event.fix(c||a.event),c.currentTarget=this,e=c.type.indexOf(".")<0&&!c.exclusive,e||(g=c.type.split("."),c.type=g.shift(),j=g.slice(0).sort(),h=new RegExp("(^|\\.)"+j.join("\\.(?:.*\\.)?")+"(\\.|$)")),c.namespace=c.namespace||j.join("."),i=d._data(this,"events"),f=(i||{})[c.type];if(i&&f){f=f.slice(0);for(var l=0,m=f.length;l<m;l++){var n=f[l];if(e||h.test(n.namespace)){c.handler=n.handler,c.data=n.data,c.handleObj=n;var o=n.handler.apply(this,k);o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[d.expando])return a;var e=a;a=d.Event(e);for(var f=this.props.length,g;f;)g=this.props[--f],a[g]=e[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=c.documentElement,i=c.body;a.pageX=a.clientX+(h&&h.scrollLeft||i&&i.scrollLeft||0)-(h&&h.clientLeft||i&&i.clientLeft||0),a.pageY=a.clientY+(h&&h.scrollTop||i&&i.scrollTop||0)-(h&&h.clientTop||i&&i.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:d.proxy,special:{ready:{setup:d.bindReady,teardown:d.noop},live:{add:function(a){d.event.add(this,F(a.origType,a.selector),d.extend({},a,{handler:E,guid:a.handler.guid}))},remove:function(a){d.event.remove(this,F(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){d.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},d.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},d.Event=function(a){if(!this.preventDefault)return new d.Event(a);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?w:v):this.type=a,this.timeStamp=d.now(),this[d.expando]=!0},d.Event.prototype={preventDefault:function(){this.isDefaultPrevented=w;var a=this.originalEvent;a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=w;var a=this.originalEvent;a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=w,this.stopPropagation()},isDefaultPrevented:v,isPropagationStopped:v,isImmediatePropagationStopped:v};var x=function(a){var b=a.relatedTarget;try{if(b!==c&&!b.parentNode)return;while(b&&b!==this)b=b.parentNode;b!==this&&(a.type=a.data,d.event.handle.apply(this,arguments))}catch(e){}},y=function(a){a.type=a.data,d.event.handle.apply(this,arguments)};d.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){d.event.special[a]={setup:function(c){d.event.add(this,b,c&&c.selector?y:x,a)},teardown:function(a){d.event.remove(this,b,a&&a.selector?y:x)}}}),d.support.submitBubbles||(d.event.special.submit={setup:function(a,b){if(this.nodeName&&this.nodeName.toLowerCase()!=="form")d.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&d(b).closest("form").length&&C("submit",this,arguments)}),d.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&d(b).closest("form").length&&a.keyCode===13&&C("submit",this,arguments)});else return!1},teardown:function(a){d.event.remove(this,".specialSubmit")}});if(!d.support.changeBubbles){var z,A=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?d.map(a.options,function(a){return a.selected}).join("-"):"":a.nodeName.toLowerCase()==="select"&&(c=a.selectedIndex);return c},B=function B(a){var c=a.target,e,f;if(q.test(c.nodeName)&&!c.readOnly){e=d._data(c,"_change_data"),f=A(c),(a.type!=="focusout"||c.type!=="radio")&&d._data(c,"_change_data",f);if(e===b||f===e)return;if(e!=null||f)a.type="change",a.liveFired=b,d.event.trigger(a,arguments[1],c)}};d.event.special.change={filters:{focusout:B,beforedeactivate:B,click:function(a){var b=a.target,c=b.type;(c==="radio"||c==="checkbox"||b.nodeName.toLowerCase()==="select")&&B.call(this,a)},keydown:function(a){var b=a.target,c=b.type;(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&B.call(this,a)},beforeactivate:function(a){var b=a.target;d._data(b,"_change_data",A(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in z)d.event.add(this,c+".specialChange",z[c]);return q.test(this.nodeName)},teardown:function(a){d.event.remove(this,".specialChange");return q.test(this.nodeName)}},z=d.event.special.change.filters,z.focus=z.beforeactivate}c.addEventListener&&d.each({focus:"focusin",blur:"focusout"},function(a,b){function c(a){a=d.event.fix(a),a.type=b;return d.event.handle.call(this,a)}d.event.special[b]={setup:function(){this.addEventListener(a,c,!0)},teardown:function(){this.removeEventListener(a,c,!0)}}}),d.each(["bind","one"],function(a,c){d.fn[c]=function(a,e,f){if(typeof a==="object"){for(var g in a)this[c](g,e,a[g],f);return this}if(d.isFunction(e)||e===!1)f=e,e=b;var h=c==="one"?d.proxy(f,function(a){d(this).unbind(a,h);return f.apply(this,arguments)}):f;if(a==="unload"&&c!=="one")this.one(a,e,f);else for(var i=0,j=this.length;i<j;i++)d.event.add(this[i],a,h,e);return this}}),d.fn.extend({unbind:function(a,b){if(typeof a!=="object"||a.preventDefault)for(var e=0,f=this.length;e<f;e++)d.event.remove(this[e],a,b);else for(var c in a)this.unbind(c,a[c]);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){d.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var c=d.Event(a);c.preventDefault(),c.stopPropagation(),d.event.trigger(c,b,this[0]);return c.result}},toggle:function(a){var b=arguments,c=1;while(c<b.length)d.proxy(a,b[c++]);return this.click(d.proxy(a,function(e){var f=(d._data(this,"lastToggle"+a.guid)||0)%c;d._data(this,"lastToggle"+a.guid,f+1),e.preventDefault();return b[f].apply(this,arguments)||!1}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var D={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};d.each(["live","die"],function(a,c){d.fn[c]=function(a,e,f,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:d(this.context);if(typeof a==="object"&&!a.preventDefault){for(var o in a)n[c](o,e,a[o],m);return this}d.isFunction(e)&&(f=e,e=b),a=(a||"").split(" ");while((h=a[i++])!=null){j=p.exec(h),k="",j&&(k=j[0],h=h.replace(p,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,h==="focus"||h==="blur"?(a.push(D[h]+k),h=h+k):h=(D[h]||h)+k;if(c==="live")for(var q=0,r=n.length;q<r;q++)d.event.add(n[q],"live."+F(h,m),{data:e,selector:m,handler:f,origType:h,origHandler:f,preType:l});else n.unbind("live."+F(h,m),f)}return this}}),d.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){d.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},d.attrFn&&(d.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!=="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,e,g){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=="string")return e;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(f.call(n)==="[object Array]")if(u)if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&e.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&e.push(j[t]);else e.push.apply(e,n);else p(n,e);o&&(k(o,h,e,g),k.uniqueSort(e));return e};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!=="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(f){if(f===!0)continue}else g=o=!0}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b==="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1){}a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b==="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!=="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!=="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!=="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){return"text"===a.getAttribute("type")},radio:function(a){return"radio"===a.type},checkbox:function(a){return"checkbox"===a.type},file:function(a){return"file"===a.type},password:function(a){return"password"===a.type},submit:function(a){return"submit"===a.type},image:function(a){return"image"===a.type},reset:function(a){return"reset"===a.type},button:function(a){return"button"===a.type||a.nodeName.toLowerCase()==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(f.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length==="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(a===b){g=!0;return 0}if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!=="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!=="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!=="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector,d=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(e){d=!0}b&&(k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(d||!l.match.PSEUDO.test(c)&&!/!=/.test(c))return b.call(a,c)}catch(e){}return k(c,null,null,[a]).length>0})}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};d.find=k,d.expr=k.selectors,d.expr[":"]=d.expr.filters,d.unique=k.uniqueSort,d.text=k.getText,d.isXMLDoc=k.isXML,d.contains=k.contains}();var G=/Until$/,H=/^(?:parents|prevUntil|prevAll)/,I=/,/,J=/^.[^:#\[\.,]*$/,K=Array.prototype.slice,L=d.expr.match.POS,M={children:!0,contents:!0,next:!0,prev:!0};d.fn.extend({find:function(a){var b=this.pushStack("","find",a),c=0;for(var e=0,f=this.length;e<f;e++){c=b.length,d.find(a,this[e],b);if(e>0)for(var g=c;g<b.length;g++)for(var h=0;h<c;h++)if(b[h]===b[g]){b.splice(g--,1);break}}return b},has:function(a){var b=d(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(d.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(O(this,a,!1),"not",a)},filter:function(a){return this.pushStack(O(this,a,!0),"filter",a)},is:function(a){return!!a&&d.filter(a,this).length>0},closest:function(a,b){var c=[],e,f,g=this[0];if(d.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(e=0,f=a.length;e<f;e++)i=a[e],j[i]||(j[i]=d.expr.match.POS.test(i)?d(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:d(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=L.test(a)?d(a,b||this.context):null;for(e=0,f=this.length;e<f;e++){g=this[e];while(g){if(l?l.index(g)>-1:d.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b)break}}c=c.length>1?d.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a==="string")return d.inArray(this[0],a?d(a):this.parent().children());return d.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==="string"?d(a,b):d.makeArray(a),e=d.merge(this.get(),c);return this.pushStack(N(c[0])||N(e[0])?e:d.unique(e))},andSelf:function(){return this.add(this.prevObject)}}),d.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return d.dir(a,"parentNode")},parentsUntil:function(a,b,c){return d.dir(a,"parentNode",c)},next:function(a){return d.nth(a,2,"nextSibling")},prev:function(a){return d.nth(a,2,"previousSibling")},nextAll:function(a){return d.dir(a,"nextSibling")},prevAll:function(a){return d.dir(a,"previousSibling")},nextUntil:function(a,b,c){return d.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return d.dir(a,"previousSibling",c)},siblings:function(a){return d.sibling(a.parentNode.firstChild,a)},children:function(a){return d.sibling(a.firstChild)},contents:function(a){return d.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:d.makeArray(a.childNodes)}},function(a,b){d.fn[a]=function(c,e){var f=d.map(this,b,c),g=K.call(arguments);G.test(a)||(e=c),e&&typeof e==="string"&&(f=d.filter(e,f)),f=this.length>1&&!M[a]?d.unique(f):f,(this.length>1||I.test(e))&&H.test(a)&&(f=f.reverse());return this.pushStack(f,a,g.join(","))}}),d.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?d.find.matchesSelector(b[0],a)?[b[0]]:[]:d.find.matches(a,b)},dir:function(a,c,e){var f=[],g=a[c];while(g&&g.nodeType!==9&&(e===b||g.nodeType!==1||!d(g).is(e)))g.nodeType===1&&f.push(g),g=g[c];return f},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var P=/ jQuery\d+="(?:\d+|null)"/g,Q=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,S=/<([\w:]+)/,T=/<tbody/i,U=/<|&#?\w+;/,V=/<(?:script|object|embed|option|style)/i,W=/checked\s*(?:[^=]|=\s*.checked.)/i,X={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};X.optgroup=X.option,X.tbody=X.tfoot=X.colgroup=X.caption=X.thead,X.th=X.td,d.support.htmlSerialize||(X._default=[1,"div<div>","</div>"]),d.fn.extend({text:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.text(a.call(this,b,c.text()))});if(typeof a!=="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return d.text(this)},wrapAll:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapAll(a.call(this,b))});if(this[0]){var b=d(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapInner(a.call(this,b))});return this.each(function(){var b=d(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){d(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){d.nodeName(this,"body")||d(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=d(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,d(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,e;(e=this[c])!=null;c++)if(!a||d.filter(a,[e]).length)!b&&e.nodeType===1&&(d.cleanData(e.getElementsByTagName("*")),d.cleanData([e])),e.parentNode&&e.parentNode.removeChild(e);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&d.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return d.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(P,""):null;if(typeof a!=="string"||V.test(a)||!d.support.leadingWhitespace&&Q.test(a)||X[(S.exec(a)||["",""])[1].toLowerCase()])d.isFunction(a)?this.each(function(b){var c=d(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);else{a=a.replace(R,"<$1></$2>");try{for(var c=0,e=this.length;c<e;c++)this[c].nodeType===1&&(d.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(f){this.empty().append(a)}}return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(d.isFunction(a))return this.each(function(b){var c=d(this),e=c.html();c.replaceWith(a.call(this,b,e))});typeof a!=="string"&&(a=d(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;d(this).remove(),b?d(b).before(a):d(c).append(a)})}return this.pushStack(d(d.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,e){var f,g,h,i,j=a[0],k=[];if(!d.support.checkClone&&arguments.length===3&&typeof j==="string"&&W.test(j))return this.each(function(){d(this).domManip(a,c,e,!0)});if(d.isFunction(j))return this.each(function(f){var g=d(this);a[0]=j.call(this,f,c?g.html():b),g.domManip(a,c,e)});if(this[0]){i=j&&j.parentNode,d.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?f={fragment:i}:f=d.buildFragment(a,this,k),h=f.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&d.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)e.call(c?Y(this[l],g):this[l],f.cacheable||m>1&&l<n?d.clone(h,!0,!0):h)}k.length&&d.each(k,ba)}return this}}),d.buildFragment=function(a,b,e){var f,g,h,i=b&&b[0]?b[0].ownerDocument||b[0]:c;a.length===1&&typeof a[0]==="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!V.test(a[0])&&(d.support.checkClone||!W.test(a[0]))&&(g=!0,h=d.fragments[a[0]],h&&(h!==1&&(f=h))),f||(f=i.createDocumentFragment(),d.clean(a,i,f,e)),g&&(d.fragments[a[0]]=h?f:1);return{fragment:f,cacheable:g}},d.fragments={},d.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){d.fn[a]=function(c){var e=[],f=d(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&f.length===1){f[b](this[0]);return this}for(var h=0,i=f.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();d(f[h])[b](j),e=e.concat(j)}return this.pushStack(e,a,f.selector)}}),d.extend({clone:function(a,b,c){var e=a.cloneNode(!0),f,g,h;if((!d.support.noCloneEvent||!d.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!d.isXMLDoc(a)){$(a,e),f=_(a),g=_(e);for(h=0;f[h];++h)$(f[h],g[h])}if(b){Z(a,e);if(c){f=_(a),g=_(e);for(h=0;f[h];++h)Z(f[h],g[h])}}return e},clean:function(a,b,e,f){b=b||c,typeof b.createElement==="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var g=[];for(var h=0,i;(i=a[h])!=null;h++){typeof i==="number"&&(i+="");if(!i)continue;if(typeof i!=="string"||U.test(i)){if(typeof i==="string"){i=i.replace(R,"<$1></$2>");var j=(S.exec(i)||["",""])[1].toLowerCase(),k=X[j]||X._default,l=k[0],m=b.createElement("div");m.innerHTML=k[1]+i+k[2];while(l--)m=m.lastChild;if(!d.support.tbody){var n=T.test(i),o=j==="table"&&!n?m.firstChild&&m.firstChild.childNodes:k[1]==="<table>"&&!n?m.childNodes:[];for(var p=o.length-1;p>=0;--p)d.nodeName(o[p],"tbody")&&!o[p].childNodes.length&&o[p].parentNode.removeChild(o[p])}!d.support.leadingWhitespace&&Q.test(i)&&m.insertBefore(b.createTextNode(Q.exec(i)[0]),m.firstChild),i=m.childNodes}}else i=b.createTextNode(i);i.nodeType?g.push(i):g=d.merge(g,i)}if(e)for(h=0;g[h];h++)!f||!d.nodeName(g[h],"script")||g[h].type&&g[h].type.toLowerCase()!=="text/javascript"?(g[h].nodeType===1&&g.splice.apply(g,[h+1,0].concat(d.makeArray(g[h].getElementsByTagName("script")))),e.appendChild(g[h])):f.push(g[h].parentNode?g[h].parentNode.removeChild(g[h]):g[h]);return g},cleanData:function(a){var b,c,e=d.cache,f=d.expando,g=d.event.special,h=d.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&d.noData[j.nodeName.toLowerCase()])continue;c=j[d.expando];if(c){b=e[c]&&e[c][f];if(b&&b.events){for(var k in b.events)g[k]?d.event.remove(j,k):d.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[d.expando]:j.removeAttribute&&j.removeAttribute(d.expando),delete e[c]}}}});var bb=/alpha\([^)]*\)/i,bc=/opacity=([^)]*)/,bd=/-([a-z])/ig,be=/([A-Z])/g,bf=/^-?\d+(?:px)?$/i,bg=/^-?\d/,bh={position:"absolute",visibility:"hidden",display:"block"},bi=["Left","Right"],bj=["Top","Bottom"],bk,bl,bm,bn=function(a,b){return b.toUpperCase()};d.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return d.access(this,a,c,!0,function(a,c,e){return e!==b?d.style(a,c,e):d.css(a,c)})},d.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bk(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{zIndex:!0,fontWeight:!0,opacity:!0,zoom:!0,lineHeight:!0},cssProps:{"float":d.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,e,f){if(a&&a.nodeType!==3&&a.nodeType!==8&&a.style){var g,h=d.camelCase(c),i=a.style,j=d.cssHooks[h];c=d.cssProps[h]||h;if(e===b){if(j&&"get"in j&&(g=j.get(a,!1,f))!==b)return g;return i[c]}if(typeof e==="number"&&isNaN(e)||e==null)return;typeof e==="number"&&!d.cssNumber[h]&&(e+="px");if(!j||!("set"in j)||(e=j.set(a,e))!==b)try{i[c]=e}catch(k){}}},css:function(a,c,e){var f,g=d.camelCase(c),h=d.cssHooks[g];c=d.cssProps[g]||g;if(h&&"get"in h&&(f=h.get(a,!0,e))!==b)return f;if(bk)return bk(a,c,g)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]},camelCase:function(a){return a.replace(bd,bn)}}),d.curCSS=d.css,d.each(["height","width"],function(a,b){d.cssHooks[b]={get:function(a,c,e){var f;if(c){a.offsetWidth!==0?f=bo(a,b,e):d.swap(a,bh,function(){f=bo(a,b,e)});if(f<=0){f=bk(a,b,b),f==="0px"&&bm&&(f=bm(a,b,b));if(f!=null)return f===""||f==="auto"?"0px":f}if(f<0||f==null){f=a.style[b];return f===""||f==="auto"?"0px":f}return typeof f==="string"?f:f+"px"}},set:function(a,b){if(!bf.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),d.support.opacity||(d.cssHooks.opacity={get:function(a,b){return bc.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style;c.zoom=1;var e=d.isNaN(b)?"":"alpha(opacity="+b*100+")",f=c.filter||"";c.filter=bb.test(f)?f.replace(bb,e):c.filter+" "+e}}),c.defaultView&&c.defaultView.getComputedStyle&&(bl=function(a,c,e){var f,g,h;e=e.replace(be,"-$1").toLowerCase();if(!(g=a.ownerDocument.defaultView))return b;if(h=g.getComputedStyle(a,null))f=h.getPropertyValue(e),f===""&&!d.contains(a.ownerDocument.documentElement,a)&&(f=d.style(a,e));return f}),c.documentElement.currentStyle&&(bm=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bf.test(d)&&bg.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bk=bl||bm,d.expr&&d.expr.filters&&(d.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!d.support.reliableHiddenOffsets&&(a.style.display||d.css(a,"display"))==="none"},d.expr.filters.visible=function(a){return!d.expr.filters.hidden(a)});var bp=/%20/g,bq=/\[\]$/,br=/\r?\n/g,bs=/#.*$/,bt=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bu=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bv=/(?:^file|^widget|\-extension):$/,bw=/^(?:GET|HEAD)$/,bx=/^\/\//,by=/\?/,bz=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bA=/^(?:select|textarea)/i,bB=/\s+/,bC=/([?&])_=[^&]*/,bD=/(^|\-)([a-z])/g,bE=function(a,b,c){return b+c.toUpperCase()},bF=/^([\w\+\.\-]+:)\/\/([^\/?#:]*)(?::(\d+))?/,bG=d.fn.load,bH={},bI={},bJ,bK;try{bJ=c.location.href}catch(bL){bJ=c.createElement("a"),bJ.href="",bJ=bJ.href}bK=bF.exec(bJ.toLowerCase()),d.fn.extend({load:function(a,c,e){if(typeof a!=="string"&&bG)return bG.apply(this,arguments);if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var g=a.slice(f,a.length);a=a.slice(0,f)}var h="GET";c&&(d.isFunction(c)?(e=c,c=b):typeof c==="object"&&(c=d.param(c,d.ajaxSettings.traditional),h="POST"));var i=this;d.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?d("<div>").append(c.replace(bz,"")).find(g):c)),e&&i.each(e,[c,b,a])}});return this},serialize:function(){return d.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?d.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bA.test(this.nodeName)||bu.test(this.type))}).map(function(a,b){var c=d(this).val();return c==null?null:d.isArray(c)?d.map(c,function(a,c){return{name:b.name,value:a.replace(br,"\r\n")}}):{name:b.name,value:c.replace(br,"\r\n")}}).get()}}),d.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){d.fn[b]=function(a){return this.bind(b,a)}}),d.each(["get","post"],function(a,c){d[c]=function(a,e,f,g){d.isFunction(e)&&(g=g||f,f=e,e=b);return d.ajax({type:c,url:a,data:e,success:f,dataType:g})}}),d.extend({getScript:function(a,c){return d.get(a,b,c,"script")},getJSON:function(a,b,c){return d.get(a,b,c,"json")},ajaxSetup:function(a,b){b?d.extend(!0,a,d.ajaxSettings,b):(b=a,a=d.extend(!0,d.ajaxSettings,b));for(var c in {context:1,url:1})c in b?a[c]=b[c]:c in d.ajaxSettings&&(a[c]=d.ajaxSettings[c]);return a},ajaxSettings:{url:bJ,isLocal:bv.test(bK[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":d.parseJSON,"text xml":d.parseXML}},ajaxPrefilter:bM(bH),ajaxTransport:bM(bI),ajax:function(a,c){function v(a,c,l,n){if(r!==2){r=2,p&&clearTimeout(p),o=b,m=n||"",u.readyState=a?4:0;var q,t,v,w=l?bP(e,u,l):b,x,y;if(a>=200&&a<300||a===304){if(e.ifModified){if(x=u.getResponseHeader("Last-Modified"))d.lastModified[k]=x;if(y=u.getResponseHeader("Etag"))d.etag[k]=y}if(a===304)c="notmodified",q=!0;else try{t=bQ(e,w),c="success",q=!0}catch(z){c="parsererror",v=z}}else{v=c;if(!c||a)c="error",a<0&&(a=0)}u.status=a,u.statusText=c,q?h.resolveWith(f,[t,c,u]):h.rejectWith(f,[u,c,v]),u.statusCode(j),j=b,s&&g.trigger("ajax"+(q?"Success":"Error"),[u,e,q?t:v]),i.resolveWith(f,[u,c]),s&&(g.trigger("ajaxComplete",[u,e]),--d.active||d.event.trigger("ajaxStop"))}}typeof a==="object"&&(c=a,a=b),c=c||{};var e=d.ajaxSetup({},c),f=e.context||e,g=f!==e&&(f.nodeType||f instanceof d)?d(f):d.event,h=d.Deferred(),i=d._Deferred(),j=e.statusCode||{},k,l={},m,n,o,p,q,r=0,s,t,u={readyState:0,setRequestHeader:function(a,b){r||(l[a.toLowerCase().replace(bD,bE)]=b);return this},getAllResponseHeaders:function(){return r===2?m:null},getResponseHeader:function(a){var c;if(r===2){if(!n){n={};while(c=bt.exec(m))n[c[1].toLowerCase()]=c[2]}c=n[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){r||(e.mimeType=a);return this},abort:function(a){a=a||"abort",o&&o.abort(a),v(0,a);return this}};h.promise(u),u.success=u.done,u.error=u.fail,u.complete=i.done,u.statusCode=function(a){if(a){var b;if(r<2)for(b in a)j[b]=[j[b],a[b]];else b=a[u.status],u.then(b,b)}return this},e.url=((a||e.url)+"").replace(bs,"").replace(bx,bK[1]+"//"),e.dataTypes=d.trim(e.dataType||"*").toLowerCase().split(bB),e.crossDomain||(q=bF.exec(e.url.toLowerCase()),e.crossDomain=q&&(q[1]!=bK[1]||q[2]!=bK[2]||(q[3]||(q[1]==="http:"?80:443))!=(bK[3]||(bK[1]==="http:"?80:443)))),e.data&&e.processData&&typeof e.data!=="string"&&(e.data=d.param(e.data,e.traditional)),bN(bH,e,c,u);if(r===2)return!1;s=e.global,e.type=e.type.toUpperCase(),e.hasContent=!bw.test(e.type),s&&d.active++===0&&d.event.trigger("ajaxStart");if(!e.hasContent){e.data&&(e.url+=(by.test(e.url)?"&":"?")+e.data),k=e.url;if(e.cache===!1){var w=d.now(),x=e.url.replace(bC,"$1_="+w);e.url=x+(x===e.url?(by.test(e.url)?"&":"?")+"_="+w:"")}}if(e.data&&e.hasContent&&e.contentType!==!1||c.contentType)l["Content-Type"]=e.contentType;e.ifModified&&(k=k||e.url,d.lastModified[k]&&(l["If-Modified-Since"]=d.lastModified[k]),d.etag[k]&&(l["If-None-Match"]=d.etag[k])),l.Accept=e.dataTypes[0]&&e.accepts[e.dataTypes[0]]?e.accepts[e.dataTypes[0]]+(e.dataTypes[0]!=="*"?", */*; q=0.01":""):e.accepts["*"];for(t in e.headers)u.setRequestHeader(t,e.headers[t]);if(e.beforeSend&&(e.beforeSend.call(f,u,e)===!1||r===2)){u.abort();return!1}for(t in {success:1,error:1,complete:1})u[t](e[t]);o=bN(bI,e,c,u);if(o){u.readyState=1,s&&g.trigger("ajaxSend",[u,e]),e.async&&e.timeout>0&&(p=setTimeout(function(){u.abort("timeout")},e.timeout));try{r=1,o.send(l,v)}catch(y){status<2?v(-1,y):d.error(y)}}else v(-1,"No Transport");return u},param:function(a,c){var e=[],f=function(a,b){b=d.isFunction(b)?b():b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=d.ajaxSettings.traditional);if(d.isArray(a)||a.jquery&&!d.isPlainObject(a))d.each(a,function(){f(this.name,this.value)});else for(var g in a)bO(g,a[g],c,f);return e.join("&").replace(bp,"+")}}),d.extend({active:0,lastModified:{},etag:{}});var bR=d.now(),bS=/(\=)\?(&|$)|()\?\?()/i;d.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return d.expando+"_"+bR++}}),d.ajaxPrefilter("json jsonp",function(b,c,e){var f=typeof b.data==="string";if(b.dataTypes[0]==="jsonp"||c.jsonpCallback||c.jsonp!=null||b.jsonp!==!1&&(bS.test(b.url)||f&&bS.test(b.data))){var g,h=b.jsonpCallback=d.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2",m=function(){a[h]=i,g&&d.isFunction(i)&&a[h](g[0])};b.jsonp!==!1&&(j=j.replace(bS,l),b.url===j&&(f&&(k=k.replace(bS,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},e.then(m,m),b.converters["script json"]=function(){g||d.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),d.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){d.globalEval(a);return a}}}),d.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),d.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var bT=d.now(),bU,bV;d.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&bX()||bY()}:bX,bV=d.ajaxSettings.xhr(),d.support.ajax=!!bV,d.support.cors=bV&&"withCredentials"in bV,bV=b,d.support.ajax&&d.ajaxTransport(function(a){if(!a.crossDomain||d.support.cors){var c;return{send:function(e,f){var g=a.xhr(),h,i;a.username?g.open(a.type,a.url,a.async,a.username,a.password):g.open(a.type,a.url,a.async);if(a.xhrFields)for(i in a.xhrFields)g[i]=a.xhrFields[i];a.mimeType&&g.overrideMimeType&&g.overrideMimeType(a.mimeType),(!a.crossDomain||a.hasContent)&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(i in e)g.setRequestHeader(i,e[i])}catch(j){}g.send(a.hasContent&&a.data||null),c=function(e,i){var j,k,l,m,n;try{if(c&&(i||g.readyState===4)){c=b,h&&(g.onreadystatechange=d.noop,delete bU[h]);if(i)g.readyState!==4&&g.abort();else{j=g.status,l=g.getAllResponseHeaders(),m={},n=g.responseXML,n&&n.documentElement&&(m.xml=n),m.text=g.responseText;try{k=g.statusText}catch(o){k=""}j||!a.isLocal||a.crossDomain?j===1223&&(j=204):j=m.text?200:404}}}catch(p){i||f(-1,p)}m&&f(j,k,m,l)},a.async&&g.readyState!==4?(bU||(bU={},bW()),h=bT++,g.onreadystatechange=bU[h]=c):c()},abort:function(){c&&c(0,1)}}}});var bZ={},b$=/^(?:toggle|show|hide)$/,b_=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,ca,cb=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];d.fn.extend({show:function(a,b,c){var e,f;if(a||a===0)return this.animate(cc("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)e=this[g],f=e.style.display,!d._data(e,"olddisplay")&&f==="none"&&(f=e.style.display=""),f===""&&d.css(e,"display")==="none"&&d._data(e,"olddisplay",cd(e.nodeName));for(g=0;g<h;g++){e=this[g],f=e.style.display;if(f===""||f==="none")e.style.display=d._data(e,"olddisplay")||""}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cc("hide",3),a,b,c);for(var e=0,f=this.length;e<f;e++){var g=d.css(this[e],"display");g!=="none"&&!d._data(this[e],"olddisplay")&&d._data(this[e],"olddisplay",g)}for(e=0;e<f;e++)this[e].style.display="none";return this},_toggle:d.fn.toggle,toggle:function(a,b,c){var e=typeof a==="boolean";d.isFunction(a)&&d.isFunction(b)?this._toggle.apply(this,arguments):a==null||e?this.each(function(){var b=e?a:d(this).is(":hidden");d(this)[b?"show":"hide"]()}):this.animate(cc("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,e){var f=d.speed(b,c,e);if(d.isEmptyObject(a))return this.each(f.complete);return this[f.queue===!1?"each":"queue"](function(){var b=d.extend({},f),c,e=this.nodeType===1,g=e&&d(this).is(":hidden"),h=this;for(c in a){var i=d.camelCase(c);c!==i&&(a[i]=a[c],delete a[c],c=i);if(a[c]==="hide"&&g||a[c]==="show"&&!g)return b.complete.call(this);if(e&&(c==="height"||c==="width")){b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(d.css(this,"display")==="inline"&&d.css(this,"float")==="none")if(d.support.inlineBlockNeedsLayout){var j=cd(this.nodeName);j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)}else this.style.display="inline-block"}d.isArray(a[c])&&((b.specialEasing=b.specialEasing||{})[c]=a[c][1],a[c]=a[c][0])}b.overflow!=null&&(this.style.overflow="hidden"),b.curAnim=d.extend({},a),d.each(a,function(c,e){var f=new d.fx(h,b,c);if(b$.test(e))f[e==="toggle"?g?"show":"hide":e](a);else{var i=b_.exec(e),j=f.cur();if(i){var k=parseFloat(i[2]),l=i[3]||(d.cssNumber[c]?"":"px");l!=="px"&&(d.style(h,c,(k||1)+l),j=(k||1)/f.cur()*j,d.style(h,c,j+l)),i[1]&&(k=(i[1]==="-="?-1:1)*k+j),f.custom(j,k,l)}else f.custom(j,e,"")}});return!0})},stop:function(a,b){var c=d.timers;a&&this.queue([]),this.each(function(){for(var a=c.length-1;a>=0;a--)c[a].elem===this&&(b&&c[a](!0),c.splice(a,1))}),b||this.dequeue();return this}}),d.each({slideDown:cc("show",1),slideUp:cc("hide",1),slideToggle:cc("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){d.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),d.extend({speed:function(a,b,c){var e=a&&typeof a==="object"?d.extend({},a):{complete:c||!c&&b||d.isFunction(a)&&a,duration:a,easing:c&&b||b&&!d.isFunction(b)&&b};e.duration=d.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in d.fx.speeds?d.fx.speeds[e.duration]:d.fx.speeds._default,e.old=e.complete,e.complete=function(){e.queue!==!1&&d(this).dequeue(),d.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig||(b.orig={})}}),d.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(d.fx.step[this.prop]||d.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=d.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function g(a){return e.step(a)}var e=this,f=d.fx;this.startTime=d.now(),this.start=a,this.end=b,this.unit=c||this.unit||(d.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,g.elem=this.elem,g()&&d.timers.push(g)&&!ca&&(ca=setInterval(f.tick,f.interval))},show:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),d(this.elem).show()},hide:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=d.now(),c=!0;if(a||b>=this.options.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),this.options.curAnim[this.prop]=!0;for(var e in this.options.curAnim)this.options.curAnim[e]!==!0&&(c=!1);if(c){if(this.options.overflow!=null&&!d.support.shrinkWrapBlocks){var f=this.elem,g=this.options;d.each(["","X","Y"],function(a,b){f.style["overflow"+b]=g.overflow[a]})}this.options.hide&&d(this.elem).hide();if(this.options.hide||this.options.show)for(var h in this.options.curAnim)d.style(this.elem,h,this.options.orig[h]);this.options.complete.call(this.elem)}return!1}var i=b-this.startTime;this.state=i/this.options.duration;var j=this.options.specialEasing&&this.options.specialEasing[this.prop],k=this.options.easing||(d.easing.swing?"swing":"linear");this.pos=d.easing[j||k](this.state,i,0,1,this.options.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update();return!0}},d.extend(d.fx,{tick:function(){var a=d.timers;for(var b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||d.fx.stop()},interval:13,stop:function(){clearInterval(ca),ca=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){d.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),d.expr&&d.expr.filters&&(d.expr.filters.animated=function(a){return d.grep(d.timers,function(b){return a===b.elem}).length});var ce=/^t(?:able|d|h)$/i,cf=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?d.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,g=f.documentElement;if(!c||!d.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=f.body,i=cg(f),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||d.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||d.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:d.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);d.offset.initialize();var c,e=b.offsetParent,f=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(d.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===e&&(l+=b.offsetTop,m+=b.offsetLeft,d.offset.doesNotAddBorder&&(!d.offset.doesAddBorderForTableAndCells||!ce.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),f=e,e=b.offsetParent),d.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;d.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},d.offset={initialize:function(){var a=c.body,b=c.createElement("div"),e,f,g,h,i=parseFloat(d.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";d.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),e=b.firstChild,f=e.firstChild,h=e.nextSibling.firstChild.firstChild,this.doesNotAddBorder=f.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,f.style.position="fixed",f.style.top="20px",this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15,f.style.position=f.style.top="",e.style.overflow="hidden",e.style.position="relative",this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),a=b=e=f=g=h=null,d.offset.initialize=d.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;d.offset.initialize(),d.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(d.css(a,"marginTop"))||0,c+=parseFloat(d.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var e=d.css(a,"position");e==="static"&&(a.style.position="relative");var f=d(a),g=f.offset(),h=d.css(a,"top"),i=d.css(a,"left"),j=e==="absolute"&&d.inArray("auto",[h,i])>-1,k={},l={},m,n;j&&(l=f.position()),m=j?l.top:parseInt(h,10)||0,n=j?l.left:parseInt(i,10)||0,d.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):f.css(k)}},d.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),e=cf.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(d.css(a,"marginTop"))||0,c.left-=parseFloat(d.css(a,"marginLeft"))||0,e.top+=parseFloat(d.css(b[0],"borderTopWidth"))||0,e.left+=parseFloat(d.css(b[0],"borderLeftWidth"))||0;return{top:c.top-e.top,left:c.left-e.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&(!cf.test(a.nodeName)&&d.css(a,"position")==="static"))a=a.offsetParent;return a})}}),d.each(["Left","Top"],function(a,c){var e="scroll"+c;d.fn[e]=function(c){var f=this[0],g;if(!f)return null;if(c!==b)return this.each(function(){g=cg(this),g?g.scrollTo(a?d(g).scrollLeft():c,a?c:d(g).scrollTop()):this[e]=c});g=cg(f);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:d.support.boxModel&&g.document.documentElement[e]||g.document.body[e]:f[e]}}),d.each(["Height","Width"],function(a,c){var e=c.toLowerCase();d.fn["inner"+c]=function(){return this[0]?parseFloat(d.css(this[0],e,"padding")):null},d.fn["outer"+c]=function(a){return this[0]?parseFloat(d.css(this[0],e,a?"margin":"border")):null},d.fn[e]=function(a){var f=this[0];if(!f)return a==null?null:this;if(d.isFunction(a))return this.each(function(b){var c=d(this);c[e](a.call(this,b,c[e]()))});if(d.isWindow(f)){var g=f.document.documentElement["client"+c];return f.document.compatMode==="CSS1Compat"&&g||f.document.body["client"+c]||g}if(f.nodeType===9)return Math.max(f.documentElement["client"+c],f.body["scroll"+c],f.documentElement["scroll"+c],f.body["offset"+c],f.documentElement["offset"+c]);if(a===b){var h=d.css(f,e),i=parseFloat(h);return d.isNaN(i)?h:i}return this.css(e,typeof a==="string"?a:a+"px")}}),a.jQuery=a.$=d})(window);
\ No newline at end of file
diff --git a/framework/images/webapp/images/jquery/jquery-1.5.2.js b/framework/images/webapp/images/jquery/jquery-1.5.2.js
new file mode 100644
index 0000000..ae0234d
--- /dev/null
+++ b/framework/images/webapp/images/jquery/jquery-1.5.2.js
@@ -0,0 +1,8374 @@
+/*!
+ * jQuery JavaScript Library v1.5.2
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Mar 31 15:28:23 2011 -0400
+ */
+(function( window, undefined ) {
+
+// Use the correct document accordingly with window argument (sandbox)
+var document = window.document;
+var jQuery = (function() {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// A simple way to check for HTML strings or ID strings
+	// (both of which we optimize for)
+	quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,
+
+	// Check if a string has a non-whitespace character in it
+	rnotwhite = /\S/,
+
+	// Used for trimming whitespace
+	trimLeft = /^\s+/,
+	trimRight = /\s+$/,
+
+	// Check for digits
+	rdigit = /\d/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+
+	// Useragent RegExp
+	rwebkit = /(webkit)[ \/]([\w.]+)/,
+	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+	rmsie = /(msie) ([\w.]+)/,
+	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+
+	// Keep a UserAgent string for use with jQuery.browser
+	userAgent = navigator.userAgent,
+
+	// For matching the engine and version of the browser
+	browserMatch,
+
+	// The deferred used on DOM ready
+	readyList,
+
+	// The ready event handler
+	DOMContentLoaded,
+
+	// Save a reference to some core methods
+	toString = Object.prototype.toString,
+	hasOwn = Object.prototype.hasOwnProperty,
+	push = Array.prototype.push,
+	slice = Array.prototype.slice,
+	trim = String.prototype.trim,
+	indexOf = Array.prototype.indexOf,
+
+	// [[Class]] -> type pairs
+	class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem, ret, doc;
+
+		// Handle $(""), $(null), or $(undefined)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// The body element only exists once, optimize finding it
+		if ( selector === "body" && !context && document.body ) {
+			this.context = document;
+			this[0] = document.body;
+			this.selector = "body";
+			this.length = 1;
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			// Are we dealing with HTML string or an ID?
+			match = quickExpr.exec( selector );
+
+			// Verify a match, and that no context was specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+					doc = (context ? context.ownerDocument || context : document);
+
+					// If a single string is passed in and it's a single tag
+					// just do a createElement and skip the rest
+					ret = rsingleTag.exec( selector );
+
+					if ( ret ) {
+						if ( jQuery.isPlainObject( context ) ) {
+							selector = [ document.createElement( ret[1] ) ];
+							jQuery.fn.attr.call( selector, context, true );
+
+						} else {
+							selector = [ doc.createElement( ret[1] ) ];
+						}
+
+					} else {
+						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+						selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
+					}
+
+					return jQuery.merge( this, selector );
+
+				// HANDLE: $("#id")
+				} else {
+					elem = document.getElementById( match[2] );
+
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we inject the element directly into the jQuery object
+						this.length = 1;
+						this[0] = elem;
+					}
+
+					this.context = document;
+					this.selector = selector;
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return (context || rootjQuery).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return rootjQuery.ready( selector );
+		}
+
+		if (selector.selector !== undefined) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return jQuery.makeArray( selector, this );
+	},
+
+	// Start with an empty selector
+	selector: "",
+
+	// The current version of jQuery being used
+	jquery: "1.5.2",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	toArray: function() {
+		return slice.call( this, 0 );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num == null ?
+
+			// Return a 'clean' array
+			this.toArray() :
+
+			// Return just the object
+			( num < 0 ? this[ this.length + num ] : this[ num ] );
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems, name, selector ) {
+		// Build a new jQuery matched element set
+		var ret = this.constructor();
+
+		if ( jQuery.isArray( elems ) ) {
+			push.apply( ret, elems );
+
+		} else {
+			jQuery.merge( ret, elems );
+		}
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		ret.context = this.context;
+
+		if ( name === "find" ) {
+			ret.selector = this.selector + (this.selector ? " " : "") + selector;
+		} else if ( name ) {
+			ret.selector = this.selector + "." + name + "(" + selector + ")";
+		}
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
+	},
+
+	ready: function( fn ) {
+		// Attach the listeners
+		jQuery.bindReady();
+
+		// Add the callback
+		readyList.done( fn );
+
+		return this;
+	},
+
+	eq: function( i ) {
+		return i === -1 ?
+			this.slice( i ) :
+			this.slice( i, +i + 1 );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ),
+			"slice", slice.call(arguments).join(",") );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor(null);
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: push,
+	sort: [].sort,
+	splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[0] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+		target = {};
+	}
+
+	// extend jQuery itself if only one argument is passed
+	if ( length === i ) {
+		target = this;
+		--i;
+	}
+
+	for ( ; i < length; i++ ) {
+		// Only deal with non-null/undefined values
+		if ( (options = arguments[ i ]) != null ) {
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && jQuery.isArray(src) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject(src) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend({
+	noConflict: function( deep ) {
+		window.$ = _$;
+
+		if ( deep ) {
+			window.jQuery = _jQuery;
+		}
+
+		return jQuery;
+	},
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+		// A third-party is pushing the ready event forwards
+		if ( wait === true ) {
+			jQuery.readyWait--;
+		}
+
+		// Make sure that the DOM is not already loaded
+		if ( !jQuery.readyWait || (wait !== true && !jQuery.isReady) ) {
+			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+			if ( !document.body ) {
+				return setTimeout( jQuery.ready, 1 );
+			}
+
+			// Remember that the DOM is ready
+			jQuery.isReady = true;
+
+			// If a normal DOM Ready event fired, decrement, and wait if need be
+			if ( wait !== true && --jQuery.readyWait > 0 ) {
+				return;
+			}
+
+			// If there are functions bound, to execute
+			readyList.resolveWith( document, [ jQuery ] );
+
+			// Trigger any bound ready events
+			if ( jQuery.fn.trigger ) {
+				jQuery( document ).trigger( "ready" ).unbind( "ready" );
+			}
+		}
+	},
+
+	bindReady: function() {
+		if ( readyList ) {
+			return;
+		}
+
+		readyList = jQuery._Deferred();
+
+		// Catch cases where $(document).ready() is called after the
+		// browser event has already occurred.
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			return setTimeout( jQuery.ready, 1 );
+		}
+
+		// Mozilla, Opera and webkit nightlies currently support this event
+		if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", jQuery.ready, false );
+
+		// If IE event model is used
+		} else if ( document.attachEvent ) {
+			// ensure firing before onload,
+			// maybe late but safe also for iframes
+			document.attachEvent("onreadystatechange", DOMContentLoaded);
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", jQuery.ready );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var toplevel = false;
+
+			try {
+				toplevel = window.frameElement == null;
+			} catch(e) {}
+
+			if ( document.documentElement.doScroll && toplevel ) {
+				doScrollCheck();
+			}
+		}
+	},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return jQuery.type(obj) === "function";
+	},
+
+	isArray: Array.isArray || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	// A crude way of determining if an object is a window
+	isWindow: function( obj ) {
+		return obj && typeof obj === "object" && "setInterval" in obj;
+	},
+
+	isNaN: function( obj ) {
+		return obj == null || !rdigit.test( obj ) || isNaN( obj );
+	},
+
+	type: function( obj ) {
+		return obj == null ?
+			String( obj ) :
+			class2type[ toString.call(obj) ] || "object";
+	},
+
+	isPlainObject: function( obj ) {
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		// Not own constructor property must be Object
+		if ( obj.constructor &&
+			!hasOwn.call(obj, "constructor") &&
+			!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+			return false;
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+
+		var key;
+		for ( key in obj ) {}
+
+		return key === undefined || hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		for ( var name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw msg;
+	},
+
+	parseJSON: function( data ) {
+		if ( typeof data !== "string" || !data ) {
+			return null;
+		}
+
+		// Make sure leading/trailing whitespace is removed (IE can't handle it)
+		data = jQuery.trim( data );
+
+		// Make sure the incoming data is actual JSON
+		// Logic borrowed from http://json.org/json2.js
+		if ( rvalidchars.test(data.replace(rvalidescape, "@")
+			.replace(rvalidtokens, "]")
+			.replace(rvalidbraces, "")) ) {
+
+			// Try to use the native JSON parser first
+			return window.JSON && window.JSON.parse ?
+				window.JSON.parse( data ) :
+				(new Function("return " + data))();
+
+		} else {
+			jQuery.error( "Invalid JSON: " + data );
+		}
+	},
+
+	// Cross-browser xml parsing
+	// (xml & tmp used internally)
+	parseXML: function( data , xml , tmp ) {
+
+		if ( window.DOMParser ) { // Standard
+			tmp = new DOMParser();
+			xml = tmp.parseFromString( data , "text/xml" );
+		} else { // IE
+			xml = new ActiveXObject( "Microsoft.XMLDOM" );
+			xml.async = "false";
+			xml.loadXML( data );
+		}
+
+		tmp = xml.documentElement;
+
+		if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evalulates a script in a global context
+	globalEval: function( data ) {
+		if ( data && rnotwhite.test(data) ) {
+			// Inspired by code by Andrea Giammarchi
+			// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
+			var head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement,
+				script = document.createElement( "script" );
+
+			if ( jQuery.support.scriptEval() ) {
+				script.appendChild( document.createTextNode( data ) );
+			} else {
+				script.text = data;
+			}
+
+			// Use insertBefore instead of appendChild to circumvent an IE6 bug.
+			// This arises when a base node is used (#2709).
+			head.insertBefore( script, head.firstChild );
+			head.removeChild( script );
+		}
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+	},
+
+	// args is for internal usage only
+	each: function( object, callback, args ) {
+		var name, i = 0,
+			length = object.length,
+			isObj = length === undefined || jQuery.isFunction(object);
+
+		if ( args ) {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.apply( object[ name ], args ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.apply( object[ i++ ], args ) === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( var value = object[0];
+					i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
+			}
+		}
+
+		return object;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: trim ?
+		function( text ) {
+			return text == null ?
+				"" :
+				trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		function( text ) {
+			return text == null ?
+				"" :
+				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+		},
+
+	// results is for internal usage only
+	makeArray: function( array, results ) {
+		var ret = results || [];
+
+		if ( array != null ) {
+			// The window, strings (and functions) also have 'length'
+			// The extra typeof function check is to prevent crashes
+			// in Safari 2 (See: #3039)
+			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+			var type = jQuery.type(array);
+
+			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+				push.call( ret, array );
+			} else {
+				jQuery.merge( ret, array );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, array ) {
+		if ( array.indexOf ) {
+			return array.indexOf( elem );
+		}
+
+		for ( var i = 0, length = array.length; i < length; i++ ) {
+			if ( array[ i ] === elem ) {
+				return i;
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var i = first.length,
+			j = 0;
+
+		if ( typeof second.length === "number" ) {
+			for ( var l = second.length; j < l; j++ ) {
+				first[ i++ ] = second[ j ];
+			}
+
+		} else {
+			while ( second[j] !== undefined ) {
+				first[ i++ ] = second[ j++ ];
+			}
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, inv ) {
+		var ret = [], retVal;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( var i = 0, length = elems.length; i < length; i++ ) {
+			retVal = !!callback( elems[ i ], i );
+			if ( inv !== retVal ) {
+				ret.push( elems[ i ] );
+			}
+		}
+
+		return ret;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var ret = [], value;
+
+		// Go through the array, translating each of the items to their
+		// new value (or values).
+		for ( var i = 0, length = elems.length; i < length; i++ ) {
+			value = callback( elems[ i ], i, arg );
+
+			if ( value != null ) {
+				ret[ ret.length ] = value;
+			}
+		}
+
+		// Flatten any nested arrays
+		return ret.concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	proxy: function( fn, proxy, thisObject ) {
+		if ( arguments.length === 2 ) {
+			if ( typeof proxy === "string" ) {
+				thisObject = fn;
+				fn = thisObject[ proxy ];
+				proxy = undefined;
+
+			} else if ( proxy && !jQuery.isFunction( proxy ) ) {
+				thisObject = proxy;
+				proxy = undefined;
+			}
+		}
+
+		if ( !proxy && fn ) {
+			proxy = function() {
+				return fn.apply( thisObject || this, arguments );
+			};
+		}
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		if ( fn ) {
+			proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+		}
+
+		// So proxy can be declared as an argument
+		return proxy;
+	},
+
+	// Mutifunctional method to get and set values to a collection
+	// The value/s can be optionally by executed if its a function
+	access: function( elems, key, value, exec, fn, pass ) {
+		var length = elems.length;
+
+		// Setting many attributes
+		if ( typeof key === "object" ) {
+			for ( var k in key ) {
+				jQuery.access( elems, k, key[k], exec, fn, value );
+			}
+			return elems;
+		}
+
+		// Setting one attribute
+		if ( value !== undefined ) {
+			// Optionally, function values get executed if exec is true
+			exec = !pass && exec && jQuery.isFunction(value);
+
+			for ( var i = 0; i < length; i++ ) {
+				fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+			}
+
+			return elems;
+		}
+
+		// Getting an attribute
+		return length ? fn( elems[0], key ) : undefined;
+	},
+
+	now: function() {
+		return (new Date()).getTime();
+	},
+
+	// Use of jQuery.browser is frowned upon.
+	// More details: http://docs.jquery.com/Utilities/jQuery.browser
+	uaMatch: function( ua ) {
+		ua = ua.toLowerCase();
+
+		var match = rwebkit.exec( ua ) ||
+			ropera.exec( ua ) ||
+			rmsie.exec( ua ) ||
+			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+			[];
+
+		return { browser: match[1] || "", version: match[2] || "0" };
+	},
+
+	sub: function() {
+		function jQuerySubclass( selector, context ) {
+			return new jQuerySubclass.fn.init( selector, context );
+		}
+		jQuery.extend( true, jQuerySubclass, this );
+		jQuerySubclass.superclass = this;
+		jQuerySubclass.fn = jQuerySubclass.prototype = this();
+		jQuerySubclass.fn.constructor = jQuerySubclass;
+		jQuerySubclass.subclass = this.subclass;
+		jQuerySubclass.fn.init = function init( selector, context ) {
+			if ( context && context instanceof jQuery && !(context instanceof jQuerySubclass) ) {
+				context = jQuerySubclass(context);
+			}
+
+			return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass );
+		};
+		jQuerySubclass.fn.init.prototype = jQuerySubclass.fn;
+		var rootjQuerySubclass = jQuerySubclass(document);
+		return jQuerySubclass;
+	},
+
+	browser: {}
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+	jQuery.browser[ browserMatch.browser ] = true;
+	jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+	jQuery.browser.safari = true;
+}
+
+if ( indexOf ) {
+	jQuery.inArray = function( elem, array ) {
+		return indexOf.call( array, elem );
+	};
+}
+
+// IE doesn't match non-breaking spaces with \s
+if ( rnotwhite.test( "\xA0" ) ) {
+	trimLeft = /^[\s\xA0]+/;
+	trimRight = /[\s\xA0]+$/;
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+	DOMContentLoaded = function() {
+		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+		jQuery.ready();
+	};
+
+} else if ( document.attachEvent ) {
+	DOMContentLoaded = function() {
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( document.readyState === "complete" ) {
+			document.detachEvent( "onreadystatechange", DOMContentLoaded );
+			jQuery.ready();
+		}
+	};
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+	if ( jQuery.isReady ) {
+		return;
+	}
+
+	try {
+		// If IE is used, use the trick by Diego Perini
+		// http://javascript.nwbox.com/IEContentLoaded/
+		document.documentElement.doScroll("left");
+	} catch(e) {
+		setTimeout( doScrollCheck, 1 );
+		return;
+	}
+
+	// and execute any waiting functions
+	jQuery.ready();
+}
+
+// Expose jQuery to the global object
+return jQuery;
+
+})();
+
+
+var // Promise methods
+	promiseMethods = "then done fail isResolved isRejected promise".split( " " ),
+	// Static reference to slice
+	sliceDeferred = [].slice;
+
+jQuery.extend({
+	// Create a simple deferred (one callbacks list)
+	_Deferred: function() {
+		var // callbacks list
+			callbacks = [],
+			// stored [ context , args ]
+			fired,
+			// to avoid firing when already doing so
+			firing,
+			// flag to know if the deferred has been cancelled
+			cancelled,
+			// the deferred itself
+			deferred  = {
+
+				// done( f1, f2, ...)
+				done: function() {
+					if ( !cancelled ) {
+						var args = arguments,
+							i,
+							length,
+							elem,
+							type,
+							_fired;
+						if ( fired ) {
+							_fired = fired;
+							fired = 0;
+						}
+						for ( i = 0, length = args.length; i < length; i++ ) {
+							elem = args[ i ];
+							type = jQuery.type( elem );
+							if ( type === "array" ) {
+								deferred.done.apply( deferred, elem );
+							} else if ( type === "function" ) {
+								callbacks.push( elem );
+							}
+						}
+						if ( _fired ) {
+							deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
+						}
+					}
+					return this;
+				},
+
+				// resolve with given context and args
+				resolveWith: function( context, args ) {
+					if ( !cancelled && !fired && !firing ) {
+						// make sure args are available (#8421)
+						args = args || [];
+						firing = 1;
+						try {
+							while( callbacks[ 0 ] ) {
+								callbacks.shift().apply( context, args );
+							}
+						}
+						finally {
+							fired = [ context, args ];
+							firing = 0;
+						}
+					}
+					return this;
+				},
+
+				// resolve with this as context and given arguments
+				resolve: function() {
+					deferred.resolveWith( this, arguments );
+					return this;
+				},
+
+				// Has this deferred been resolved?
+				isResolved: function() {
+					return !!( firing || fired );
+				},
+
+				// Cancel
+				cancel: function() {
+					cancelled = 1;
+					callbacks = [];
+					return this;
+				}
+			};
+
+		return deferred;
+	},
+
+	// Full fledged deferred (two callbacks list)
+	Deferred: function( func ) {
+		var deferred = jQuery._Deferred(),
+			failDeferred = jQuery._Deferred(),
+			promise;
+		// Add errorDeferred methods, then and promise
+		jQuery.extend( deferred, {
+			then: function( doneCallbacks, failCallbacks ) {
+				deferred.done( doneCallbacks ).fail( failCallbacks );
+				return this;
+			},
+			fail: failDeferred.done,
+			rejectWith: failDeferred.resolveWith,
+			reject: failDeferred.resolve,
+			isRejected: failDeferred.isResolved,
+			// Get a promise for this deferred
+			// If obj is provided, the promise aspect is added to the object
+			promise: function( obj ) {
+				if ( obj == null ) {
+					if ( promise ) {
+						return promise;
+					}
+					promise = obj = {};
+				}
+				var i = promiseMethods.length;
+				while( i-- ) {
+					obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
+				}
+				return obj;
+			}
+		} );
+		// Make sure only one callback list will be used
+		deferred.done( failDeferred.cancel ).fail( deferred.cancel );
+		// Unexpose cancel
+		delete deferred.cancel;
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( firstParam ) {
+		var args = arguments,
+			i = 0,
+			length = args.length,
+			count = length,
+			deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
+				firstParam :
+				jQuery.Deferred();
+		function resolveFunc( i ) {
+			return function( value ) {
+				args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+				if ( !( --count ) ) {
+					// Strange bug in FF4:
+					// Values changed onto the arguments object sometimes end up as undefined values
+					// outside the $.when method. Cloning the object into a fresh array solves the issue
+					deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) );
+				}
+			};
+		}
+		if ( length > 1 ) {
+			for( ; i < length; i++ ) {
+				if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) {
+					args[ i ].promise().then( resolveFunc(i), deferred.reject );
+				} else {
+					--count;
+				}
+			}
+			if ( !count ) {
+				deferred.resolveWith( deferred, args );
+			}
+		} else if ( deferred !== firstParam ) {
+			deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
+		}
+		return deferred.promise();
+	}
+});
+
+
+
+
+(function() {
+
+	jQuery.support = {};
+
+	var div = document.createElement("div");
+
+	div.style.display = "none";
+	div.innerHTML = "   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+
+	var all = div.getElementsByTagName("*"),
+		a = div.getElementsByTagName("a")[0],
+		select = document.createElement("select"),
+		opt = select.appendChild( document.createElement("option") ),
+		input = div.getElementsByTagName("input")[0];
+
+	// Can't get basic test support
+	if ( !all || !all.length || !a ) {
+		return;
+	}
+
+	jQuery.support = {
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: div.firstChild.nodeType === 3,
+
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName("tbody").length,
+
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName("link").length,
+
+		// Get the style information from getAttribute
+		// (IE uses .cssText insted)
+		style: /red/.test( a.getAttribute("style") ),
+
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: a.getAttribute("href") === "/a",
+
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		// Use a regex to work around a WebKit issue. See #5145
+		opacity: /^0.55$/.test( a.style.opacity ),
+
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Make sure that if no value is specified for a checkbox
+		// that it defaults to "on".
+		// (WebKit defaults to "" instead)
+		checkOn: input.value === "on",
+
+		// Make sure that a selected-by-default option has a working selected property.
+		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+		optSelected: opt.selected,
+
+		// Will be defined later
+		deleteExpando: true,
+		optDisabled: false,
+		checkClone: false,
+		noCloneEvent: true,
+		noCloneChecked: true,
+		boxModel: null,
+		inlineBlockNeedsLayout: false,
+		shrinkWrapBlocks: false,
+		reliableHiddenOffsets: true,
+		reliableMarginRight: true
+	};
+
+	input.checked = true;
+	jQuery.support.noCloneChecked = input.cloneNode( true ).checked;
+
+	// Make sure that the options inside disabled selects aren't marked as disabled
+	// (WebKit marks them as diabled)
+	select.disabled = true;
+	jQuery.support.optDisabled = !opt.disabled;
+
+	var _scriptEval = null;
+	jQuery.support.scriptEval = function() {
+		if ( _scriptEval === null ) {
+			var root = document.documentElement,
+				script = document.createElement("script"),
+				id = "script" + jQuery.now();
+
+			// Make sure that the execution of code works by injecting a script
+			// tag with appendChild/createTextNode
+			// (IE doesn't support this, fails, and uses .text instead)
+			try {
+				script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
+			} catch(e) {}
+
+			root.insertBefore( script, root.firstChild );
+
+			if ( window[ id ] ) {
+				_scriptEval = true;
+				delete window[ id ];
+			} else {
+				_scriptEval = false;
+			}
+
+			root.removeChild( script );
+		}
+
+		return _scriptEval;
+	};
+
+	// Test to see if it's possible to delete an expando from an element
+	// Fails in Internet Explorer
+	try {
+		delete div.test;
+
+	} catch(e) {
+		jQuery.support.deleteExpando = false;
+	}
+
+	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+		div.attachEvent("onclick", function click() {
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			jQuery.support.noCloneEvent = false;
+			div.detachEvent("onclick", click);
+		});
+		div.cloneNode(true).fireEvent("onclick");
+	}
+
+	div = document.createElement("div");
+	div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";
+
+	var fragment = document.createDocumentFragment();
+	fragment.appendChild( div.firstChild );
+
+	// WebKit doesn't clone checked state correctly in fragments
+	jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
+
+	// Figure out if the W3C box model works as expected
+	// document.body must exist before we can do this
+	jQuery(function() {
+		var div = document.createElement("div"),
+			body = document.getElementsByTagName("body")[0];
+
+		// Frameset documents with no body should not run this code
+		if ( !body ) {
+			return;
+		}
+
+		div.style.width = div.style.paddingLeft = "1px";
+		body.appendChild( div );
+		jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
+
+		if ( "zoom" in div.style ) {
+			// Check if natively block-level elements act like inline-block
+			// elements when setting their display to 'inline' and giving
+			// them layout
+			// (IE < 8 does this)
+			div.style.display = "inline";
+			div.style.zoom = 1;
+			jQuery.support.inlineBlockNeedsLayout = div.offsetWidth === 2;
+
+			// Check if elements with layout shrink-wrap their children
+			// (IE 6 does this)
+			div.style.display = "";
+			div.innerHTML = "<div style='width:4px;'></div>";
+			jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2;
+		}
+
+		div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
+		var tds = div.getElementsByTagName("td");
+
+		// Check if table cells still have offsetWidth/Height when they are set
+		// to display:none and there are still other visible table cells in a
+		// table row; if so, offsetWidth/Height are not reliable for use when
+		// determining if an element has been hidden directly using
+		// display:none (it is still safe to use offsets if a parent element is
+		// hidden; don safety goggles and see bug #4512 for more information).
+		// (only IE 8 fails this test)
+		jQuery.support.reliableHiddenOffsets = tds[0].offsetHeight === 0;
+
+		tds[0].style.display = "";
+		tds[1].style.display = "none";
+
+		// Check if empty table cells still have offsetWidth/Height
+		// (IE < 8 fail this test)
+		jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0;
+		div.innerHTML = "";
+
+		// Check if div with explicit width and no margin-right incorrectly
+		// gets computed margin-right based on width of container. For more
+		// info see bug #3333
+		// Fails in WebKit before Feb 2011 nightlies
+		// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+		if ( document.defaultView && document.defaultView.getComputedStyle ) {
+			div.style.width = "1px";
+			div.style.marginRight = "0";
+			jQuery.support.reliableMarginRight = ( parseInt(document.defaultView.getComputedStyle(div, null).marginRight, 10) || 0 ) === 0;
+		}
+
+		body.removeChild( div ).style.display = "none";
+		div = tds = null;
+	});
+
+	// Technique from Juriy Zaytsev
+	// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
+	var eventSupported = function( eventName ) {
+		var el = document.createElement("div");
+		eventName = "on" + eventName;
+
+		// We only care about the case where non-standard event systems
+		// are used, namely in IE. Short-circuiting here helps us to
+		// avoid an eval call (in setAttribute) which can cause CSP
+		// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+		if ( !el.attachEvent ) {
+			return true;
+		}
+
+		var isSupported = (eventName in el);
+		if ( !isSupported ) {
+			el.setAttribute(eventName, "return;");
+			isSupported = typeof el[eventName] === "function";
+		}
+		return isSupported;
+	};
+
+	jQuery.support.submitBubbles = eventSupported("submit");
+	jQuery.support.changeBubbles = eventSupported("change");
+
+	// release memory in IE
+	div = all = a = null;
+})();
+
+
+
+var rbrace = /^(?:\{.*\}|\[.*\])$/;
+
+jQuery.extend({
+	cache: {},
+
+	// Please use with caution
+	uuid: 0,
+
+	// Unique for each copy of jQuery on the page
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"embed": true,
+		// Ban all objects except for Flash (which handle expandos)
+		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+		"applet": true
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache,
+
+			// We have to handle DOM nodes and JS objects differently because IE6-7
+			// can't GC object references properly across the DOM-JS boundary
+			isNode = elem.nodeType,
+
+			// Only DOM nodes need the global jQuery cache; JS object data is
+			// attached directly to the object so GC can occur automatically
+			cache = isNode ? jQuery.cache : elem,
+
+			// Only defining an ID for JS objects if its cache already exists allows
+			// the code to shortcut on the same path as a DOM node with no cache
+			id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
+
+		// Avoid doing any more work than we need to when trying to get data on an
+		// object that has no data at all
+		if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) {
+			return;
+		}
+
+		if ( !id ) {
+			// Only DOM nodes need a new unique ID for each element since their data
+			// ends up in the global cache
+			if ( isNode ) {
+				elem[ jQuery.expando ] = id = ++jQuery.uuid;
+			} else {
+				id = jQuery.expando;
+			}
+		}
+
+		if ( !cache[ id ] ) {
+			cache[ id ] = {};
+
+			// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
+			// metadata on plain JS objects when the object is serialized using
+			// JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+		}
+
+		// An object can be passed to jQuery.data instead of a key/value pair; this gets
+		// shallow copied over onto the existing cache
+		if ( typeof name === "object" || typeof name === "function" ) {
+			if ( pvt ) {
+				cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
+			} else {
+				cache[ id ] = jQuery.extend(cache[ id ], name);
+			}
+		}
+
+		thisCache = cache[ id ];
+
+		// Internal jQuery data is stored in a separate object inside the object's data
+		// cache in order to avoid key collisions between internal data and user-defined
+		// data
+		if ( pvt ) {
+			if ( !thisCache[ internalKey ] ) {
+				thisCache[ internalKey ] = {};
+			}
+
+			thisCache = thisCache[ internalKey ];
+		}
+
+		if ( data !== undefined ) {
+			thisCache[ name ] = data;
+		}
+
+		// TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
+		// not attempt to inspect the internal events object using jQuery.data, as this
+		// internal data object is undocumented and subject to change.
+		if ( name === "events" && !thisCache[name] ) {
+			return thisCache[ internalKey ] && thisCache[ internalKey ].events;
+		}
+
+		return getByName ? thisCache[ name ] : thisCache;
+	},
+
+	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var internalKey = jQuery.expando, isNode = elem.nodeType,
+
+			// See jQuery.data for more information
+			cache = isNode ? jQuery.cache : elem,
+
+			// See jQuery.data for more information
+			id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+		// If there is already no cache entry for this object, there is no
+		// purpose in continuing
+		if ( !cache[ id ] ) {
+			return;
+		}
+
+		if ( name ) {
+			var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
+
+			if ( thisCache ) {
+				delete thisCache[ name ];
+
+				// If there is no data left in the cache, we want to continue
+				// and let the cache object itself get destroyed
+				if ( !isEmptyDataObject(thisCache) ) {
+					return;
+				}
+			}
+		}
+
+		// See jQuery.data for more information
+		if ( pvt ) {
+			delete cache[ id ][ internalKey ];
+
+			// Don't destroy the parent cache unless the internal data object
+			// had been the only thing left in it
+			if ( !isEmptyDataObject(cache[ id ]) ) {
+				return;
+			}
+		}
+
+		var internalCache = cache[ id ][ internalKey ];
+
+		// Browsers that fail expando deletion also refuse to delete expandos on
+		// the window, but it will allow it on all other JS objects; other browsers
+		// don't care
+		if ( jQuery.support.deleteExpando || cache != window ) {
+			delete cache[ id ];
+		} else {
+			cache[ id ] = null;
+		}
+
+		// We destroyed the entire user cache at once because it's faster than
+		// iterating through each key, but we need to continue to persist internal
+		// data if it existed
+		if ( internalCache ) {
+			cache[ id ] = {};
+			// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
+			// metadata on plain JS objects when the object is serialized using
+			// JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+
+			cache[ id ][ internalKey ] = internalCache;
+
+		// Otherwise, we need to eliminate the expando on the node to avoid
+		// false lookups in the cache for entries that no longer exist
+		} else if ( isNode ) {
+			// IE does not allow us to delete expando properties from nodes,
+			// nor does it have a removeAttribute function on Document nodes;
+			// we must handle all of these cases
+			if ( jQuery.support.deleteExpando ) {
+				delete elem[ jQuery.expando ];
+			} else if ( elem.removeAttribute ) {
+				elem.removeAttribute( jQuery.expando );
+			} else {
+				elem[ jQuery.expando ] = null;
+			}
+		}
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return jQuery.data( elem, name, data, true );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		if ( elem.nodeName ) {
+			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+			if ( match ) {
+				return !(match === true || elem.getAttribute("classid") !== match);
+			}
+		}
+
+		return true;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var data = null;
+
+		if ( typeof key === "undefined" ) {
+			if ( this.length ) {
+				data = jQuery.data( this[0] );
+
+				if ( this[0].nodeType === 1 ) {
+					var attr = this[0].attributes, name;
+					for ( var i = 0, l = attr.length; i < l; i++ ) {
+						name = attr[i].name;
+
+						if ( name.indexOf( "data-" ) === 0 ) {
+							name = name.substr( 5 );
+							dataAttr( this[0], name, data[ name ] );
+						}
+					}
+				}
+			}
+
+			return data;
+
+		} else if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		var parts = key.split(".");
+		parts[1] = parts[1] ? "." + parts[1] : "";
+
+		if ( value === undefined ) {
+			data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+			// Try to fetch any internally stored data first
+			if ( data === undefined && this.length ) {
+				data = jQuery.data( this[0], key );
+				data = dataAttr( this[0], key, data );
+			}
+
+			return data === undefined && parts[1] ?
+				this.data( parts[0] ) :
+				data;
+
+		} else {
+			return this.each(function() {
+				var $this = jQuery( this ),
+					args = [ parts[0], value ];
+
+				$this.triggerHandler( "setData" + parts[1] + "!", args );
+				jQuery.data( this, key, value );
+				$this.triggerHandler( "changeData" + parts[1] + "!", args );
+			});
+		}
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+		data = elem.getAttribute( "data-" + key );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = data === "true" ? true :
+				data === "false" ? false :
+				data === "null" ? null :
+				!jQuery.isNaN( data ) ? parseFloat( data ) :
+					rbrace.test( data ) ? jQuery.parseJSON( data ) :
+					data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON
+// property to be considered empty objects; this property always exists in
+// order to make sure JSON.stringify does not expose internal metadata
+function isEmptyDataObject( obj ) {
+	for ( var name in obj ) {
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+
+
+
+jQuery.extend({
+	queue: function( elem, type, data ) {
+		if ( !elem ) {
+			return;
+		}
+
+		type = (type || "fx") + "queue";
+		var q = jQuery._data( elem, type );
+
+		// Speed up dequeue by getting out quickly if this is just a lookup
+		if ( !data ) {
+			return q || [];
+		}
+
+		if ( !q || jQuery.isArray(data) ) {
+			q = jQuery._data( elem, type, jQuery.makeArray(data) );
+
+		} else {
+			q.push( data );
+		}
+
+		return q;
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			fn = queue.shift();
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+		}
+
+		if ( fn ) {
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift("inprogress");
+			}
+
+			fn.call(elem, function() {
+				jQuery.dequeue(elem, type);
+			});
+		}
+
+		if ( !queue.length ) {
+			jQuery.removeData( elem, type + "queue", true );
+		}
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+		}
+
+		if ( data === undefined ) {
+			return jQuery.queue( this[0], type );
+		}
+		return this.each(function( i ) {
+			var queue = jQuery.queue( this, type, data );
+
+			if ( type === "fx" && queue[0] !== "inprogress" ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	},
+	dequeue: function( type ) {
+		return this.each(function() {
+			jQuery.dequeue( this, type );
+		});
+	},
+
+	// Based off of the plugin by Clint Helfers, with permission.
+	// http://blindsignals.com/index.php/2009/07/jquery-delay/
+	delay: function( time, type ) {
+		time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
+		type = type || "fx";
+
+		return this.queue( type, function() {
+			var elem = this;
+			setTimeout(function() {
+				jQuery.dequeue( elem, type );
+			}, time );
+		});
+	},
+
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	}
+});
+
+
+
+
+var rclass = /[\n\t\r]/g,
+	rspaces = /\s+/,
+	rreturn = /\r/g,
+	rspecialurl = /^(?:href|src|style)$/,
+	rtype = /^(?:button|input)$/i,
+	rfocusable = /^(?:button|input|object|select|textarea)$/i,
+	rclickable = /^a(?:rea)?$/i,
+	rradiocheck = /^(?:radio|checkbox)$/i;
+
+jQuery.props = {
+	"for": "htmlFor",
+	"class": "className",
+	readonly: "readOnly",
+	maxlength: "maxLength",
+	cellspacing: "cellSpacing",
+	rowspan: "rowSpan",
+	colspan: "colSpan",
+	tabindex: "tabIndex",
+	usemap: "useMap",
+	frameborder: "frameBorder"
+};
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, name, value, true, jQuery.attr );
+	},
+
+	removeAttr: function( name, fn ) {
+		return this.each(function(){
+			jQuery.attr( this, name, "" );
+			if ( this.nodeType === 1 ) {
+				this.removeAttribute( name );
+			}
+		});
+	},
+
+	addClass: function( value ) {
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				self.addClass( value.call(this, i, self.attr("class")) );
+			});
+		}
+
+		if ( value && typeof value === "string" ) {
+			var classNames = (value || "").split( rspaces );
+
+			for ( var i = 0, l = this.length; i < l; i++ ) {
+				var elem = this[i];
+
+				if ( elem.nodeType === 1 ) {
+					if ( !elem.className ) {
+						elem.className = value;
+
+					} else {
+						var className = " " + elem.className + " ",
+							setClass = elem.className;
+
+						for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
+							if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
+								setClass += " " + classNames[c];
+							}
+						}
+						elem.className = jQuery.trim( setClass );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				self.removeClass( value.call(this, i, self.attr("class")) );
+			});
+		}
+
+		if ( (value && typeof value === "string") || value === undefined ) {
+			var classNames = (value || "").split( rspaces );
+
+			for ( var i = 0, l = this.length; i < l; i++ ) {
+				var elem = this[i];
+
+				if ( elem.nodeType === 1 && elem.className ) {
+					if ( value ) {
+						var className = (" " + elem.className + " ").replace(rclass, " ");
+						for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
+							className = className.replace(" " + classNames[c] + " ", " ");
+						}
+						elem.className = jQuery.trim( className );
+
+					} else {
+						elem.className = "";
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isBool = typeof stateVal === "boolean";
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
+			});
+		}
+
+		return this.each(function() {
+			if ( type === "string" ) {
+				// toggle individual class names
+				var className,
+					i = 0,
+					self = jQuery( this ),
+					state = stateVal,
+					classNames = value.split( rspaces );
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space seperated list
+					state = isBool ? state : !self.hasClass( className );
+					self[ state ? "addClass" : "removeClass" ]( className );
+				}
+
+			} else if ( type === "undefined" || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.className );
+				}
+
+				// toggle whole className
+				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+			}
+		});
+	},
+
+	hasClass: function( selector ) {
+		var className = " " + selector + " ";
+		for ( var i = 0, l = this.length; i < l; i++ ) {
+			if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		if ( !arguments.length ) {
+			var elem = this[0];
+
+			if ( elem ) {
+				if ( jQuery.nodeName( elem, "option" ) ) {
+					// attributes.value is undefined in Blackberry 4.7 but
+					// uses .value. See #6932
+					var val = elem.attributes.value;
+					return !val || val.specified ? elem.value : elem.text;
+				}
+
+				// We need to handle select boxes special
+				if ( jQuery.nodeName( elem, "select" ) ) {
+					var index = elem.selectedIndex,
+						values = [],
+						options = elem.options,
+						one = elem.type === "select-one";
+
+					// Nothing was selected
+					if ( index < 0 ) {
+						return null;
+					}
+
+					// Loop through all the selected options
+					for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
+						var option = options[ i ];
+
+						// Don't return options that are disabled or in a disabled optgroup
+						if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+								(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+
+							// Get the specific value for the option
+							value = jQuery(option).val();
+
+							// We don't need an array for one selects
+							if ( one ) {
+								return value;
+							}
+
+							// Multi-Selects return an array
+							values.push( value );
+						}
+					}
+
+					// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+					if ( one && !values.length && options.length ) {
+						return jQuery( options[ index ] ).val();
+					}
+
+					return values;
+				}
+
+				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+				if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {
+					return elem.getAttribute("value") === null ? "on" : elem.value;
+				}
+
+				// Everything else, we just grab the value
+				return (elem.value || "").replace(rreturn, "");
+
+			}
+
+			return undefined;
+		}
+
+		var isFunction = jQuery.isFunction(value);
+
+		return this.each(function(i) {
+			var self = jQuery(this), val = value;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call(this, i, self.val());
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+			} else if ( typeof val === "number" ) {
+				val += "";
+			} else if ( jQuery.isArray(val) ) {
+				val = jQuery.map(val, function (value) {
+					return value == null ? "" : value + "";
+				});
+			}
+
+			if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
+				this.checked = jQuery.inArray( self.val(), val ) >= 0;
+
+			} else if ( jQuery.nodeName( this, "select" ) ) {
+				var values = jQuery.makeArray(val);
+
+				jQuery( "option", this ).each(function() {
+					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+				});
+
+				if ( !values.length ) {
+					this.selectedIndex = -1;
+				}
+
+			} else {
+				this.value = val;
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	attrFn: {
+		val: true,
+		css: true,
+		html: true,
+		text: true,
+		data: true,
+		width: true,
+		height: true,
+		offset: true
+	},
+
+	attr: function( elem, name, value, pass ) {
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || elem.nodeType === 2 ) {
+			return undefined;
+		}
+
+		if ( pass && name in jQuery.attrFn ) {
+			return jQuery(elem)[name](value);
+		}
+
+		var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
+			// Whether we are setting (or getting)
+			set = value !== undefined;
+
+		// Try to normalize/fix the name
+		name = notxml && jQuery.props[ name ] || name;
+
+		// Only do all the following if this is a node (faster for style)
+		if ( elem.nodeType === 1 ) {
+			// These attributes require special treatment
+			var special = rspecialurl.test( name );
+
+			// Safari mis-reports the default selected property of an option
+			// Accessing the parent's selectedIndex property fixes it
+			if ( name === "selected" && !jQuery.support.optSelected ) {
+				var parent = elem.parentNode;
+				if ( parent ) {
+					parent.selectedIndex;
+
+					// Make sure that it also works with optgroups, see #5701
+					if ( parent.parentNode ) {
+						parent.parentNode.selectedIndex;
+					}
+				}
+			}
+
+			// If applicable, access the attribute via the DOM 0 way
+			// 'in' checks fail in Blackberry 4.7 #6931
+			if ( (name in elem || elem[ name ] !== undefined) && notxml && !special ) {
+				if ( set ) {
+					// We can't allow the type property to be changed (since it causes problems in IE)
+					if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
+						jQuery.error( "type property can't be changed" );
+					}
+
+					if ( value === null ) {
+						if ( elem.nodeType === 1 ) {
+							elem.removeAttribute( name );
+						}
+
+					} else {
+						elem[ name ] = value;
+					}
+				}
+
+				// browsers index elements by id/name on forms, give priority to attributes.
+				if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
+					return elem.getAttributeNode( name ).nodeValue;
+				}
+
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				if ( name === "tabIndex" ) {
+					var attributeNode = elem.getAttributeNode( "tabIndex" );
+
+					return attributeNode && attributeNode.specified ?
+						attributeNode.value :
+						rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+							0 :
+							undefined;
+				}
+
+				return elem[ name ];
+			}
+
+			if ( !jQuery.support.style && notxml && name === "style" ) {
+				if ( set ) {
+					elem.style.cssText = "" + value;
+				}
+
+				return elem.style.cssText;
+			}
+
+			if ( set ) {
+				// convert the value to a string (all browsers do this but IE) see #1070
+				elem.setAttribute( name, "" + value );
+			}
+
+			// Ensure that missing attributes return undefined
+			// Blackberry 4.7 returns "" from getAttribute #6938
+			if ( !elem.attributes[ name ] && (elem.hasAttribute && !elem.hasAttribute( name )) ) {
+				return undefined;
+			}
+
+			var attr = !jQuery.support.hrefNormalized && notxml && special ?
+					// Some attributes require a special call on IE
+					elem.getAttribute( name, 2 ) :
+					elem.getAttribute( name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return attr === null ? undefined : attr;
+		}
+		// Handle everything which isn't a DOM element node
+		if ( set ) {
+			elem[ name ] = value;
+		}
+		return elem[ name ];
+	}
+});
+
+
+
+
+var rnamespaces = /\.(.*)$/,
+	rformElems = /^(?:textarea|input|select)$/i,
+	rperiod = /\./g,
+	rspace = / /g,
+	rescape = /[^\w\s.|`]/g,
+	fcleanup = function( nm ) {
+		return nm.replace(rescape, "\\$&");
+	};
+
+/*
+ * A number of helper functions used for managing events.
+ * Many of the ideas behind this code originated from
+ * Dean Edwards' addEvent library.
+ */
+jQuery.event = {
+
+	// Bind an event to an element
+	// Original by Dean Edwards
+	add: function( elem, types, handler, data ) {
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		// TODO :: Use a try/catch until it's safe to pull this out (likely 1.6)
+		// Minor release fix for bug #8018
+		try {
+			// For whatever reason, IE has trouble passing the window object
+			// around, causing it to be cloned in the process
+			if ( jQuery.isWindow( elem ) && ( elem !== window && !elem.frameElement ) ) {
+				elem = window;
+			}
+		}
+		catch ( e ) {}
+
+		if ( handler === false ) {
+			handler = returnFalse;
+		} else if ( !handler ) {
+			// Fixes bug #7229. Fix recommended by jdalton
+			return;
+		}
+
+		var handleObjIn, handleObj;
+
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+		}
+
+		// Make sure that the function being executed has a unique ID
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure
+		var elemData = jQuery._data( elem );
+
+		// If no elemData is found then we must be trying to bind to one of the
+		// banned noData elements
+		if ( !elemData ) {
+			return;
+		}
+
+		var events = elemData.events,
+			eventHandle = elemData.handle;
+
+		if ( !events ) {
+			elemData.events = events = {};
+		}
+
+		if ( !eventHandle ) {
+			elemData.handle = eventHandle = function( e ) {
+				// Handle the second event of a trigger and when
+				// an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
+					jQuery.event.handle.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+		}
+
+		// Add elem as a property of the handle function
+		// This is to prevent a memory leak with non-native events in IE.
+		eventHandle.elem = elem;
+
+		// Handle multiple events separated by a space
+		// jQuery(...).bind("mouseover mouseout", fn);
+		types = types.split(" ");
+
+		var type, i = 0, namespaces;
+
+		while ( (type = types[ i++ ]) ) {
+			handleObj = handleObjIn ?
+				jQuery.extend({}, handleObjIn) :
+				{ handler: handler, data: data };
+
+			// Namespaced event handlers
+			if ( type.indexOf(".") > -1 ) {
+				namespaces = type.split(".");
+				type = namespaces.shift();
+				handleObj.namespace = namespaces.slice(0).sort().join(".");
+
+			} else {
+				namespaces = [];
+				handleObj.namespace = "";
+			}
+
+			handleObj.type = type;
+			if ( !handleObj.guid ) {
+				handleObj.guid = handler.guid;
+			}
+
+			// Get the current list of functions bound to this event
+			var handlers = events[ type ],
+				special = jQuery.event.special[ type ] || {};
+
+			// Init the event handler queue
+			if ( !handlers ) {
+				handlers = events[ type ] = [];
+
+				// Check for a special event handler
+				// Only use addEventListener/attachEvent if the special
+				// events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add the function to the element's handler list
+			handlers.push( handleObj );
+
+			// Keep track of which events have been used, for global triggering
+			jQuery.event.global[ type ] = true;
+		}
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	global: {},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, pos ) {
+		// don't do events on text and comment nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		if ( handler === false ) {
+			handler = returnFalse;
+		}
+
+		var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
+			elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+			events = elemData && elemData.events;
+
+		if ( !elemData || !events ) {
+			return;
+		}
+
+		// types is actually an event object here
+		if ( types && types.type ) {
+			handler = types.handler;
+			types = types.type;
+		}
+
+		// Unbind all events for the element
+		if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
+			types = types || "";
+
+			for ( type in events ) {
+				jQuery.event.remove( elem, type + types );
+			}
+
+			return;
+		}
+
+		// Handle multiple events separated by a space
+		// jQuery(...).unbind("mouseover mouseout", fn);
+		types = types.split(" ");
+
+		while ( (type = types[ i++ ]) ) {
+			origType = type;
+			handleObj = null;
+			all = type.indexOf(".") < 0;
+			namespaces = [];
+
+			if ( !all ) {
+				// Namespaced event handlers
+				namespaces = type.split(".");
+				type = namespaces.shift();
+
+				namespace = new RegExp("(^|\\.)" +
+					jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
+			}
+
+			eventType = events[ type ];
+
+			if ( !eventType ) {
+				continue;
+			}
+
+			if ( !handler ) {
+				for ( j = 0; j < eventType.length; j++ ) {
+					handleObj = eventType[ j ];
+
+					if ( all || namespace.test( handleObj.namespace ) ) {
+						jQuery.event.remove( elem, origType, handleObj.handler, j );
+						eventType.splice( j--, 1 );
+					}
+				}
+
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+
+			for ( j = pos || 0; j < eventType.length; j++ ) {
+				handleObj = eventType[ j ];
+
+				if ( handler.guid === handleObj.guid ) {
+					// remove the given handler for the given type
+					if ( all || namespace.test( handleObj.namespace ) ) {
+						if ( pos == null ) {
+							eventType.splice( j--, 1 );
+						}
+
+						if ( special.remove ) {
+							special.remove.call( elem, handleObj );
+						}
+					}
+
+					if ( pos != null ) {
+						break;
+					}
+				}
+			}
+
+			// remove generic event handler if no more handlers exist
+			if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				ret = null;
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			var handle = elemData.handle;
+			if ( handle ) {
+				handle.elem = null;
+			}
+
+			delete elemData.events;
+			delete elemData.handle;
+
+			if ( jQuery.isEmptyObject( elemData ) ) {
+				jQuery.removeData( elem, undefined, true );
+			}
+		}
+	},
+
+	// bubbling is internal
+	trigger: function( event, data, elem /*, bubbling */ ) {
+		// Event object or event type
+		var type = event.type || event,
+			bubbling = arguments[3];
+
+		if ( !bubbling ) {
+			event = typeof event === "object" ?
+				// jQuery.Event object
+				event[ jQuery.expando ] ? event :
+				// Object literal
+				jQuery.extend( jQuery.Event(type), event ) :
+				// Just the event type (string)
+				jQuery.Event(type);
+
+			if ( type.indexOf("!") >= 0 ) {
+				event.type = type = type.slice(0, -1);
+				event.exclusive = true;
+			}
+
+			// Handle a global trigger
+			if ( !elem ) {
+				// Don't bubble custom events when global (to avoid too much overhead)
+				event.stopPropagation();
+
+				// Only trigger if we've ever bound an event for it
+				if ( jQuery.event.global[ type ] ) {
+					// XXX This code smells terrible. event.js should not be directly
+					// inspecting the data cache
+					jQuery.each( jQuery.cache, function() {
+						// internalKey variable is just used to make it easier to find
+						// and potentially change this stuff later; currently it just
+						// points to jQuery.expando
+						var internalKey = jQuery.expando,
+							internalCache = this[ internalKey ];
+						if ( internalCache && internalCache.events && internalCache.events[ type ] ) {
+							jQuery.event.trigger( event, data, internalCache.handle.elem );
+						}
+					});
+				}
+			}
+
+			// Handle triggering a single element
+
+			// don't do events on text and comment nodes
+			if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
+				return undefined;
+			}
+
+			// Clean up in case it is reused
+			event.result = undefined;
+			event.target = elem;
+
+			// Clone the incoming data, if any
+			data = jQuery.makeArray( data );
+			data.unshift( event );
+		}
+
+		event.currentTarget = elem;
+
+		// Trigger the event, it is assumed that "handle" is a function
+		var handle = jQuery._data( elem, "handle" );
+
+		if ( handle ) {
+			handle.apply( elem, data );
+		}
+
+		var parent = elem.parentNode || elem.ownerDocument;
+
+		// Trigger an inline bound script
+		try {
+			if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
+				if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) {
+					event.result = false;
+					event.preventDefault();
+				}
+			}
+
+		// prevent IE from throwing an error for some elements with some event types, see #3533
+		} catch (inlineError) {}
+
+		if ( !event.isPropagationStopped() && parent ) {
+			jQuery.event.trigger( event, data, parent, true );
+
+		} else if ( !event.isDefaultPrevented() ) {
+			var old,
+				target = event.target,
+				targetType = type.replace( rnamespaces, "" ),
+				isClick = jQuery.nodeName( target, "a" ) && targetType === "click",
+				special = jQuery.event.special[ targetType ] || {};
+
+			if ( (!special._default || special._default.call( elem, event ) === false) &&
+				!isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
+
+				try {
+					if ( target[ targetType ] ) {
+						// Make sure that we don't accidentally re-trigger the onFOO events
+						old = target[ "on" + targetType ];
+
+						if ( old ) {
+							target[ "on" + targetType ] = null;
+						}
+
+						jQuery.event.triggered = event.type;
+						target[ targetType ]();
+					}
+
+				// prevent IE from throwing an error for some elements with some event types, see #3533
+				} catch (triggerError) {}
+
+				if ( old ) {
+					target[ "on" + targetType ] = old;
+				}
+
+				jQuery.event.triggered = undefined;
+			}
+		}
+	},
+
+	handle: function( event ) {
+		var all, handlers, namespaces, namespace_re, events,
+			namespace_sort = [],
+			args = jQuery.makeArray( arguments );
+
+		event = args[0] = jQuery.event.fix( event || window.event );
+		event.currentTarget = this;
+
+		// Namespaced event handlers
+		all = event.type.indexOf(".") < 0 && !event.exclusive;
+
+		if ( !all ) {
+			namespaces = event.type.split(".");
+			event.type = namespaces.shift();
+			namespace_sort = namespaces.slice(0).sort();
+			namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)");
+		}
+
+		event.namespace = event.namespace || namespace_sort.join(".");
+
+		events = jQuery._data(this, "events");
+
+		handlers = (events || {})[ event.type ];
+
+		if ( events && handlers ) {
+			// Clone the handlers to prevent manipulation
+			handlers = handlers.slice(0);
+
+			for ( var j = 0, l = handlers.length; j < l; j++ ) {
+				var handleObj = handlers[ j ];
+
+				// Filter the functions by class
+				if ( all || namespace_re.test( handleObj.namespace ) ) {
+					// Pass in a reference to the handler function itself
+					// So that we can later remove it
+					event.handler = handleObj.handler;
+					event.data = handleObj.data;
+					event.handleObj = handleObj;
+
+					var ret = handleObj.handler.apply( this, args );
+
+					if ( ret !== undefined ) {
+						event.result = ret;
+						if ( ret === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+
+					if ( event.isImmediatePropagationStopped() ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// store a copy of the original event object
+		// and "clone" to set read-only properties
+		var originalEvent = event;
+		event = jQuery.Event( originalEvent );
+
+		for ( var i = this.props.length, prop; i; ) {
+			prop = this.props[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Fix target property, if necessary
+		if ( !event.target ) {
+			// Fixes #1925 where srcElement might not be defined either
+			event.target = event.srcElement || document;
+		}
+
+		// check if target is a textnode (safari)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// Add relatedTarget, if necessary
+		if ( !event.relatedTarget && event.fromElement ) {
+			event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
+		}
+
+		// Calculate pageX/Y if missing and clientX/Y available
+		if ( event.pageX == null && event.clientX != null ) {
+			var doc = document.documentElement,
+				body = document.body;
+
+			event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
+			event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
+		}
+
+		// Add which for key events
+		if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
+			event.which = event.charCode != null ? event.charCode : event.keyCode;
+		}
+
+		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
+		if ( !event.metaKey && event.ctrlKey ) {
+			event.metaKey = event.ctrlKey;
+		}
+
+		// Add which for click: 1 === left; 2 === middle; 3 === right
+		// Note: button is not normalized, so don't use it
+		if ( !event.which && event.button !== undefined ) {
+			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
+		}
+
+		return event;
+	},
+
+	// Deprecated, use jQuery.guid instead
+	guid: 1E8,
+
+	// Deprecated, use jQuery.proxy instead
+	proxy: jQuery.proxy,
+
+	special: {
+		ready: {
+			// Make sure the ready event is setup
+			setup: jQuery.bindReady,
+			teardown: jQuery.noop
+		},
+
+		live: {
+			add: function( handleObj ) {
+				jQuery.event.add( this,
+					liveConvert( handleObj.origType, handleObj.selector ),
+					jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
+			},
+
+			remove: function( handleObj ) {
+				jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
+			}
+		},
+
+		beforeunload: {
+			setup: function( data, namespaces, eventHandle ) {
+				// We only want to do this special case on windows
+				if ( jQuery.isWindow( this ) ) {
+					this.onbeforeunload = eventHandle;
+				}
+			},
+
+			teardown: function( namespaces, eventHandle ) {
+				if ( this.onbeforeunload === eventHandle ) {
+					this.onbeforeunload = null;
+				}
+			}
+		}
+	}
+};
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		if ( elem.detachEvent ) {
+			elem.detachEvent( "on" + type, handle );
+		}
+	};
+
+jQuery.Event = function( src ) {
+	// Allow instantiation without the 'new' keyword
+	if ( !this.preventDefault ) {
+		return new jQuery.Event( src );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
+			src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// timeStamp is buggy for some events on Firefox(#3843)
+	// So we won't rely on the native value
+	this.timeStamp = jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+function returnFalse() {
+	return false;
+}
+function returnTrue() {
+	return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	preventDefault: function() {
+		this.isDefaultPrevented = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+
+		// if preventDefault exists run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// otherwise set the returnValue property of the original event to false (IE)
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		this.isPropagationStopped = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+		// if stopPropagation exists run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+		// otherwise set the cancelBubble property of the original event to true (IE)
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	},
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse
+};
+
+// Checks if an event happened on an element within another element
+// Used in jQuery.event.special.mouseenter and mouseleave handlers
+var withinElement = function( event ) {
+	// Check if mouse(over|out) are still within the same parent element
+	var parent = event.relatedTarget;
+
+	// Firefox sometimes assigns relatedTarget a XUL element
+	// which we cannot access the parentNode property of
+	try {
+
+		// Chrome does something similar, the parentNode property
+		// can be accessed but is null.
+		if ( parent && parent !== document && !parent.parentNode ) {
+			return;
+		}
+		// Traverse up the tree
+		while ( parent && parent !== this ) {
+			parent = parent.parentNode;
+		}
+
+		if ( parent !== this ) {
+			// set the correct event type
+			event.type = event.data;
+
+			// handle event if we actually just moused on to a non sub-element
+			jQuery.event.handle.apply( this, arguments );
+		}
+
+	// assuming we've left the element since we most likely mousedover a xul element
+	} catch(e) { }
+},
+
+// In case of event delegation, we only need to rename the event.type,
+// liveHandler will take care of the rest.
+delegate = function( event ) {
+	event.type = event.data;
+	jQuery.event.handle.apply( this, arguments );
+};
+
+// Create mouseenter and mouseleave events
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		setup: function( data ) {
+			jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
+		},
+		teardown: function( data ) {
+			jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
+		}
+	};
+});
+
+// submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function( data, namespaces ) {
+			if ( this.nodeName && this.nodeName.toLowerCase() !== "form" ) {
+				jQuery.event.add(this, "click.specialSubmit", function( e ) {
+					var elem = e.target,
+						type = elem.type;
+
+					if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
+						trigger( "submit", this, arguments );
+					}
+				});
+
+				jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
+					var elem = e.target,
+						type = elem.type;
+
+					if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
+						trigger( "submit", this, arguments );
+					}
+				});
+
+			} else {
+				return false;
+			}
+		},
+
+		teardown: function( namespaces ) {
+			jQuery.event.remove( this, ".specialSubmit" );
+		}
+	};
+
+}
+
+// change delegation, happens here so we have bind.
+if ( !jQuery.support.changeBubbles ) {
+
+	var changeFilters,
+
+	getVal = function( elem ) {
+		var type = elem.type, val = elem.value;
+
+		if ( type === "radio" || type === "checkbox" ) {
+			val = elem.checked;
+
+		} else if ( type === "select-multiple" ) {
+			val = elem.selectedIndex > -1 ?
+				jQuery.map( elem.options, function( elem ) {
+					return elem.selected;
+				}).join("-") :
+				"";
+
+		} else if ( elem.nodeName.toLowerCase() === "select" ) {
+			val = elem.selectedIndex;
+		}
+
+		return val;
+	},
+
+	testChange = function testChange( e ) {
+		var elem = e.target, data, val;
+
+		if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
+			return;
+		}
+
+		data = jQuery._data( elem, "_change_data" );
+		val = getVal(elem);
+
+		// the current data will be also retrieved by beforeactivate
+		if ( e.type !== "focusout" || elem.type !== "radio" ) {
+			jQuery._data( elem, "_change_data", val );
+		}
+
+		if ( data === undefined || val === data ) {
+			return;
+		}
+
+		if ( data != null || val ) {
+			e.type = "change";
+			e.liveFired = undefined;
+			jQuery.event.trigger( e, arguments[1], elem );
+		}
+	};
+
+	jQuery.event.special.change = {
+		filters: {
+			focusout: testChange,
+
+			beforedeactivate: testChange,
+
+			click: function( e ) {
+				var elem = e.target, type = elem.type;
+
+				if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
+					testChange.call( this, e );
+				}
+			},
+
+			// Change has to be called before submit
+			// Keydown will be called before keypress, which is used in submit-event delegation
+			keydown: function( e ) {
+				var elem = e.target, type = elem.type;
+
+				if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
+					(e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
+					type === "select-multiple" ) {
+					testChange.call( this, e );
+				}
+			},
+
+			// Beforeactivate happens also before the previous element is blurred
+			// with this event you can't trigger a change event, but you can store
+			// information
+			beforeactivate: function( e ) {
+				var elem = e.target;
+				jQuery._data( elem, "_change_data", getVal(elem) );
+			}
+		},
+
+		setup: function( data, namespaces ) {
+			if ( this.type === "file" ) {
+				return false;
+			}
+
+			for ( var type in changeFilters ) {
+				jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
+			}
+
+			return rformElems.test( this.nodeName );
+		},
+
+		teardown: function( namespaces ) {
+			jQuery.event.remove( this, ".specialChange" );
+
+			return rformElems.test( this.nodeName );
+		}
+	};
+
+	changeFilters = jQuery.event.special.change.filters;
+
+	// Handle when the input is .focus()'d
+	changeFilters.focus = changeFilters.beforeactivate;
+}
+
+function trigger( type, elem, args ) {
+	// Piggyback on a donor event to simulate a different one.
+	// Fake originalEvent to avoid donor's stopPropagation, but if the
+	// simulated event prevents default then we do the same on the donor.
+	// Don't pass args or remember liveFired; they apply to the donor event.
+	var event = jQuery.extend( {}, args[ 0 ] );
+	event.type = type;
+	event.originalEvent = {};
+	event.liveFired = undefined;
+	jQuery.event.handle.call( elem, event );
+	if ( event.isDefaultPrevented() ) {
+		args[ 0 ].preventDefault();
+	}
+}
+
+// Create "bubbling" focus and blur events
+if ( document.addEventListener ) {
+	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+	
+		// Attach a single capturing handler while someone wants focusin/focusout
+		var attaches = 0;
+		
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				if ( attaches++ === 0 ) {
+					document.addEventListener( orig, handler, true );
+				}
+			},
+			teardown: function() {
+				if ( --attaches === 0 ) {
+					document.removeEventListener( orig, handler, true );
+				}
+			}
+		};
+
+		function handler( donor ) {
+			// Donor event is always a native one; fix it and switch its type.
+			// Let focusin/out handler cancel the donor focus/blur event.
+			var e = jQuery.event.fix( donor );
+			e.type = fix;
+			e.originalEvent = {};
+			jQuery.event.trigger( e, null, e.target );
+			if ( e.isDefaultPrevented() ) {
+				donor.preventDefault();
+			}
+		}
+	});
+}
+
+jQuery.each(["bind", "one"], function( i, name ) {
+	jQuery.fn[ name ] = function( type, data, fn ) {
+		// Handle object literals
+		if ( typeof type === "object" ) {
+			for ( var key in type ) {
+				this[ name ](key, data, type[key], fn);
+			}
+			return this;
+		}
+
+		if ( jQuery.isFunction( data ) || data === false ) {
+			fn = data;
+			data = undefined;
+		}
+
+		var handler = name === "one" ? jQuery.proxy( fn, function( event ) {
+			jQuery( this ).unbind( event, handler );
+			return fn.apply( this, arguments );
+		}) : fn;
+
+		if ( type === "unload" && name !== "one" ) {
+			this.one( type, data, fn );
+
+		} else {
+			for ( var i = 0, l = this.length; i < l; i++ ) {
+				jQuery.event.add( this[i], type, handler, data );
+			}
+		}
+
+		return this;
+	};
+});
+
+jQuery.fn.extend({
+	unbind: function( type, fn ) {
+		// Handle object literals
+		if ( typeof type === "object" && !type.preventDefault ) {
+			for ( var key in type ) {
+				this.unbind(key, type[key]);
+			}
+
+		} else {
+			for ( var i = 0, l = this.length; i < l; i++ ) {
+				jQuery.event.remove( this[i], type, fn );
+			}
+		}
+
+		return this;
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.live( types, data, fn, selector );
+	},
+
+	undelegate: function( selector, types, fn ) {
+		if ( arguments.length === 0 ) {
+				return this.unbind( "live" );
+
+		} else {
+			return this.die( types, null, fn, selector );
+		}
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function() {
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+
+	triggerHandler: function( type, data ) {
+		if ( this[0] ) {
+			var event = jQuery.Event( type );
+			event.preventDefault();
+			event.stopPropagation();
+			jQuery.event.trigger( event, data, this[0] );
+			return event.result;
+		}
+	},
+
+	toggle: function( fn ) {
+		// Save reference to arguments for access in closure
+		var args = arguments,
+			i = 1;
+
+		// link all the functions, so any of them can unbind this click handler
+		while ( i < args.length ) {
+			jQuery.proxy( fn, args[ i++ ] );
+		}
+
+		return this.click( jQuery.proxy( fn, function( event ) {
+			// Figure out which function to execute
+			var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+			jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+			// Make sure that clicks stop
+			event.preventDefault();
+
+			// and execute the function
+			return args[ lastToggle ].apply( this, arguments ) || false;
+		}));
+	},
+
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+});
+
+var liveMap = {
+	focus: "focusin",
+	blur: "focusout",
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+};
+
+jQuery.each(["live", "die"], function( i, name ) {
+	jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
+		var type, i = 0, match, namespaces, preType,
+			selector = origSelector || this.selector,
+			context = origSelector ? this : jQuery( this.context );
+
+		if ( typeof types === "object" && !types.preventDefault ) {
+			for ( var key in types ) {
+				context[ name ]( key, data, types[key], selector );
+			}
+
+			return this;
+		}
+
+		if ( jQuery.isFunction( data ) ) {
+			fn = data;
+			data = undefined;
+		}
+
+		types = (types || "").split(" ");
+
+		while ( (type = types[ i++ ]) != null ) {
+			match = rnamespaces.exec( type );
+			namespaces = "";
+
+			if ( match )  {
+				namespaces = match[0];
+				type = type.replace( rnamespaces, "" );
+			}
+
+			if ( type === "hover" ) {
+				types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
+				continue;
+			}
+
+			preType = type;
+
+			if ( type === "focus" || type === "blur" ) {
+				types.push( liveMap[ type ] + namespaces );
+				type = type + namespaces;
+
+			} else {
+				type = (liveMap[ type ] || type) + namespaces;
+			}
+
+			if ( name === "live" ) {
+				// bind live handler
+				for ( var j = 0, l = context.length; j < l; j++ ) {
+					jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
+						{ data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
+				}
+
+			} else {
+				// unbind live handler
+				context.unbind( "live." + liveConvert( type, selector ), fn );
+			}
+		}
+
+		return this;
+	};
+});
+
+function liveHandler( event ) {
+	var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
+		elems = [],
+		selectors = [],
+		events = jQuery._data( this, "events" );
+
+	// Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
+	if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
+		return;
+	}
+
+	if ( event.namespace ) {
+		namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
+	}
+
+	event.liveFired = this;
+
+	var live = events.live.slice(0);
+
+	for ( j = 0; j < live.length; j++ ) {
+		handleObj = live[j];
+
+		if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
+			selectors.push( handleObj.selector );
+
+		} else {
+			live.splice( j--, 1 );
+		}
+	}
+
+	match = jQuery( event.target ).closest( selectors, event.currentTarget );
+
+	for ( i = 0, l = match.length; i < l; i++ ) {
+		close = match[i];
+
+		for ( j = 0; j < live.length; j++ ) {
+			handleObj = live[j];
+
+			if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) {
+				elem = close.elem;
+				related = null;
+
+				// Those two events require additional checking
+				if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
+					event.type = handleObj.preType;
+					related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
+				}
+
+				if ( !related || related !== elem ) {
+					elems.push({ elem: elem, handleObj: handleObj, level: close.level });
+				}
+			}
+		}
+	}
+
+	for ( i = 0, l = elems.length; i < l; i++ ) {
+		match = elems[i];
+
+		if ( maxLevel && match.level > maxLevel ) {
+			break;
+		}
+
+		event.currentTarget = match.elem;
+		event.data = match.handleObj.data;
+		event.handleObj = match.handleObj;
+
+		ret = match.handleObj.origHandler.apply( match.elem, arguments );
+
+		if ( ret === false || event.isPropagationStopped() ) {
+			maxLevel = match.level;
+
+			if ( ret === false ) {
+				stop = false;
+			}
+			if ( event.isImmediatePropagationStopped() ) {
+				break;
+			}
+		}
+	}
+
+	return stop;
+}
+
+function liveConvert( type, selector ) {
+	return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspace, "&");
+}
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup error").split(" "), function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		if ( fn == null ) {
+			fn = data;
+			data = null;
+		}
+
+		return arguments.length > 0 ?
+			this.bind( name, data, fn ) :
+			this.trigger( name );
+	};
+
+	if ( jQuery.attrFn ) {
+		jQuery.attrFn[ name ] = true;
+	}
+});
+
+
+/*!
+ * Sizzle CSS Selector Engine
+ *  Copyright 2011, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+	done = 0,
+	toString = Object.prototype.toString,
+	hasDuplicate = false,
+	baseHasDuplicate = true,
+	rBackslash = /\\/g,
+	rNonWord = /\W/;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+//   Thus far that includes Google Chrome.
+[0, 0].sort(function() {
+	baseHasDuplicate = false;
+	return 0;
+});
+
+var Sizzle = function( selector, context, results, seed ) {
+	results = results || [];
+	context = context || document;
+
+	var origContext = context;
+
+	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+		return [];
+	}
+	
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	var m, set, checkSet, extra, ret, cur, pop, i,
+		prune = true,
+		contextXML = Sizzle.isXML( context ),
+		parts = [],
+		soFar = selector;
+	
+	// Reset the position of the chunker regexp (start from head)
+	do {
+		chunker.exec( "" );
+		m = chunker.exec( soFar );
+
+		if ( m ) {
+			soFar = m[3];
+		
+			parts.push( m[1] );
+		
+			if ( m[2] ) {
+				extra = m[3];
+				break;
+			}
+		}
+	} while ( m );
+
+	if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
+		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+			set = posProcess( parts[0] + parts[1], context );
+
+		} else {
+			set = Expr.relative[ parts[0] ] ?
+				[ context ] :
+				Sizzle( parts.shift(), context );
+
+			while ( parts.length ) {
+				selector = parts.shift();
+
+				if ( Expr.relative[ selector ] ) {
+					selector += parts.shift();
+				}
+				
+				set = posProcess( selector, set );
+			}
+		}
+
+	} else {
+		// Take a shortcut and set the context if the root selector is an ID
+		// (but not if it'll be faster if the inner selector is an ID)
+		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
+			ret = Sizzle.find( parts.shift(), context, contextXML );
+			context = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set )[0] :
+				ret.set[0];
+		}
+
+		if ( context ) {
+			ret = seed ?
+				{ expr: parts.pop(), set: makeArray(seed) } :
+				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+
+			set = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set ) :
+				ret.set;
+
+			if ( parts.length > 0 ) {
+				checkSet = makeArray( set );
+
+			} else {
+				prune = false;
+			}
+
+			while ( parts.length ) {
+				cur = parts.pop();
+				pop = cur;
+
+				if ( !Expr.relative[ cur ] ) {
+					cur = "";
+				} else {
+					pop = parts.pop();
+				}
+
+				if ( pop == null ) {
+					pop = context;
+				}
+
+				Expr.relative[ cur ]( checkSet, pop, contextXML );
+			}
+
+		} else {
+			checkSet = parts = [];
+		}
+	}
+
+	if ( !checkSet ) {
+		checkSet = set;
+	}
+
+	if ( !checkSet ) {
+		Sizzle.error( cur || selector );
+	}
+
+	if ( toString.call(checkSet) === "[object Array]" ) {
+		if ( !prune ) {
+			results.push.apply( results, checkSet );
+
+		} else if ( context && context.nodeType === 1 ) {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+					results.push( set[i] );
+				}
+			}
+
+		} else {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+					results.push( set[i] );
+				}
+			}
+		}
+
+	} else {
+		makeArray( checkSet, results );
+	}
+
+	if ( extra ) {
+		Sizzle( extra, origContext, results, seed );
+		Sizzle.uniqueSort( results );
+	}
+
+	return results;
+};
+
+Sizzle.uniqueSort = function( results ) {
+	if ( sortOrder ) {
+		hasDuplicate = baseHasDuplicate;
+		results.sort( sortOrder );
+
+		if ( hasDuplicate ) {
+			for ( var i = 1; i < results.length; i++ ) {
+				if ( results[i] === results[ i - 1 ] ) {
+					results.splice( i--, 1 );
+				}
+			}
+		}
+	}
+
+	return results;
+};
+
+Sizzle.matches = function( expr, set ) {
+	return Sizzle( expr, null, null, set );
+};
+
+Sizzle.matchesSelector = function( node, expr ) {
+	return Sizzle( expr, null, null, [node] ).length > 0;
+};
+
+Sizzle.find = function( expr, context, isXML ) {
+	var set;
+
+	if ( !expr ) {
+		return [];
+	}
+
+	for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
+		var match,
+			type = Expr.order[i];
+		
+		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+			var left = match[1];
+			match.splice( 1, 1 );
+
+			if ( left.substr( left.length - 1 ) !== "\\" ) {
+				match[1] = (match[1] || "").replace( rBackslash, "" );
+				set = Expr.find[ type ]( match, context, isXML );
+
+				if ( set != null ) {
+					expr = expr.replace( Expr.match[ type ], "" );
+					break;
+				}
+			}
+		}
+	}
+
+	if ( !set ) {
+		set = typeof context.getElementsByTagName !== "undefined" ?
+			context.getElementsByTagName( "*" ) :
+			[];
+	}
+
+	return { set: set, expr: expr };
+};
+
+Sizzle.filter = function( expr, set, inplace, not ) {
+	var match, anyFound,
+		old = expr,
+		result = [],
+		curLoop = set,
+		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
+
+	while ( expr && set.length ) {
+		for ( var type in Expr.filter ) {
+			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+				var found, item,
+					filter = Expr.filter[ type ],
+					left = match[1];
+
+				anyFound = false;
+
+				match.splice(1,1);
+
+				if ( left.substr( left.length - 1 ) === "\\" ) {
+					continue;
+				}
+
+				if ( curLoop === result ) {
+					result = [];
+				}
+
+				if ( Expr.preFilter[ type ] ) {
+					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+					if ( !match ) {
+						anyFound = found = true;
+
+					} else if ( match === true ) {
+						continue;
+					}
+				}
+
+				if ( match ) {
+					for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
+						if ( item ) {
+							found = filter( item, match, i, curLoop );
+							var pass = not ^ !!found;
+
+							if ( inplace && found != null ) {
+								if ( pass ) {
+									anyFound = true;
+
+								} else {
+									curLoop[i] = false;
+								}
+
+							} else if ( pass ) {
+								result.push( item );
+								anyFound = true;
+							}
+						}
+					}
+				}
+
+				if ( found !== undefined ) {
+					if ( !inplace ) {
+						curLoop = result;
+					}
+
+					expr = expr.replace( Expr.match[ type ], "" );
+
+					if ( !anyFound ) {
+						return [];
+					}
+
+					break;
+				}
+			}
+		}
+
+		// Improper expression
+		if ( expr === old ) {
+			if ( anyFound == null ) {
+				Sizzle.error( expr );
+
+			} else {
+				break;
+			}
+		}
+
+		old = expr;
+	}
+
+	return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+	throw "Syntax error, unrecognized expression: " + msg;
+};
+
+var Expr = Sizzle.selectors = {
+	order: [ "ID", "NAME", "TAG" ],
+
+	match: {
+		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
+		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
+		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+	},
+
+	leftMatch: {},
+
+	attrMap: {
+		"class": "className",
+		"for": "htmlFor"
+	},
+
+	attrHandle: {
+		href: function( elem ) {
+			return elem.getAttribute( "href" );
+		},
+		type: function( elem ) {
+			return elem.getAttribute( "type" );
+		}
+	},
+
+	relative: {
+		"+": function(checkSet, part){
+			var isPartStr = typeof part === "string",
+				isTag = isPartStr && !rNonWord.test( part ),
+				isPartStrNotTag = isPartStr && !isTag;
+
+			if ( isTag ) {
+				part = part.toLowerCase();
+			}
+
+			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+				if ( (elem = checkSet[i]) ) {
+					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+						elem || false :
+						elem === part;
+				}
+			}
+
+			if ( isPartStrNotTag ) {
+				Sizzle.filter( part, checkSet, true );
+			}
+		},
+
+		">": function( checkSet, part ) {
+			var elem,
+				isPartStr = typeof part === "string",
+				i = 0,
+				l = checkSet.length;
+
+			if ( isPartStr && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						var parent = elem.parentNode;
+						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+					}
+				}
+
+			} else {
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						checkSet[i] = isPartStr ?
+							elem.parentNode :
+							elem.parentNode === part;
+					}
+				}
+
+				if ( isPartStr ) {
+					Sizzle.filter( part, checkSet, true );
+				}
+			}
+		},
+
+		"": function(checkSet, part, isXML){
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
+		},
+
+		"~": function( checkSet, part, isXML ) {
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+		}
+	},
+
+	find: {
+		ID: function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+				// Check parentNode to catch when Blackberry 4.6 returns
+				// nodes that are no longer in the document #6963
+				return m && m.parentNode ? [m] : [];
+			}
+		},
+
+		NAME: function( match, context ) {
+			if ( typeof context.getElementsByName !== "undefined" ) {
+				var ret = [],
+					results = context.getElementsByName( match[1] );
+
+				for ( var i = 0, l = results.length; i < l; i++ ) {
+					if ( results[i].getAttribute("name") === match[1] ) {
+						ret.push( results[i] );
+					}
+				}
+
+				return ret.length === 0 ? null : ret;
+			}
+		},
+
+		TAG: function( match, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( match[1] );
+			}
+		}
+	},
+	preFilter: {
+		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+			match = " " + match[1].replace( rBackslash, "" ) + " ";
+
+			if ( isXML ) {
+				return match;
+			}
+
+			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+				if ( elem ) {
+					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
+						if ( !inplace ) {
+							result.push( elem );
+						}
+
+					} else if ( inplace ) {
+						curLoop[i] = false;
+					}
+				}
+			}
+
+			return false;
+		},
+
+		ID: function( match ) {
+			return match[1].replace( rBackslash, "" );
+		},
+
+		TAG: function( match, curLoop ) {
+			return match[1].replace( rBackslash, "" ).toLowerCase();
+		},
+
+		CHILD: function( match ) {
+			if ( match[1] === "nth" ) {
+				if ( !match[2] ) {
+					Sizzle.error( match[0] );
+				}
+
+				match[2] = match[2].replace(/^\+|\s*/g, '');
+
+				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
+					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+				// calculate the numbers (first)n+(last) including if they are negative
+				match[2] = (test[1] + (test[2] || 1)) - 0;
+				match[3] = test[3] - 0;
+			}
+			else if ( match[2] ) {
+				Sizzle.error( match[0] );
+			}
+
+			// TODO: Move to normal caching system
+			match[0] = done++;
+
+			return match;
+		},
+
+		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+			var name = match[1] = match[1].replace( rBackslash, "" );
+			
+			if ( !isXML && Expr.attrMap[name] ) {
+				match[1] = Expr.attrMap[name];
+			}
+
+			// Handle if an un-quoted value was used
+			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
+
+			if ( match[2] === "~=" ) {
+				match[4] = " " + match[4] + " ";
+			}
+
+			return match;
+		},
+
+		PSEUDO: function( match, curLoop, inplace, result, not ) {
+			if ( match[1] === "not" ) {
+				// If we're dealing with a complex expression, or a simple one
+				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+					match[3] = Sizzle(match[3], null, null, curLoop);
+
+				} else {
+					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+
+					if ( !inplace ) {
+						result.push.apply( result, ret );
+					}
+
+					return false;
+				}
+
+			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+				return true;
+			}
+			
+			return match;
+		},
+
+		POS: function( match ) {
+			match.unshift( true );
+
+			return match;
+		}
+	},
+	
+	filters: {
+		enabled: function( elem ) {
+			return elem.disabled === false && elem.type !== "hidden";
+		},
+
+		disabled: function( elem ) {
+			return elem.disabled === true;
+		},
+
+		checked: function( elem ) {
+			return elem.checked === true;
+		},
+		
+		selected: function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+			
+			return elem.selected === true;
+		},
+
+		parent: function( elem ) {
+			return !!elem.firstChild;
+		},
+
+		empty: function( elem ) {
+			return !elem.firstChild;
+		},
+
+		has: function( elem, i, match ) {
+			return !!Sizzle( match[3], elem ).length;
+		},
+
+		header: function( elem ) {
+			return (/h\d/i).test( elem.nodeName );
+		},
+
+		text: function( elem ) {
+			var attr = elem.getAttribute( "type" ), type = elem.type;
+			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 
+			// use getAttribute instead to test this case
+			return "text" === type && ( attr === type || attr === null );
+		},
+
+		radio: function( elem ) {
+			return "radio" === elem.type;
+		},
+
+		checkbox: function( elem ) {
+			return "checkbox" === elem.type;
+		},
+
+		file: function( elem ) {
+			return "file" === elem.type;
+		},
+		password: function( elem ) {
+			return "password" === elem.type;
+		},
+
+		submit: function( elem ) {
+			return "submit" === elem.type;
+		},
+
+		image: function( elem ) {
+			return "image" === elem.type;
+		},
+
+		reset: function( elem ) {
+			return "reset" === elem.type;
+		},
+
+		button: function( elem ) {
+			return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
+		},
+
+		input: function( elem ) {
+			return (/input|select|textarea|button/i).test( elem.nodeName );
+		}
+	},
+	setFilters: {
+		first: function( elem, i ) {
+			return i === 0;
+		},
+
+		last: function( elem, i, match, array ) {
+			return i === array.length - 1;
+		},
+
+		even: function( elem, i ) {
+			return i % 2 === 0;
+		},
+
+		odd: function( elem, i ) {
+			return i % 2 === 1;
+		},
+
+		lt: function( elem, i, match ) {
+			return i < match[3] - 0;
+		},
+
+		gt: function( elem, i, match ) {
+			return i > match[3] - 0;
+		},
+
+		nth: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		},
+
+		eq: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		}
+	},
+	filter: {
+		PSEUDO: function( elem, match, i, array ) {
+			var name = match[1],
+				filter = Expr.filters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+
+			} else if ( name === "contains" ) {
+				return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
+			} else if ( name === "not" ) {
+				var not = match[3];
+
+				for ( var j = 0, l = not.length; j < l; j++ ) {
+					if ( not[j] === elem ) {
+						return false;
+					}
+				}
+
+				return true;
+
+			} else {
+				Sizzle.error( name );
+			}
+		},
+
+		CHILD: function( elem, match ) {
+			var type = match[1],
+				node = elem;
+
+			switch ( type ) {
+				case "only":
+				case "first":
+					while ( (node = node.previousSibling) )	 {
+						if ( node.nodeType === 1 ) { 
+							return false; 
+						}
+					}
+
+					if ( type === "first" ) { 
+						return true; 
+					}
+
+					node = elem;
+
+				case "last":
+					while ( (node = node.nextSibling) )	 {
+						if ( node.nodeType === 1 ) { 
+							return false; 
+						}
+					}
+
+					return true;
+
+				case "nth":
+					var first = match[2],
+						last = match[3];
+
+					if ( first === 1 && last === 0 ) {
+						return true;
+					}
+					
+					var doneName = match[0],
+						parent = elem.parentNode;
+	
+					if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
+						var count = 0;
+						
+						for ( node = parent.firstChild; node; node = node.nextSibling ) {
+							if ( node.nodeType === 1 ) {
+								node.nodeIndex = ++count;
+							}
+						} 
+
+						parent.sizcache = doneName;
+					}
+					
+					var diff = elem.nodeIndex - last;
+
+					if ( first === 0 ) {
+						return diff === 0;
+
+					} else {
+						return ( diff % first === 0 && diff / first >= 0 );
+					}
+			}
+		},
+
+		ID: function( elem, match ) {
+			return elem.nodeType === 1 && elem.getAttribute("id") === match;
+		},
+
+		TAG: function( elem, match ) {
+			return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
+		},
+		
+		CLASS: function( elem, match ) {
+			return (" " + (elem.className || elem.getAttribute("class")) + " ")
+				.indexOf( match ) > -1;
+		},
+
+		ATTR: function( elem, match ) {
+			var name = match[1],
+				result = Expr.attrHandle[ name ] ?
+					Expr.attrHandle[ name ]( elem ) :
+					elem[ name ] != null ?
+						elem[ name ] :
+						elem.getAttribute( name ),
+				value = result + "",
+				type = match[2],
+				check = match[4];
+
+			return result == null ?
+				type === "!=" :
+				type === "=" ?
+				value === check :
+				type === "*=" ?
+				value.indexOf(check) >= 0 :
+				type === "~=" ?
+				(" " + value + " ").indexOf(check) >= 0 :
+				!check ?
+				value && result !== false :
+				type === "!=" ?
+				value !== check :
+				type === "^=" ?
+				value.indexOf(check) === 0 :
+				type === "$=" ?
+				value.substr(value.length - check.length) === check :
+				type === "|=" ?
+				value === check || value.substr(0, check.length + 1) === check + "-" :
+				false;
+		},
+
+		POS: function( elem, match, i, array ) {
+			var name = match[2],
+				filter = Expr.setFilters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+			}
+		}
+	}
+};
+
+var origPOS = Expr.match.POS,
+	fescape = function(all, num){
+		return "\\" + (num - 0 + 1);
+	};
+
+for ( var type in Expr.match ) {
+	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+}
+
+var makeArray = function( array, results ) {
+	array = Array.prototype.slice.call( array, 0 );
+
+	if ( results ) {
+		results.push.apply( results, array );
+		return results;
+	}
+	
+	return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch( e ) {
+	makeArray = function( array, results ) {
+		var i = 0,
+			ret = results || [];
+
+		if ( toString.call(array) === "[object Array]" ) {
+			Array.prototype.push.apply( ret, array );
+
+		} else {
+			if ( typeof array.length === "number" ) {
+				for ( var l = array.length; i < l; i++ ) {
+					ret.push( array[i] );
+				}
+
+			} else {
+				for ( ; array[i]; i++ ) {
+					ret.push( array[i] );
+				}
+			}
+		}
+
+		return ret;
+	};
+}
+
+var sortOrder, siblingCheck;
+
+if ( document.documentElement.compareDocumentPosition ) {
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+			return a.compareDocumentPosition ? -1 : 1;
+		}
+
+		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+	};
+
+} else {
+	sortOrder = function( a, b ) {
+		var al, bl,
+			ap = [],
+			bp = [],
+			aup = a.parentNode,
+			bup = b.parentNode,
+			cur = aup;
+
+		// The nodes are identical, we can exit early
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// If the nodes are siblings (or identical) we can do a quick check
+		} else if ( aup === bup ) {
+			return siblingCheck( a, b );
+
+		// If no parents were found then the nodes are disconnected
+		} else if ( !aup ) {
+			return -1;
+
+		} else if ( !bup ) {
+			return 1;
+		}
+
+		// Otherwise they're somewhere else in the tree so we need
+		// to build up a full list of the parentNodes for comparison
+		while ( cur ) {
+			ap.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		cur = bup;
+
+		while ( cur ) {
+			bp.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		al = ap.length;
+		bl = bp.length;
+
+		// Start walking down the tree looking for a discrepancy
+		for ( var i = 0; i < al && i < bl; i++ ) {
+			if ( ap[i] !== bp[i] ) {
+				return siblingCheck( ap[i], bp[i] );
+			}
+		}
+
+		// We ended someplace up the tree so do a sibling check
+		return i === al ?
+			siblingCheck( a, bp[i], -1 ) :
+			siblingCheck( ap[i], b, 1 );
+	};
+
+	siblingCheck = function( a, b, ret ) {
+		if ( a === b ) {
+			return ret;
+		}
+
+		var cur = a.nextSibling;
+
+		while ( cur ) {
+			if ( cur === b ) {
+				return -1;
+			}
+
+			cur = cur.nextSibling;
+		}
+
+		return 1;
+	};
+}
+
+// Utility function for retreiving the text value of an array of DOM nodes
+Sizzle.getText = function( elems ) {
+	var ret = "", elem;
+
+	for ( var i = 0; elems[i]; i++ ) {
+		elem = elems[i];
+
+		// Get the text from text nodes and CDATA nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
+			ret += elem.nodeValue;
+
+		// Traverse everything else, except comment nodes
+		} else if ( elem.nodeType !== 8 ) {
+			ret += Sizzle.getText( elem.childNodes );
+		}
+	}
+
+	return ret;
+};
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+	// We're going to inject a fake input element with a specified name
+	var form = document.createElement("div"),
+		id = "script" + (new Date()).getTime(),
+		root = document.documentElement;
+
+	form.innerHTML = "<a name='" + id + "'/>";
+
+	// Inject it into the root element, check its status, and remove it quickly
+	root.insertBefore( form, root.firstChild );
+
+	// The workaround has to do additional checks after a getElementById
+	// Which slows things down for other browsers (hence the branching)
+	if ( document.getElementById( id ) ) {
+		Expr.find.ID = function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+
+				return m ?
+					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+						[m] :
+						undefined :
+					[];
+			}
+		};
+
+		Expr.filter.ID = function( elem, match ) {
+			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+
+			return elem.nodeType === 1 && node && node.nodeValue === match;
+		};
+	}
+
+	root.removeChild( form );
+
+	// release memory in IE
+	root = form = null;
+})();
+
+(function(){
+	// Check to see if the browser returns only elements
+	// when doing getElementsByTagName("*")
+
+	// Create a fake element
+	var div = document.createElement("div");
+	div.appendChild( document.createComment("") );
+
+	// Make sure no comments are found
+	if ( div.getElementsByTagName("*").length > 0 ) {
+		Expr.find.TAG = function( match, context ) {
+			var results = context.getElementsByTagName( match[1] );
+
+			// Filter out possible comments
+			if ( match[1] === "*" ) {
+				var tmp = [];
+
+				for ( var i = 0; results[i]; i++ ) {
+					if ( results[i].nodeType === 1 ) {
+						tmp.push( results[i] );
+					}
+				}
+
+				results = tmp;
+			}
+
+			return results;
+		};
+	}
+
+	// Check to see if an attribute returns normalized href attributes
+	div.innerHTML = "<a href='#'></a>";
+
+	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+			div.firstChild.getAttribute("href") !== "#" ) {
+
+		Expr.attrHandle.href = function( elem ) {
+			return elem.getAttribute( "href", 2 );
+		};
+	}
+
+	// release memory in IE
+	div = null;
+})();
+
+if ( document.querySelectorAll ) {
+	(function(){
+		var oldSizzle = Sizzle,
+			div = document.createElement("div"),
+			id = "__sizzle__";
+
+		div.innerHTML = "<p class='TEST'></p>";
+
+		// Safari can't handle uppercase or unicode characters when
+		// in quirks mode.
+		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+			return;
+		}
+	
+		Sizzle = function( query, context, extra, seed ) {
+			context = context || document;
+
+			// Only use querySelectorAll on non-XML documents
+			// (ID selectors don't work in non-HTML documents)
+			if ( !seed && !Sizzle.isXML(context) ) {
+				// See if we find a selector to speed up
+				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
+				
+				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
+					// Speed-up: Sizzle("TAG")
+					if ( match[1] ) {
+						return makeArray( context.getElementsByTagName( query ), extra );
+					
+					// Speed-up: Sizzle(".CLASS")
+					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
+						return makeArray( context.getElementsByClassName( match[2] ), extra );
+					}
+				}
+				
+				if ( context.nodeType === 9 ) {
+					// Speed-up: Sizzle("body")
+					// The body element only exists once, optimize finding it
+					if ( query === "body" && context.body ) {
+						return makeArray( [ context.body ], extra );
+						
+					// Speed-up: Sizzle("#ID")
+					} else if ( match && match[3] ) {
+						var elem = context.getElementById( match[3] );
+
+						// Check parentNode to catch when Blackberry 4.6 returns
+						// nodes that are no longer in the document #6963
+						if ( elem && elem.parentNode ) {
+							// Handle the case where IE and Opera return items
+							// by name instead of ID
+							if ( elem.id === match[3] ) {
+								return makeArray( [ elem ], extra );
+							}
+							
+						} else {
+							return makeArray( [], extra );
+						}
+					}
+					
+					try {
+						return makeArray( context.querySelectorAll(query), extra );
+					} catch(qsaError) {}
+
+				// qSA works strangely on Element-rooted queries
+				// We can work around this by specifying an extra ID on the root
+				// and working up from there (Thanks to Andrew Dupont for the technique)
+				// IE 8 doesn't work on object elements
+				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+					var oldContext = context,
+						old = context.getAttribute( "id" ),
+						nid = old || id,
+						hasParent = context.parentNode,
+						relativeHierarchySelector = /^\s*[+~]/.test( query );
+
+					if ( !old ) {
+						context.setAttribute( "id", nid );
+					} else {
+						nid = nid.replace( /'/g, "\\$&" );
+					}
+					if ( relativeHierarchySelector && hasParent ) {
+						context = context.parentNode;
+					}
+
+					try {
+						if ( !relativeHierarchySelector || hasParent ) {
+							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
+						}
+
+					} catch(pseudoError) {
+					} finally {
+						if ( !old ) {
+							oldContext.removeAttribute( "id" );
+						}
+					}
+				}
+			}
+		
+			return oldSizzle(query, context, extra, seed);
+		};
+
+		for ( var prop in oldSizzle ) {
+			Sizzle[ prop ] = oldSizzle[ prop ];
+		}
+
+		// release memory in IE
+		div = null;
+	})();
+}
+
+(function(){
+	var html = document.documentElement,
+		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
+
+	if ( matches ) {
+		// Check to see if it's possible to do matchesSelector
+		// on a disconnected node (IE 9 fails this)
+		var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
+			pseudoWorks = false;
+
+		try {
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( document.documentElement, "[test!='']:sizzle" );
+	
+		} catch( pseudoError ) {
+			pseudoWorks = true;
+		}
+
+		Sizzle.matchesSelector = function( node, expr ) {
+			// Make sure that attribute selectors are quoted
+			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+			if ( !Sizzle.isXML( node ) ) {
+				try { 
+					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+						var ret = matches.call( node, expr );
+
+						// IE 9's matchesSelector returns false on disconnected nodes
+						if ( ret || !disconnectedMatch ||
+								// As well, disconnected nodes are said to be in a document
+								// fragment in IE 9, so check for that
+								node.document && node.document.nodeType !== 11 ) {
+							return ret;
+						}
+					}
+				} catch(e) {}
+			}
+
+			return Sizzle(expr, null, null, [node]).length > 0;
+		};
+	}
+})();
+
+(function(){
+	var div = document.createElement("div");
+
+	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+	// Opera can't find a second classname (in 9.6)
+	// Also, make sure that getElementsByClassName actually exists
+	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+		return;
+	}
+
+	// Safari caches class attributes, doesn't catch changes (in 3.2)
+	div.lastChild.className = "e";
+
+	if ( div.getElementsByClassName("e").length === 1 ) {
+		return;
+	}
+	
+	Expr.order.splice(1, 0, "CLASS");
+	Expr.find.CLASS = function( match, context, isXML ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+			return context.getElementsByClassName(match[1]);
+		}
+	};
+
+	// release memory in IE
+	div = null;
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem.sizcache === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 && !isXML ){
+					elem.sizcache = doneName;
+					elem.sizset = i;
+				}
+
+				if ( elem.nodeName.toLowerCase() === cur ) {
+					match = elem;
+					break;
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+			
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem.sizcache === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 ) {
+					if ( !isXML ) {
+						elem.sizcache = doneName;
+						elem.sizset = i;
+					}
+
+					if ( typeof cur !== "string" ) {
+						if ( elem === cur ) {
+							match = true;
+							break;
+						}
+
+					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+						match = elem;
+						break;
+					}
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+if ( document.documentElement.contains ) {
+	Sizzle.contains = function( a, b ) {
+		return a !== b && (a.contains ? a.contains(b) : true);
+	};
+
+} else if ( document.documentElement.compareDocumentPosition ) {
+	Sizzle.contains = function( a, b ) {
+		return !!(a.compareDocumentPosition(b) & 16);
+	};
+
+} else {
+	Sizzle.contains = function() {
+		return false;
+	};
+}
+
+Sizzle.isXML = function( elem ) {
+	// documentElement is verified for cases where it doesn't yet exist
+	// (such as loading iframes in IE - #4833) 
+	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function( selector, context ) {
+	var match,
+		tmpSet = [],
+		later = "",
+		root = context.nodeType ? [context] : context;
+
+	// Position selectors must be done after the filter
+	// And so must :not(positional) so we move all PSEUDOs to the end
+	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+		later += match[0];
+		selector = selector.replace( Expr.match.PSEUDO, "" );
+	}
+
+	selector = Expr.relative[selector] ? selector + "*" : selector;
+
+	for ( var i = 0, l = root.length; i < l; i++ ) {
+		Sizzle( selector, root[i], tmpSet );
+	}
+
+	return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})();
+
+
+var runtil = /Until$/,
+	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+	// Note: This RegExp should be improved, or likely pulled from Sizzle
+	rmultiselector = /,/,
+	isSimple = /^.[^:#\[\.,]*$/,
+	slice = Array.prototype.slice,
+	POS = jQuery.expr.match.POS,
+	// methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend({
+	find: function( selector ) {
+		var ret = this.pushStack( "", "find", selector ),
+			length = 0;
+
+		for ( var i = 0, l = this.length; i < l; i++ ) {
+			length = ret.length;
+			jQuery.find( selector, this[i], ret );
+
+			if ( i > 0 ) {
+				// Make sure that the results are unique
+				for ( var n = length; n < ret.length; n++ ) {
+					for ( var r = 0; r < length; r++ ) {
+						if ( ret[r] === ret[n] ) {
+							ret.splice(n--, 1);
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	has: function( target ) {
+		var targets = jQuery( target );
+		return this.filter(function() {
+			for ( var i = 0, l = targets.length; i < l; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector, false), "not", selector);
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector, true), "filter", selector );
+	},
+
+	is: function( selector ) {
+		return !!selector && jQuery.filter( selector, this ).length > 0;
+	},
+
+	closest: function( selectors, context ) {
+		var ret = [], i, l, cur = this[0];
+
+		if ( jQuery.isArray( selectors ) ) {
+			var match, selector,
+				matches = {},
+				level = 1;
+
+			if ( cur && selectors.length ) {
+				for ( i = 0, l = selectors.length; i < l; i++ ) {
+					selector = selectors[i];
+
+					if ( !matches[selector] ) {
+						matches[selector] = jQuery.expr.match.POS.test( selector ) ?
+							jQuery( selector, context || this.context ) :
+							selector;
+					}
+				}
+
+				while ( cur && cur.ownerDocument && cur !== context ) {
+					for ( selector in matches ) {
+						match = matches[selector];
+
+						if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
+							ret.push({ selector: selector, elem: cur, level: level });
+						}
+					}
+
+					cur = cur.parentNode;
+					level++;
+				}
+			}
+
+			return ret;
+		}
+
+		var pos = POS.test( selectors ) ?
+			jQuery( selectors, context || this.context ) : null;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			cur = this[i];
+
+			while ( cur ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+					ret.push( cur );
+					break;
+
+				} else {
+					cur = cur.parentNode;
+					if ( !cur || !cur.ownerDocument || cur === context ) {
+						break;
+					}
+				}
+			}
+		}
+
+		ret = ret.length > 1 ? jQuery.unique(ret) : ret;
+
+		return this.pushStack( ret, "closest", selectors );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	index: function( elem ) {
+		if ( !elem || typeof elem === "string" ) {
+			return jQuery.inArray( this[0],
+				// If it receives a string, the selector is used
+				// If it receives nothing, the siblings are used
+				elem ? jQuery( elem ) : this.parent().children() );
+		}
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	add: function( selector, context ) {
+		var set = typeof selector === "string" ?
+				jQuery( selector, context ) :
+				jQuery.makeArray( selector ),
+			all = jQuery.merge( this.get(), set );
+
+		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+			all :
+			jQuery.unique( all ) );
+	},
+
+	andSelf: function() {
+		return this.add( this.prevObject );
+	}
+});
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+	return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+jQuery.each({
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return jQuery.dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return jQuery.nth( elem, 2, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return jQuery.nth( elem, 2, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return jQuery.dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return jQuery.dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return jQuery.sibling( elem.parentNode.firstChild, elem );
+	},
+	children: function( elem ) {
+		return jQuery.sibling( elem.firstChild );
+	},
+	contents: function( elem ) {
+		return jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.makeArray( elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until ),
+			// The variable 'args' was introduced in
+			// https://github.com/jquery/jquery/commit/52a0238
+			// to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
+			// http://code.google.com/p/v8/issues/detail?id=1050
+			args = slice.call(arguments);
+
+		if ( !runtil.test( name ) ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+			ret = ret.reverse();
+		}
+
+		return this.pushStack( ret, name, args.join(",") );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 ?
+			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+			jQuery.find.matches(expr, elems);
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	nth: function( cur, result, dir, elem ) {
+		result = result || 1;
+		var num = 0;
+
+		for ( ; cur; cur = cur[dir] ) {
+			if ( cur.nodeType === 1 && ++num === result ) {
+				break;
+			}
+		}
+
+		return cur;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			var retVal = !!qualifier.call( elem, i, elem );
+			return retVal === keep;
+		});
+
+	} else if ( qualifier.nodeType ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			return (elem === qualifier) === keep;
+		});
+
+	} else if ( typeof qualifier === "string" ) {
+		var filtered = jQuery.grep(elements, function( elem ) {
+			return elem.nodeType === 1;
+		});
+
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter(qualifier, filtered, !keep);
+		} else {
+			qualifier = jQuery.filter( qualifier, filtered );
+		}
+	}
+
+	return jQuery.grep(elements, function( elem, i ) {
+		return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
+	});
+}
+
+
+
+
+var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnocache = /<(?:script|object|embed|option|style)/i,
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		area: [ 1, "<map>", "</map>" ],
+		_default: [ 0, "", "" ]
+	};
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+	wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+	text: function( text ) {
+		if ( jQuery.isFunction(text) ) {
+			return this.each(function(i) {
+				var self = jQuery( this );
+
+				self.text( text.call(this, i, self.text()) );
+			});
+		}
+
+		if ( typeof text !== "object" && text !== undefined ) {
+			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+		}
+
+		return jQuery.text( this );
+	},
+
+	wrapAll: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapAll( html.call(this, i) );
+			});
+		}
+
+		if ( this[0] ) {
+			// The elements to wrap the target around
+			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+			if ( this[0].parentNode ) {
+				wrap.insertBefore( this[0] );
+			}
+
+			wrap.map(function() {
+				var elem = this;
+
+				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				return elem;
+			}).append(this);
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapInner( html.call(this, i) );
+			});
+		}
+
+		return this.each(function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		});
+	},
+
+	wrap: function( html ) {
+		return this.each(function() {
+			jQuery( this ).wrapAll( html );
+		});
+	},
+
+	unwrap: function() {
+		return this.parent().each(function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		}).end();
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this );
+			});
+		} else if ( arguments.length ) {
+			var set = jQuery(arguments[0]);
+			set.push.apply( set, this.toArray() );
+			return this.pushStack( set, "before", arguments );
+		}
+	},
+
+	after: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			});
+		} else if ( arguments.length ) {
+			var set = this.pushStack( this, "after", arguments );
+			set.push.apply( set, jQuery(arguments[0]).toArray() );
+			return set;
+		}
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+				if ( !keepData && elem.nodeType === 1 ) {
+					jQuery.cleanData( elem.getElementsByTagName("*") );
+					jQuery.cleanData( [ elem ] );
+				}
+
+				if ( elem.parentNode ) {
+					elem.parentNode.removeChild( elem );
+				}
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( elem.getElementsByTagName("*") );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function () {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		});
+	},
+
+	html: function( value ) {
+		if ( value === undefined ) {
+			return this[0] && this[0].nodeType === 1 ?
+				this[0].innerHTML.replace(rinlinejQuery, "") :
+				null;
+
+		// See if we can take a shortcut and just use innerHTML
+		} else if ( typeof value === "string" && !rnocache.test( value ) &&
+			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
+			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
+
+			value = value.replace(rxhtmlTag, "<$1></$2>");
+
+			try {
+				for ( var i = 0, l = this.length; i < l; i++ ) {
+					// Remove element nodes and prevent memory leaks
+					if ( this[i].nodeType === 1 ) {
+						jQuery.cleanData( this[i].getElementsByTagName("*") );
+						this[i].innerHTML = value;
+					}
+				}
+
+			// If using innerHTML throws an exception, use the fallback method
+			} catch(e) {
+				this.empty().append( value );
+			}
+
+		} else if ( jQuery.isFunction( value ) ) {
+			this.each(function(i){
+				var self = jQuery( this );
+
+				self.html( value.call(this, i, self.html()) );
+			});
+
+		} else {
+			this.empty().append( value );
+		}
+
+		return this;
+	},
+
+	replaceWith: function( value ) {
+		if ( this[0] && this[0].parentNode ) {
+			// Make sure that the elements are removed from the DOM before they are inserted
+			// this can help fix replacing a parent with child elements
+			if ( jQuery.isFunction( value ) ) {
+				return this.each(function(i) {
+					var self = jQuery(this), old = self.html();
+					self.replaceWith( value.call( this, i, old ) );
+				});
+			}
+
+			if ( typeof value !== "string" ) {
+				value = jQuery( value ).detach();
+			}
+
+			return this.each(function() {
+				var next = this.nextSibling,
+					parent = this.parentNode;
+
+				jQuery( this ).remove();
+
+				if ( next ) {
+					jQuery(next).before( value );
+				} else {
+					jQuery(parent).append( value );
+				}
+			});
+		} else {
+			return this.length ?
+				this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+				this;
+		}
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, table, callback ) {
+		var results, first, fragment, parent,
+			value = args[0],
+			scripts = [];
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+			return this.each(function() {
+				jQuery(this).domManip( args, table, callback, true );
+			});
+		}
+
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				args[0] = value.call(this, i, table ? self.html() : undefined);
+				self.domManip( args, table, callback );
+			});
+		}
+
+		if ( this[0] ) {
+			parent = value && value.parentNode;
+
+			// If we're in a fragment, just use that instead of building a new one
+			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+				results = { fragment: parent };
+
+			} else {
+				results = jQuery.buildFragment( args, this, scripts );
+			}
+
+			fragment = results.fragment;
+
+			if ( fragment.childNodes.length === 1 ) {
+				first = fragment = fragment.firstChild;
+			} else {
+				first = fragment.firstChild;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+
+				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
+					callback.call(
+						table ?
+							root(this[i], first) :
+							this[i],
+						// Make sure that we do not leak memory by inadvertently discarding
+						// the original fragment (which might have attached data) instead of
+						// using it; in addition, use the original fragment object for the last
+						// item instead of first because it can end up being emptied incorrectly
+						// in certain situations (Bug #8070).
+						// Fragments from the fragment cache must always be cloned and never used
+						// in place.
+						results.cacheable || (l > 1 && i < lastIndex) ?
+							jQuery.clone( fragment, true, true ) :
+							fragment
+					);
+				}
+			}
+
+			if ( scripts.length ) {
+				jQuery.each( scripts, evalScript );
+			}
+		}
+
+		return this;
+	}
+});
+
+function root( elem, cur ) {
+	return jQuery.nodeName(elem, "table") ?
+		(elem.getElementsByTagName("tbody")[0] ||
+		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+		elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var internalKey = jQuery.expando,
+		oldData = jQuery.data( src ),
+		curData = jQuery.data( dest, oldData );
+
+	// Switch to use the internal data object, if it exists, for the next
+	// stage of data copying
+	if ( (oldData = oldData[ internalKey ]) ) {
+		var events = oldData.events;
+				curData = curData[ internalKey ] = jQuery.extend({}, oldData);
+
+		if ( events ) {
+			delete curData.handle;
+			curData.events = {};
+
+			for ( var type in events ) {
+				for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
+					jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
+				}
+			}
+		}
+	}
+}
+
+function cloneFixAttributes(src, dest) {
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	var nodeName = dest.nodeName.toLowerCase();
+
+	// clearAttributes removes the attributes, which we don't want,
+	// but also removes the attachEvent events, which we *do* want
+	dest.clearAttributes();
+
+	// mergeAttributes, in contrast, only merges back on the
+	// original attributes, not the events
+	dest.mergeAttributes(src);
+
+	// IE6-8 fail to clone children inside object elements that use
+	// the proprietary classid attribute value (rather than the type
+	// attribute) to identify the type of content to display
+	if ( nodeName === "object" ) {
+		dest.outerHTML = src.outerHTML;
+
+	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+		if ( src.checked ) {
+			dest.defaultChecked = dest.checked = src.checked;
+		}
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+
+	// Event data gets referenced instead of copied if the expando
+	// gets copied too
+	dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, nodes, scripts ) {
+	var fragment, cacheable, cacheresults,
+		doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
+
+	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+	// Cloning options loses the selected state, so don't cache them
+	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+	if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
+		args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
+
+		cacheable = true;
+		cacheresults = jQuery.fragments[ args[0] ];
+		if ( cacheresults ) {
+			if ( cacheresults !== 1 ) {
+				fragment = cacheresults;
+			}
+		}
+	}
+
+	if ( !fragment ) {
+		fragment = doc.createDocumentFragment();
+		jQuery.clean( args, doc, fragment, scripts );
+	}
+
+	if ( cacheable ) {
+		jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
+	}
+
+	return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var ret = [],
+			insert = jQuery( selector ),
+			parent = this.length === 1 && this[0].parentNode;
+
+		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+			insert[ original ]( this[0] );
+			return this;
+
+		} else {
+			for ( var i = 0, l = insert.length; i < l; i++ ) {
+				var elems = (i > 0 ? this.clone(true) : this).get();
+				jQuery( insert[i] )[ original ]( elems );
+				ret = ret.concat( elems );
+			}
+
+			return this.pushStack( ret, name, insert.selector );
+		}
+	};
+});
+
+function getAll( elem ) {
+	if ( "getElementsByTagName" in elem ) {
+		return elem.getElementsByTagName( "*" );
+	
+	} else if ( "querySelectorAll" in elem ) {
+		return elem.querySelectorAll( "*" );
+
+	} else {
+		return [];
+	}
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var clone = elem.cloneNode(true),
+				srcElements,
+				destElements,
+				i;
+
+		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+			// IE copies events bound via attachEvent when using cloneNode.
+			// Calling detachEvent on the clone will also remove the events
+			// from the original. In order to get around this, we use some
+			// proprietary methods to clear the events. Thanks to MooTools
+			// guys for this hotness.
+
+			cloneFixAttributes( elem, clone );
+
+			// Using Sizzle here is crazy slow, so we use getElementsByTagName
+			// instead
+			srcElements = getAll( elem );
+			destElements = getAll( clone );
+
+			// Weird iteration because IE will replace the length property
+			// with an element if you are cloning the body and one of the
+			// elements on the page has a name or id of "length"
+			for ( i = 0; srcElements[i]; ++i ) {
+				cloneFixAttributes( srcElements[i], destElements[i] );
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			cloneCopyEvent( elem, clone );
+
+			if ( deepDataAndEvents ) {
+				srcElements = getAll( elem );
+				destElements = getAll( clone );
+
+				for ( i = 0; srcElements[i]; ++i ) {
+					cloneCopyEvent( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		// Return the cloned set
+		return clone;
+},
+	clean: function( elems, context, fragment, scripts ) {
+		context = context || document;
+
+		// !context.createElement fails in IE with an error but returns typeof 'object'
+		if ( typeof context.createElement === "undefined" ) {
+			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+		}
+
+		var ret = [];
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( typeof elem === "number" ) {
+				elem += "";
+			}
+
+			if ( !elem ) {
+				continue;
+			}
+
+			// Convert html string into DOM nodes
+			if ( typeof elem === "string" && !rhtml.test( elem ) ) {
+				elem = context.createTextNode( elem );
+
+			} else if ( typeof elem === "string" ) {
+				// Fix "XHTML"-style tags in all browsers
+				elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+				// Trim whitespace, otherwise indexOf won't work as expected
+				var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
+					wrap = wrapMap[ tag ] || wrapMap._default,
+					depth = wrap[0],
+					div = context.createElement("div");
+
+				// Go to html and back, then peel off extra wrappers
+				div.innerHTML = wrap[1] + elem + wrap[2];
+
+				// Move to the right depth
+				while ( depth-- ) {
+					div = div.lastChild;
+				}
+
+				// Remove IE's autoinserted <tbody> from table fragments
+				if ( !jQuery.support.tbody ) {
+
+					// String was a <table>, *may* have spurious <tbody>
+					var hasBody = rtbody.test(elem),
+						tbody = tag === "table" && !hasBody ?
+							div.firstChild && div.firstChild.childNodes :
+
+							// String was a bare <thead> or <tfoot>
+							wrap[1] === "<table>" && !hasBody ?
+								div.childNodes :
+								[];
+
+					for ( var j = tbody.length - 1; j >= 0 ; --j ) {
+						if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+							tbody[ j ].parentNode.removeChild( tbody[ j ] );
+						}
+					}
+
+				}
+
+				// IE completely kills leading whitespace when innerHTML is used
+				if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+					div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+				}
+
+				elem = div.childNodes;
+			}
+
+			if ( elem.nodeType ) {
+				ret.push( elem );
+			} else {
+				ret = jQuery.merge( ret, elem );
+			}
+		}
+
+		if ( fragment ) {
+			for ( i = 0; ret[i]; i++ ) {
+				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
+					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+
+				} else {
+					if ( ret[i].nodeType === 1 ) {
+						ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
+					}
+					fragment.appendChild( ret[i] );
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	cleanData: function( elems ) {
+		var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
+			deleteExpando = jQuery.support.deleteExpando;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+				continue;
+			}
+
+			id = elem[ jQuery.expando ];
+
+			if ( id ) {
+				data = cache[ id ] && cache[ id ][ internalKey ];
+
+				if ( data && data.events ) {
+					for ( var type in data.events ) {
+						if ( special[ type ] ) {
+							jQuery.event.remove( elem, type );
+
+						// This is a shortcut to avoid jQuery.event.remove's overhead
+						} else {
+							jQuery.removeEvent( elem, type, data.handle );
+						}
+					}
+
+					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
+					if ( data.handle ) {
+						data.handle.elem = null;
+					}
+				}
+
+				if ( deleteExpando ) {
+					delete elem[ jQuery.expando ];
+
+				} else if ( elem.removeAttribute ) {
+					elem.removeAttribute( jQuery.expando );
+				}
+
+				delete cache[ id ];
+			}
+		}
+	}
+});
+
+function evalScript( i, elem ) {
+	if ( elem.src ) {
+		jQuery.ajax({
+			url: elem.src,
+			async: false,
+			dataType: "script"
+		});
+	} else {
+		jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
+	}
+
+	if ( elem.parentNode ) {
+		elem.parentNode.removeChild( elem );
+	}
+}
+
+
+
+
+var ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity=([^)]*)/,
+	rdashAlpha = /-([a-z])/ig,
+	// fixed for IE9, see #8346
+	rupper = /([A-Z]|^ms)/g,
+	rnumpx = /^-?\d+(?:px)?$/i,
+	rnum = /^-?\d/,
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssWidth = [ "Left", "Right" ],
+	cssHeight = [ "Top", "Bottom" ],
+	curCSS,
+
+	getComputedStyle,
+	currentStyle,
+
+	fcamelCase = function( all, letter ) {
+		return letter.toUpperCase();
+	};
+
+jQuery.fn.css = function( name, value ) {
+	// Setting 'undefined' is a no-op
+	if ( arguments.length === 2 && value === undefined ) {
+		return this;
+	}
+
+	return jQuery.access( this, name, value, true, function( elem, name, value ) {
+		return value !== undefined ?
+			jQuery.style( elem, name, value ) :
+			jQuery.css( elem, name );
+	});
+};
+
+jQuery.extend({
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity", "opacity" );
+					return ret === "" ? "1" : ret;
+
+				} else {
+					return elem.style.opacity;
+				}
+			}
+		}
+	},
+
+	// Exclude the following css properties to add px
+	cssNumber: {
+		"zIndex": true,
+		"fontWeight": true,
+		"opacity": true,
+		"zoom": true,
+		"lineHeight": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+		// normalize float css property
+		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, origName = jQuery.camelCase( name ),
+			style = elem.style, hooks = jQuery.cssHooks[ origName ];
+
+		name = jQuery.cssProps[ origName ] || origName;
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			// Make sure that NaN and null values aren't set. See: #7116
+			if ( typeof value === "number" && isNaN( value ) || value == null ) {
+				return;
+			}
+
+			// If a number was passed in, add 'px' to the (except for certain CSS properties)
+			if ( typeof value === "number" && !jQuery.cssNumber[ origName ] ) {
+				value += "px";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} else {
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra ) {
+		// Make sure that we're working with the right name
+		var ret, origName = jQuery.camelCase( name ),
+			hooks = jQuery.cssHooks[ origName ];
+
+		name = jQuery.cssProps[ origName ] || origName;
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+			return ret;
+
+		// Otherwise, if a way to get the computed value exists, use that
+		} else if ( curCSS ) {
+			return curCSS( elem, name, origName );
+		}
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var old = {};
+
+		// Remember the old values, and insert the new ones
+		for ( var name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		callback.call( elem );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+	},
+
+	camelCase: function( string ) {
+		return string.replace( rdashAlpha, fcamelCase );
+	}
+});
+
+// DEPRECATED, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
+
+jQuery.each(["height", "width"], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			var val;
+
+			if ( computed ) {
+				if ( elem.offsetWidth !== 0 ) {
+					val = getWH( elem, name, extra );
+
+				} else {
+					jQuery.swap( elem, cssShow, function() {
+						val = getWH( elem, name, extra );
+					});
+				}
+
+				if ( val <= 0 ) {
+					val = curCSS( elem, name, name );
+
+					if ( val === "0px" && currentStyle ) {
+						val = currentStyle( elem, name, name );
+					}
+
+					if ( val != null ) {
+						// Should return "auto" instead of 0, use 0 for
+						// temporary backwards-compat
+						return val === "" || val === "auto" ? "0px" : val;
+					}
+				}
+
+				if ( val < 0 || val == null ) {
+					val = elem.style[ name ];
+
+					// Should return "auto" instead of 0, use 0 for
+					// temporary backwards-compat
+					return val === "" || val === "auto" ? "0px" : val;
+				}
+
+				return typeof val === "string" ? val : val + "px";
+			}
+		},
+
+		set: function( elem, value ) {
+			if ( rnumpx.test( value ) ) {
+				// ignore negative width and height values #1599
+				value = parseFloat(value);
+
+				if ( value >= 0 ) {
+					return value + "px";
+				}
+
+			} else {
+				return value;
+			}
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test((computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "") ?
+				(parseFloat(RegExp.$1) / 100) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style;
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// Set the alpha filter to set the opacity
+			var opacity = jQuery.isNaN(value) ?
+				"" :
+				"alpha(opacity=" + value * 100 + ")",
+				filter = style.filter || "";
+
+			style.filter = ralpha.test(filter) ?
+				filter.replace(ralpha, opacity) :
+				style.filter + ' ' + opacity;
+		}
+	};
+}
+
+jQuery(function() {
+	// This hook cannot be added until DOM ready because the support test
+	// for it is not run until after DOM ready
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+				// Work around by temporarily setting element display to inline-block
+				var ret;
+				jQuery.swap( elem, { "display": "inline-block" }, function() {
+					if ( computed ) {
+						ret = curCSS( elem, "margin-right", "marginRight" );
+					} else {
+						ret = elem.style.marginRight;
+					}
+				});
+				return ret;
+			}
+		};
+	}
+});
+
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+	getComputedStyle = function( elem, newName, name ) {
+		var ret, defaultView, computedStyle;
+
+		name = name.replace( rupper, "-$1" ).toLowerCase();
+
+		if ( !(defaultView = elem.ownerDocument.defaultView) ) {
+			return undefined;
+		}
+
+		if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+			ret = computedStyle.getPropertyValue( name );
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+		}
+
+		return ret;
+	};
+}
+
+if ( document.documentElement.currentStyle ) {
+	currentStyle = function( elem, name ) {
+		var left,
+			ret = elem.currentStyle && elem.currentStyle[ name ],
+			rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],
+			style = elem.style;
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
+			// Remember the original values
+			left = style.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : (ret || 0);
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+curCSS = getComputedStyle || currentStyle;
+
+function getWH( elem, name, extra ) {
+	var which = name === "width" ? cssWidth : cssHeight,
+		val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
+
+	if ( extra === "border" ) {
+		return val;
+	}
+
+	jQuery.each( which, function() {
+		if ( !extra ) {
+			val -= parseFloat(jQuery.css( elem, "padding" + this )) || 0;
+		}
+
+		if ( extra === "margin" ) {
+			val += parseFloat(jQuery.css( elem, "margin" + this )) || 0;
+
+		} else {
+			val -= parseFloat(jQuery.css( elem, "border" + this + "Width" )) || 0;
+		}
+	});
+
+	return val;
+}
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		var width = elem.offsetWidth,
+			height = elem.offsetHeight;
+
+		return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+
+
+
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rhash = /#.*$/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rquery = /\?/,
+	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+	rselectTextarea = /^(?:select|textarea)/i,
+	rspacesAjax = /\s+/,
+	rts = /([?&])_=[^&]*/,
+	rucHeaders = /(^|\-)([a-z])/g,
+	rucHeadersFunc = function( _, $1, $2 ) {
+		return $1 + $2.toUpperCase();
+	},
+	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
+
+	// Keep a copy of the old load method
+	_load = jQuery.fn.load,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Document location
+	ajaxLocation,
+
+	// Document location segments
+	ajaxLocParts;
+
+// #8138, IE may throw an exception when accessing
+// a field from document.location if document.domain has been set
+try {
+	ajaxLocation = document.location.href;
+} catch( e ) {
+	// Use the href attribute of an A element
+	// since IE will modify it given document.location
+	ajaxLocation = document.createElement( "a" );
+	ajaxLocation.href = "";
+	ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		if ( jQuery.isFunction( func ) ) {
+			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+				i = 0,
+				length = dataTypes.length,
+				dataType,
+				list,
+				placeBefore;
+
+			// For each dataType in the dataTypeExpression
+			for(; i < length; i++ ) {
+				dataType = dataTypes[ i ];
+				// We control if we're asked to add before
+				// any existing element
+				placeBefore = /^\+/.test( dataType );
+				if ( placeBefore ) {
+					dataType = dataType.substr( 1 ) || "*";
+				}
+				list = structure[ dataType ] = structure[ dataType ] || [];
+				// then we add to the structure accordingly
+				list[ placeBefore ? "unshift" : "push" ]( func );
+			}
+		}
+	};
+}
+
+//Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+		dataType /* internal */, inspected /* internal */ ) {
+
+	dataType = dataType || options.dataTypes[ 0 ];
+	inspected = inspected || {};
+
+	inspected[ dataType ] = true;
+
+	var list = structure[ dataType ],
+		i = 0,
+		length = list ? list.length : 0,
+		executeOnly = ( structure === prefilters ),
+		selection;
+
+	for(; i < length && ( executeOnly || !selection ); i++ ) {
+		selection = list[ i ]( options, originalOptions, jqXHR );
+		// If we got redirected to another dataType
+		// we try there if executing only and not done already
+		if ( typeof selection === "string" ) {
+			if ( !executeOnly || inspected[ selection ] ) {
+				selection = undefined;
+			} else {
+				options.dataTypes.unshift( selection );
+				selection = inspectPrefiltersOrTransports(
+						structure, options, originalOptions, jqXHR, selection, inspected );
+			}
+		}
+	}
+	// If we're only executing or nothing was selected
+	// we try the catchall dataType if not done already
+	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+		selection = inspectPrefiltersOrTransports(
+				structure, options, originalOptions, jqXHR, "*", inspected );
+	}
+	// unnecessary when only executing (prefilters)
+	// but it'll be ignored by the caller in that case
+	return selection;
+}
+
+jQuery.fn.extend({
+	load: function( url, params, callback ) {
+		if ( typeof url !== "string" && _load ) {
+			return _load.apply( this, arguments );
+
+		// Don't do a request if no elements are being requested
+		} else if ( !this.length ) {
+			return this;
+		}
+
+		var off = url.indexOf( " " );
+		if ( off >= 0 ) {
+			var selector = url.slice( off, url.length );
+			url = url.slice( 0, off );
+		}
+
+		// Default to a GET request
+		var type = "GET";
+
+		// If the second parameter was provided
+		if ( params ) {
+			// If it's a function
+			if ( jQuery.isFunction( params ) ) {
+				// We assume that it's the callback
+				callback = params;
+				params = undefined;
+
+			// Otherwise, build a param string
+			} else if ( typeof params === "object" ) {
+				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+				type = "POST";
+			}
+		}
+
+		var self = this;
+
+		// Request the remote document
+		jQuery.ajax({
+			url: url,
+			type: type,
+			dataType: "html",
+			data: params,
+			// Complete callback (responseText is used internally)
+			complete: function( jqXHR, status, responseText ) {
+				// Store the response as specified by the jqXHR object
+				responseText = jqXHR.responseText;
+				// If successful, inject the HTML into all the matched elements
+				if ( jqXHR.isResolved() ) {
+					// #4825: Get the actual response in case
+					// a dataFilter is present in ajaxSettings
+					jqXHR.done(function( r ) {
+						responseText = r;
+					});
+					// See if a selector was specified
+					self.html( selector ?
+						// Create a dummy div to hold the results
+						jQuery("<div>")
+							// inject the contents of the document in, removing the scripts
+							// to avoid any 'Permission Denied' errors in IE
+							.append(responseText.replace(rscript, ""))
+
+							// Locate the specified elements
+							.find(selector) :
+
+						// If not, just inject the full result
+						responseText );
+				}
+
+				if ( callback ) {
+					self.each( callback, [ responseText, status, jqXHR ] );
+				}
+			}
+		});
+
+		return this;
+	},
+
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+
+	serializeArray: function() {
+		return this.map(function(){
+			return this.elements ? jQuery.makeArray( this.elements ) : this;
+		})
+		.filter(function(){
+			return this.name && !this.disabled &&
+				( this.checked || rselectTextarea.test( this.nodeName ) ||
+					rinput.test( this.type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val, i ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+	jQuery.fn[ o ] = function( f ){
+		return this.bind( o, f );
+	};
+} );
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+		// shift arguments if data argument was omitted
+		if ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		return jQuery.ajax({
+			type: method,
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	};
+} );
+
+jQuery.extend({
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function ( target, settings ) {
+		if ( !settings ) {
+			// Only one parameter, we extend ajaxSettings
+			settings = target;
+			target = jQuery.extend( true, jQuery.ajaxSettings, settings );
+		} else {
+			// target was provided, we extend into it
+			jQuery.extend( true, target, jQuery.ajaxSettings, settings );
+		}
+		// Flatten fields we don't want deep extended
+		for( var field in { context: 1, url: 1 } ) {
+			if ( field in settings ) {
+				target[ field ] = settings[ field ];
+			} else if( field in jQuery.ajaxSettings ) {
+				target[ field ] = jQuery.ajaxSettings[ field ];
+			}
+		}
+		return target;
+	},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		type: "GET",
+		contentType: "application/x-www-form-urlencoded",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			xml: "application/xml, text/xml",
+			html: "text/html",
+			text: "text/plain",
+			json: "application/json, text/javascript",
+			"*": "*/*"
+		},
+
+		contents: {
+			xml: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText"
+		},
+
+		// List of data converters
+		// 1) key format is "source_type destination_type" (a single space in-between)
+		// 2) the catchall symbol "*" can be used for source_type
+		converters: {
+
+			// Convert anything to text
+			"* text": window.String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": jQuery.parseJSON,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		}
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var // Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+			// Callbacks context
+			callbackContext = s.context || s,
+			// Context for global events
+			// It's the callbackContext if one was provided in the options
+			// and if it's a DOM node or a jQuery collection
+			globalEventContext = callbackContext !== s &&
+				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+						jQuery( callbackContext ) : jQuery.event,
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery._Deferred(),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// ifModified key
+			ifModifiedKey,
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+			// transport
+			transport,
+			// timeout handle
+			timeoutTimer,
+			// Cross-domain detection vars
+			parts,
+			// The jqXHR state
+			state = 0,
+			// To know if global events are to be dispatched
+			fireGlobals,
+			// Loop variable
+			i,
+			// Fake xhr
+			jqXHR = {
+
+				readyState: 0,
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( !state ) {
+						requestHeaders[ name.toLowerCase().replace( rucHeaders, rucHeadersFunc ) ] = value;
+					}
+					return this;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() ];
+					}
+					return match === undefined ? null : match;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					statusText = statusText || "abort";
+					if ( transport ) {
+						transport.abort( statusText );
+					}
+					done( 0, statusText );
+					return this;
+				}
+			};
+
+		// Callback for when everything is done
+		// It is defined here because jslint complains if it is declared
+		// at the end of the function (which would be more logical and readable)
+		function done( status, statusText, responses, headers ) {
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status ? 4 : 0;
+
+			var isSuccess,
+				success,
+				error,
+				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+				lastModified,
+				etag;
+
+			// If successful, handle type chaining
+			if ( status >= 200 && status < 300 || status === 304 ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+
+					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+						jQuery.lastModified[ ifModifiedKey ] = lastModified;
+					}
+					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+						jQuery.etag[ ifModifiedKey ] = etag;
+					}
+				}
+
+				// If not modified
+				if ( status === 304 ) {
+
+					statusText = "notmodified";
+					isSuccess = true;
+
+				// If we have data
+				} else {
+
+					try {
+						success = ajaxConvert( s, response );
+						statusText = "success";
+						isSuccess = true;
+					} catch(e) {
+						// We have a parsererror
+						statusText = "parsererror";
+						error = e;
+					}
+				}
+			} else {
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if( !statusText || status ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = statusText;
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+						[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s] );
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+		jqXHR.complete = completeDeferred.done;
+
+		// Status-dependent callbacks
+		jqXHR.statusCode = function( map ) {
+			if ( map ) {
+				var tmp;
+				if ( state < 2 ) {
+					for( tmp in map ) {
+						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+					}
+				} else {
+					tmp = map[ jqXHR.status ];
+					jqXHR.then( tmp, tmp );
+				}
+			}
+			return this;
+		};
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
+
+		// Determine if a cross-domain request is in order
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() );
+			s.crossDomain = !!( parts &&
+				( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
+					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+			);
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefiler, stop there
+		if ( state === 2 ) {
+			return false;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = s.global;
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+			}
+
+			// Get ifModifiedKey before adding the anti-cache parameter
+			ifModifiedKey = s.url;
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+
+				var ts = jQuery.now(),
+					// try replacing _= if it is there
+					ret = s.url.replace( rts, "$1_=" + ts );
+
+				// if nothing was replaced, add timestamp to the end
+				s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			requestHeaders[ "Content-Type" ] = s.contentType;
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			ifModifiedKey = ifModifiedKey || s.url;
+			if ( jQuery.lastModified[ ifModifiedKey ] ) {
+				requestHeaders[ "If-Modified-Since" ] = jQuery.lastModified[ ifModifiedKey ];
+			}
+			if ( jQuery.etag[ ifModifiedKey ] ) {
+				requestHeaders[ "If-None-Match" ] = jQuery.etag[ ifModifiedKey ];
+			}
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		requestHeaders.Accept = s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+			s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", */*; q=0.01" : "" ) :
+			s.accepts[ "*" ];
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+				// Abort if not done already
+				jqXHR.abort();
+				return false;
+
+		}
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = setTimeout( function(){
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch (e) {
+				// Propagate exception as error if not done
+				if ( status < 2 ) {
+					done( -1, e );
+				// Simply rethrow otherwise
+				} else {
+					jQuery.error( e );
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	// Serialize an array of form elements or a set of
+	// key/values into a query string
+	param: function( a, traditional ) {
+		var s = [],
+			add = function( key, value ) {
+				// If value is a function, invoke it and return its value
+				value = jQuery.isFunction( value ) ? value() : value;
+				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+			};
+
+		// Set traditional to true for jQuery <= 1.3.2 behavior.
+		if ( traditional === undefined ) {
+			traditional = jQuery.ajaxSettings.traditional;
+		}
+
+		// If an array was passed in, assume that it is an array of form elements.
+		if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+			// Serialize the form elements
+			jQuery.each( a, function() {
+				add( this.name, this.value );
+			} );
+
+		} else {
+			// If traditional, encode the "old" way (the way 1.3.2 or older
+			// did it), otherwise encode params recursively.
+			for ( var prefix in a ) {
+				buildParams( prefix, a[ prefix ], traditional, add );
+			}
+		}
+
+		// Return the resulting serialization
+		return s.join( "&" ).replace( r20, "+" );
+	}
+});
+
+function buildParams( prefix, obj, traditional, add ) {
+	if ( jQuery.isArray( obj ) && obj.length ) {
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+				// If array item is non-scalar (array or object), encode its
+				// numeric index to resolve deserialization ambiguity issues.
+				// Note that rack (as of 1.0.0) can't currently deserialize
+				// nested arrays properly, and attempting to do so may cause
+				// a server error. Possible fixes are to modify rack's
+				// deserialization algorithm or to provide an option or flag
+				// to force array serialization to be shallow.
+				buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && obj != null && typeof obj === "object" ) {
+		// If we see an array here, it is empty and should be treated as an empty
+		// object
+		if ( jQuery.isArray( obj ) || jQuery.isEmptyObject( obj ) ) {
+			add( prefix, "" );
+
+		// Serialize object item.
+		} else {
+			for ( var name in obj ) {
+				buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+			}
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields,
+		ct,
+		type,
+		finalDataType,
+		firstDataType;
+
+	// Fill responseXXX fields
+	for( type in responseFields ) {
+		if ( type in responses ) {
+			jqXHR[ responseFields[type] ] = responses[ type ];
+		}
+	}
+
+	// Remove auto dataType and get content-type in the process
+	while( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	var dataTypes = s.dataTypes,
+		converters = {},
+		i,
+		key,
+		length = dataTypes.length,
+		tmp,
+		// Current and previous dataTypes
+		current = dataTypes[ 0 ],
+		prev,
+		// Conversion expression
+		conversion,
+		// Conversion function
+		conv,
+		// Conversion functions (transitive conversion)
+		conv1,
+		conv2;
+
+	// For each dataType in the chain
+	for( i = 1; i < length; i++ ) {
+
+		// Create converters map
+		// with lowercased keys
+		if ( i === 1 ) {
+			for( key in s.converters ) {
+				if( typeof key === "string" ) {
+					converters[ key.toLowerCase() ] = s.converters[ key ];
+				}
+			}
+		}
+
+		// Get the dataTypes
+		prev = current;
+		current = dataTypes[ i ];
+
+		// If current is auto dataType, update it to prev
+		if( current === "*" ) {
+			current = prev;
+		// If no auto and dataTypes are actually different
+		} else if ( prev !== "*" && prev !== current ) {
+
+			// Get the converter
+			conversion = prev + " " + current;
+			conv = converters[ conversion ] || converters[ "* " + current ];
+
+			// If there is no direct converter, search transitively
+			if ( !conv ) {
+				conv2 = undefined;
+				for( conv1 in converters ) {
+					tmp = conv1.split( " " );
+					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
+						conv2 = converters[ tmp[1] + " " + current ];
+						if ( conv2 ) {
+							conv1 = converters[ conv1 ];
+							if ( conv1 === true ) {
+								conv = conv2;
+							} else if ( conv2 === true ) {
+								conv = conv1;
+							}
+							break;
+						}
+					}
+				}
+			}
+			// If we found no converter, dispatch an error
+			if ( !( conv || conv2 ) ) {
+				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
+			}
+			// If found converter is not an equivalence
+			if ( conv !== true ) {
+				// Convert with 1 or 2 converters accordingly
+				response = conv ? conv( response ) : conv2( conv1(response) );
+			}
+		}
+	}
+	return response;
+}
+
+
+
+
+var jsc = jQuery.now(),
+	jsre = /(\=)\?(&|$)|\?\?/i;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		return jQuery.expando + "_" + ( jsc++ );
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var dataIsString = ( typeof s.data === "string" );
+
+	if ( s.dataTypes[ 0 ] === "jsonp" ||
+		originalSettings.jsonpCallback ||
+		originalSettings.jsonp != null ||
+		s.jsonp !== false && ( jsre.test( s.url ) ||
+				dataIsString && jsre.test( s.data ) ) ) {
+
+		var responseContainer,
+			jsonpCallback = s.jsonpCallback =
+				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
+			previous = window[ jsonpCallback ],
+			url = s.url,
+			data = s.data,
+			replace = "$1" + jsonpCallback + "$2",
+			cleanUp = function() {
+				// Set callback back to previous value
+				window[ jsonpCallback ] = previous;
+				// Call if it was a function and we have a response
+				if ( responseContainer && jQuery.isFunction( previous ) ) {
+					window[ jsonpCallback ]( responseContainer[ 0 ] );
+				}
+			};
+
+		if ( s.jsonp !== false ) {
+			url = url.replace( jsre, replace );
+			if ( s.url === url ) {
+				if ( dataIsString ) {
+					data = data.replace( jsre, replace );
+				}
+				if ( s.data === data ) {
+					// Add callback manually
+					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+				}
+			}
+		}
+
+		s.url = url;
+		s.data = data;
+
+		// Install callback
+		window[ jsonpCallback ] = function( response ) {
+			responseContainer = [ response ];
+		};
+
+		// Install cleanUp function
+		jqXHR.then( cleanUp, cleanUp );
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( jsonpCallback + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Delegate to script
+		return "script";
+	}
+} );
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /javascript|ecmascript/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+} );
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement( "script" );
+
+				script.async = "async";
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( head && script.parentNode ) {
+							head.removeChild( script );
+						}
+
+						// Dereference the script
+						script = undefined;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+				// This arises when a base node is used (#2709 and #4378).
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( 0, 1 );
+				}
+			}
+		};
+	}
+} );
+
+
+
+
+var // #5280: next active xhr id and list of active xhrs' callbacks
+	xhrId = jQuery.now(),
+	xhrCallbacks,
+
+	// XHR used to determine supports properties
+	testXHR;
+
+// #5280: Internet Explorer will keep connections alive if we don't abort on unload
+function xhrOnUnloadAbort() {
+	jQuery( window ).unload(function() {
+		// Abort all pending requests
+		for ( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( 0, 1 );
+		}
+	});
+}
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Test if we can create an xhr object
+testXHR = jQuery.ajaxSettings.xhr();
+jQuery.support.ajax = !!testXHR;
+
+// Does this browser support crossDomain XHR requests
+jQuery.support.cors = testXHR && ( "withCredentials" in testXHR );
+
+// No need for the temporary xhr anymore
+testXHR = undefined;
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var xhr = s.xhr(),
+						handle,
+						i;
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.mimeType );
+					}
+
+					// X-Requested-With header
+					// For cross-domain requests, seeing as conditions for a preflight are
+					// akin to a jigsaw puzzle, we simply never set it to be sure.
+					// (it can always be set on a per-request basis or even using ajaxSetup)
+					// For same-domain requests, won't change header if already provided.
+					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+						headers[ "X-Requested-With" ] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( _ ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+
+						var status,
+							statusText,
+							responseHeaders,
+							responses,
+							xml;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occured
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									delete xhrCallbacks[ handle ];
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+									responses = {};
+									xml = xhr.responseXML;
+
+									// Construct response list
+									if ( xml && xml.documentElement /* #4958 */ ) {
+										responses.xml = xml;
+									}
+									responses.text = xhr.responseText;
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					// if we're in sync mode or it's in cache
+					// and has been retrieved directly (IE6 & IE7)
+					// we need to manually fire the callback
+					if ( !s.async || xhr.readyState === 4 ) {
+						callback();
+					} else {
+						// Create the active xhrs callbacks list if needed
+						// and attach the unload handler
+						if ( !xhrCallbacks ) {
+							xhrCallbacks = {};
+							xhrOnUnloadAbort();
+						}
+						// Add to list of active xhrs callbacks
+						handle = xhrId++;
+						xhr.onreadystatechange = xhrCallbacks[ handle ] = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback(0,1);
+					}
+				}
+			};
+		}
+	});
+}
+
+
+
+
+var elemdisplay = {},
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
+	timerId,
+	fxAttrs = [
+		// height animations
+		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+		// width animations
+		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+		// opacity animations
+		[ "opacity" ]
+	];
+
+jQuery.fn.extend({
+	show: function( speed, easing, callback ) {
+		var elem, display;
+
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("show", 3), speed, easing, callback);
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				elem = this[i];
+				display = elem.style.display;
+
+				// Reset the inline display of this element to learn if it is
+				// being hidden by cascaded rules or not
+				if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
+					display = elem.style.display = "";
+				}
+
+				// Set elements which have been overridden with display: none
+				// in a stylesheet to whatever the default browser style is
+				// for such an element
+				if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
+					jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
+				}
+			}
+
+			// Set the display of most of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				elem = this[i];
+				display = elem.style.display;
+
+				if ( display === "" || display === "none" ) {
+					elem.style.display = jQuery._data(elem, "olddisplay") || "";
+				}
+			}
+
+			return this;
+		}
+	},
+
+	hide: function( speed, easing, callback ) {
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("hide", 3), speed, easing, callback);
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				var display = jQuery.css( this[i], "display" );
+
+				if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
+					jQuery._data( this[i], "olddisplay", display );
+				}
+			}
+
+			// Set the display of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				this[i].style.display = "none";
+			}
+
+			return this;
+		}
+	},
+
+	// Save the old toggle function
+	_toggle: jQuery.fn.toggle,
+
+	toggle: function( fn, fn2, callback ) {
+		var bool = typeof fn === "boolean";
+
+		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+			this._toggle.apply( this, arguments );
+
+		} else if ( fn == null || bool ) {
+			this.each(function() {
+				var state = bool ? fn : jQuery(this).is(":hidden");
+				jQuery(this)[ state ? "show" : "hide" ]();
+			});
+
+		} else {
+			this.animate(genFx("toggle", 3), fn, fn2, callback);
+		}
+
+		return this;
+	},
+
+	fadeTo: function( speed, to, easing, callback ) {
+		return this.filter(":hidden").css("opacity", 0).show().end()
+					.animate({opacity: to}, speed, easing, callback);
+	},
+
+	animate: function( prop, speed, easing, callback ) {
+		var optall = jQuery.speed(speed, easing, callback);
+
+		if ( jQuery.isEmptyObject( prop ) ) {
+			return this.each( optall.complete );
+		}
+
+		return this[ optall.queue === false ? "each" : "queue" ](function() {
+			// XXX 'this' does not always have a nodeName when running the
+			// test suite
+
+			var opt = jQuery.extend({}, optall), p,
+				isElement = this.nodeType === 1,
+				hidden = isElement && jQuery(this).is(":hidden"),
+				self = this;
+
+			for ( p in prop ) {
+				var name = jQuery.camelCase( p );
+
+				if ( p !== name ) {
+					prop[ name ] = prop[ p ];
+					delete prop[ p ];
+					p = name;
+				}
+
+				if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) {
+					return opt.complete.call(this);
+				}
+
+				if ( isElement && ( p === "height" || p === "width" ) ) {
+					// Make sure that nothing sneaks out
+					// Record all 3 overflow attributes because IE does not
+					// change the overflow attribute when overflowX and
+					// overflowY are set to the same value
+					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+
+					// Set display property to inline-block for height/width
+					// animations on inline elements that are having width/height
+					// animated
+					if ( jQuery.css( this, "display" ) === "inline" &&
+							jQuery.css( this, "float" ) === "none" ) {
+						if ( !jQuery.support.inlineBlockNeedsLayout ) {
+							this.style.display = "inline-block";
+
+						} else {
+							var display = defaultDisplay(this.nodeName);
+
+							// inline-level elements accept inline-block;
+							// block-level elements need to be inline with layout
+							if ( display === "inline" ) {
+								this.style.display = "inline-block";
+
+							} else {
+								this.style.display = "inline";
+								this.style.zoom = 1;
+							}
+						}
+					}
+				}
+
+				if ( jQuery.isArray( prop[p] ) ) {
+					// Create (if needed) and add to specialEasing
+					(opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];
+					prop[p] = prop[p][0];
+				}
+			}
+
+			if ( opt.overflow != null ) {
+				this.style.overflow = "hidden";
+			}
+
+			opt.curAnim = jQuery.extend({}, prop);
+
+			jQuery.each( prop, function( name, val ) {
+				var e = new jQuery.fx( self, opt, name );
+
+				if ( rfxtypes.test(val) ) {
+					e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop );
+
+				} else {
+					var parts = rfxnum.exec(val),
+						start = e.cur();
+
+					if ( parts ) {
+						var end = parseFloat( parts[2] ),
+							unit = parts[3] || ( jQuery.cssNumber[ name ] ? "" : "px" );
+
+						// We need to compute starting value
+						if ( unit !== "px" ) {
+							jQuery.style( self, name, (end || 1) + unit);
+							start = ((end || 1) / e.cur()) * start;
+							jQuery.style( self, name, start + unit);
+						}
+
+						// If a +=/-= token was provided, we're doing a relative animation
+						if ( parts[1] ) {
+							end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
+						}
+
+						e.custom( start, end, unit );
+
+					} else {
+						e.custom( start, val, "" );
+					}
+				}
+			});
+
+			// For JS strict compliance
+			return true;
+		});
+	},
+
+	stop: function( clearQueue, gotoEnd ) {
+		var timers = jQuery.timers;
+
+		if ( clearQueue ) {
+			this.queue([]);
+		}
+
+		this.each(function() {
+			// go in reverse order so anything added to the queue during the loop is ignored
+			for ( var i = timers.length - 1; i >= 0; i-- ) {
+				if ( timers[i].elem === this ) {
+					if (gotoEnd) {
+						// force the next step to be the last
+						timers[i](true);
+					}
+
+					timers.splice(i, 1);
+				}
+			}
+		});
+
+		// start the next in the queue if the last step wasn't forced
+		if ( !gotoEnd ) {
+			this.dequeue();
+		}
+
+		return this;
+	}
+
+});
+
+function genFx( type, num ) {
+	var obj = {};
+
+	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
+		obj[ this ] = type;
+	});
+
+	return obj;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx("show", 1),
+	slideUp: genFx("hide", 1),
+	slideToggle: genFx("toggle", 1),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+});
+
+jQuery.extend({
+	speed: function( speed, easing, fn ) {
+		var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
+			complete: fn || !fn && easing ||
+				jQuery.isFunction( speed ) && speed,
+			duration: speed,
+			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
+		};
+
+		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+			opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
+
+		// Queueing
+		opt.old = opt.complete;
+		opt.complete = function() {
+			if ( opt.queue !== false ) {
+				jQuery(this).dequeue();
+			}
+			if ( jQuery.isFunction( opt.old ) ) {
+				opt.old.call( this );
+			}
+		};
+
+		return opt;
+	},
+
+	easing: {
+		linear: function( p, n, firstNum, diff ) {
+			return firstNum + diff * p;
+		},
+		swing: function( p, n, firstNum, diff ) {
+			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
+		}
+	},
+
+	timers: [],
+
+	fx: function( elem, options, prop ) {
+		this.options = options;
+		this.elem = elem;
+		this.prop = prop;
+
+		if ( !options.orig ) {
+			options.orig = {};
+		}
+	}
+
+});
+
+jQuery.fx.prototype = {
+	// Simple function for setting a style value
+	update: function() {
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
+	},
+
+	// Get the current size
+	cur: function() {
+		if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
+			return this.elem[ this.prop ];
+		}
+
+		var parsed,
+			r = jQuery.css( this.elem, this.prop );
+		// Empty strings, null, undefined and "auto" are converted to 0,
+		// complex values such as "rotate(1rad)" are returned as is,
+		// simple values such as "10px" are parsed to Float.
+		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
+	},
+
+	// Start an animation from one number to another
+	custom: function( from, to, unit ) {
+		var self = this,
+			fx = jQuery.fx;
+
+		this.startTime = jQuery.now();
+		this.start = from;
+		this.end = to;
+		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+		this.now = this.start;
+		this.pos = this.state = 0;
+
+		function t( gotoEnd ) {
+			return self.step(gotoEnd);
+		}
+
+		t.elem = this.elem;
+
+		if ( t() && jQuery.timers.push(t) && !timerId ) {
+			timerId = setInterval(fx.tick, fx.interval);
+		}
+	},
+
+	// Simple 'show' function
+	show: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+		this.options.show = true;
+
+		// Begin the animation
+		// Make sure that we start at a small width/height to avoid any
+		// flash of content
+		this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
+
+		// Start by showing the element
+		jQuery( this.elem ).show();
+	},
+
+	// Simple 'hide' function
+	hide: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+		this.options.hide = true;
+
+		// Begin the animation
+		this.custom(this.cur(), 0);
+	},
+
+	// Each step of an animation
+	step: function( gotoEnd ) {
+		var t = jQuery.now(), done = true;
+
+		if ( gotoEnd || t >= this.options.duration + this.startTime ) {
+			this.now = this.end;
+			this.pos = this.state = 1;
+			this.update();
+
+			this.options.curAnim[ this.prop ] = true;
+
+			for ( var i in this.options.curAnim ) {
+				if ( this.options.curAnim[i] !== true ) {
+					done = false;
+				}
+			}
+
+			if ( done ) {
+				// Reset the overflow
+				if ( this.options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+					var elem = this.elem,
+						options = this.options;
+
+					jQuery.each( [ "", "X", "Y" ], function (index, value) {
+						elem.style[ "overflow" + value ] = options.overflow[index];
+					} );
+				}
+
+				// Hide the element if the "hide" operation was done
+				if ( this.options.hide ) {
+					jQuery(this.elem).hide();
+				}
+
+				// Reset the properties, if the item has been hidden or shown
+				if ( this.options.hide || this.options.show ) {
+					for ( var p in this.options.curAnim ) {
+						jQuery.style( this.elem, p, this.options.orig[p] );
+					}
+				}
+
+				// Execute the complete function
+				this.options.complete.call( this.elem );
+			}
+
+			return false;
+
+		} else {
+			var n = t - this.startTime;
+			this.state = n / this.options.duration;
+
+			// Perform the easing function, defaults to swing
+			var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
+			var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear");
+			this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
+			this.now = this.start + ((this.end - this.start) * this.pos);
+
+			// Perform the next step of the animation
+			this.update();
+		}
+
+		return true;
+	}
+};
+
+jQuery.extend( jQuery.fx, {
+	tick: function() {
+		var timers = jQuery.timers;
+
+		for ( var i = 0; i < timers.length; i++ ) {
+			if ( !timers[i]() ) {
+				timers.splice(i--, 1);
+			}
+		}
+
+		if ( !timers.length ) {
+			jQuery.fx.stop();
+		}
+	},
+
+	interval: 13,
+
+	stop: function() {
+		clearInterval( timerId );
+		timerId = null;
+	},
+
+	speeds: {
+		slow: 600,
+		fast: 200,
+		// Default speed
+		_default: 400
+	},
+
+	step: {
+		opacity: function( fx ) {
+			jQuery.style( fx.elem, "opacity", fx.now );
+		},
+
+		_default: function( fx ) {
+			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+				fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
+			} else {
+				fx.elem[ fx.prop ] = fx.now;
+			}
+		}
+	}
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+
+function defaultDisplay( nodeName ) {
+	if ( !elemdisplay[ nodeName ] ) {
+		var elem = jQuery("<" + nodeName + ">").appendTo("body"),
+			display = elem.css("display");
+
+		elem.remove();
+
+		if ( display === "none" || display === "" ) {
+			display = "block";
+		}
+
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return elemdisplay[ nodeName ];
+}
+
+
+
+
+var rtable = /^t(?:able|d|h)$/i,
+	rroot = /^(?:body|html)$/i;
+
+if ( "getBoundingClientRect" in document.documentElement ) {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0], box;
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		try {
+			box = elem.getBoundingClientRect();
+		} catch(e) {}
+
+		var doc = elem.ownerDocument,
+			docElem = doc.documentElement;
+
+		// Make sure we're not dealing with a disconnected DOM node
+		if ( !box || !jQuery.contains( docElem, elem ) ) {
+			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
+		}
+
+		var body = doc.body,
+			win = getWindow(doc),
+			clientTop  = docElem.clientTop  || body.clientTop  || 0,
+			clientLeft = docElem.clientLeft || body.clientLeft || 0,
+			scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
+			scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
+			top  = box.top  + scrollTop  - clientTop,
+			left = box.left + scrollLeft - clientLeft;
+
+		return { top: top, left: left };
+	};
+
+} else {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0];
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		jQuery.offset.initialize();
+
+		var computedStyle,
+			offsetParent = elem.offsetParent,
+			prevOffsetParent = elem,
+			doc = elem.ownerDocument,
+			docElem = doc.documentElement,
+			body = doc.body,
+			defaultView = doc.defaultView,
+			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+			top = elem.offsetTop,
+			left = elem.offsetLeft;
+
+		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+			if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+				break;
+			}
+
+			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+			top  -= elem.scrollTop;
+			left -= elem.scrollLeft;
+
+			if ( elem === offsetParent ) {
+				top  += elem.offsetTop;
+				left += elem.offsetLeft;
+
+				if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+				}
+
+				prevOffsetParent = offsetParent;
+				offsetParent = elem.offsetParent;
+			}
+
+			if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+			}
+
+			prevComputedStyle = computedStyle;
+		}
+
+		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+			top  += body.offsetTop;
+			left += body.offsetLeft;
+		}
+
+		if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+			top  += Math.max( docElem.scrollTop, body.scrollTop );
+			left += Math.max( docElem.scrollLeft, body.scrollLeft );
+		}
+
+		return { top: top, left: left };
+	};
+}
+
+jQuery.offset = {
+	initialize: function() {
+		var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
+			html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
+
+		jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
+
+		container.innerHTML = html;
+		body.insertBefore( container, body.firstChild );
+		innerDiv = container.firstChild;
+		checkDiv = innerDiv.firstChild;
+		td = innerDiv.nextSibling.firstChild.firstChild;
+
+		this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
+		this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
+
+		checkDiv.style.position = "fixed";
+		checkDiv.style.top = "20px";
+
+		// safari subtracts parent border width here which is 5px
+		this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
+		checkDiv.style.position = checkDiv.style.top = "";
+
+		innerDiv.style.overflow = "hidden";
+		innerDiv.style.position = "relative";
+
+		this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
+
+		this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
+
+		body.removeChild( container );
+		jQuery.offset.initialize = jQuery.noop;
+	},
+
+	bodyOffset: function( body ) {
+		var top = body.offsetTop,
+			left = body.offsetLeft;
+
+		jQuery.offset.initialize();
+
+		if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
+			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+		}
+
+		return { top: top, left: left };
+	},
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray('auto', [curCSSTop, curCSSLeft]) > -1,
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+		}
+
+		curTop  = calculatePosition ? curPosition.top  : parseInt( curCSSTop,  10 ) || 0;
+		curLeft = calculatePosition ? curPosition.left : parseInt( curCSSLeft, 10 ) || 0;
+
+		if ( jQuery.isFunction( options ) ) {
+			options = options.call( elem, i, curOffset );
+		}
+
+		if (options.top != null) {
+			props.top = (options.top - curOffset.top) + curTop;
+		}
+		if (options.left != null) {
+			props.left = (options.left - curOffset.left) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+
+jQuery.fn.extend({
+	position: function() {
+		if ( !this[0] ) {
+			return null;
+		}
+
+		var elem = this[0],
+
+		// Get *real* offsetParent
+		offsetParent = this.offsetParent(),
+
+		// Get correct offsets
+		offset       = this.offset(),
+		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+		// Subtract element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+		// Add offsetParent borders
+		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+		// Subtract the two offsets
+		return {
+			top:  offset.top  - parentOffset.top,
+			left: offset.left - parentOffset.left
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || document.body;
+			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ["Left", "Top"], function( i, name ) {
+	var method = "scroll" + name;
+
+	jQuery.fn[ method ] = function(val) {
+		var elem = this[0], win;
+
+		if ( !elem ) {
+			return null;
+		}
+
+		if ( val !== undefined ) {
+			// Set the scroll offset
+			return this.each(function() {
+				win = getWindow( this );
+
+				if ( win ) {
+					win.scrollTo(
+						!i ? val : jQuery(win).scrollLeft(),
+						i ? val : jQuery(win).scrollTop()
+					);
+
+				} else {
+					this[ method ] = val;
+				}
+			});
+		} else {
+			win = getWindow( elem );
+
+			// Return the scroll offset
+			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
+				jQuery.support.boxModel && win.document.documentElement[ method ] ||
+					win.document.body[ method ] :
+				elem[ method ];
+		}
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+
+
+
+
+// Create innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function( i, name ) {
+
+	var type = name.toLowerCase();
+
+	// innerHeight and innerWidth
+	jQuery.fn["inner" + name] = function() {
+		return this[0] ?
+			parseFloat( jQuery.css( this[0], type, "padding" ) ) :
+			null;
+	};
+
+	// outerHeight and outerWidth
+	jQuery.fn["outer" + name] = function( margin ) {
+		return this[0] ?
+			parseFloat( jQuery.css( this[0], type, margin ? "margin" : "border" ) ) :
+			null;
+	};
+
+	jQuery.fn[ type ] = function( size ) {
+		// Get window width or height
+		var elem = this[0];
+		if ( !elem ) {
+			return size == null ? null : this;
+		}
+
+		if ( jQuery.isFunction( size ) ) {
+			return this.each(function( i ) {
+				var self = jQuery( this );
+				self[ type ]( size.call( this, i, self[ type ]() ) );
+			});
+		}
+
+		if ( jQuery.isWindow( elem ) ) {
+			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+			// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+			var docElemProp = elem.document.documentElement[ "client" + name ];
+			return elem.document.compatMode === "CSS1Compat" && docElemProp ||
+				elem.document.body[ "client" + name ] || docElemProp;
+
+		// Get document width or height
+		} else if ( elem.nodeType === 9 ) {
+			// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+			return Math.max(
+				elem.documentElement["client" + name],
+				elem.body["scroll" + name], elem.documentElement["scroll" + name],
+				elem.body["offset" + name], elem.documentElement["offset" + name]
+			);
+
+		// Get or set width or height on the element
+		} else if ( size === undefined ) {
+			var orig = jQuery.css( elem, type ),
+				ret = parseFloat( orig );
+
+			return jQuery.isNaN( ret ) ? orig : ret;
+
+		// Set the width or height on the element (default to pixels if value is unitless)
+		} else {
+			return this.css( type, typeof size === "string" ? size : size + "px" );
+		}
+	};
+
+});
+
+
+window.jQuery = window.$ = jQuery;
+})(window);
diff --git a/framework/images/webapp/images/jquery/jquery-1.5.2.min.js b/framework/images/webapp/images/jquery/jquery-1.5.2.min.js
new file mode 100644
index 0000000..f78f96a
--- /dev/null
+++ b/framework/images/webapp/images/jquery/jquery-1.5.2.min.js
@@ -0,0 +1,16 @@
+/*!
+ * jQuery JavaScript Library v1.5.2
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Mar 31 15:28:23 2011 -0400
+ */
+(function(a,b){function ci(a){return d.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cf(a){if(!b_[a]){var b=d("<"+a+">").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";b_[a]=c}return b_[a]}function ce(a,b){var c={};d.each(cd.concat.apply([],cd.slice(0,b)),function(){c[this]=a});return c}function b$(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function bZ(){try{return new a.XMLHttpRequest}catch(b){}}function bY(){d(a).unload(function(){for(var a in bW)bW[a](0,1)})}function bS(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var e=a.dataTypes,f={},g,h,i=e.length,j,k=e[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h==="string"&&(f[h.toLowerCase()]=a.converters[h]);l=k,k=e[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=f[m]||f["* "+k];if(!n){p=b;for(o in f){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=f[j[1]+" "+k];if(p){o=f[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&d.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bR(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bQ(a,b,c,e){if(d.isArray(b)&&b.length)d.each(b,function(b,f){c||bs.test(a)?e(a,f):bQ(a+"["+(typeof f==="object"||d.isArray(f)?b:"")+"]",f,c,e)});else if(c||b==null||typeof b!=="object")e(a,b);else if(d.isArray(b)||d.isEmptyObject(b))e(a,"");else for(var f in b)bQ(a+"["+f+"]",b[f],c,e)}function bP(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bJ,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bP(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bP(a,c,d,e,"*",g));return l}function bO(a){return function(b,c){typeof b!=="string"&&(c=b,b="*");if(d.isFunction(c)){var e=b.toLowerCase().split(bD),f=0,g=e.length,h,i,j;for(;f<g;f++)h=e[f],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bq(a,b,c){var e=b==="width"?bk:bl,f=b==="width"?a.offsetWidth:a.offsetHeight;if(c==="border")return f;d.each(e,function(){c||(f-=parseFloat(d.css(a,"padding"+this))||0),c==="margin"?f+=parseFloat(d.css(a,"margin"+this))||0:f-=parseFloat(d.css(a,"border"+this+"Width"))||0});return f}function bc(a,b){b.src?d.ajax({url:b.src,async:!1,dataType:"script"}):d.globalEval(b.text||b.textContent||b.innerHTML||""),b.parentNode&&b.parentNode.removeChild(b)}function bb(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function ba(a,b){if(b.nodeType===1){var c=b.nodeName.toLowerCase();b.clearAttributes(),b.mergeAttributes(a);if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(d.expando)}}function _(a,b){if(b.nodeType===1&&d.hasData(a)){var c=d.expando,e=d.data(a),f=d.data(b,e);if(e=e[c]){var g=e.events;f=f[c]=d.extend({},e);if(g){delete f.handle,f.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)d.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function $(a,b){return d.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Q(a,b,c){if(d.isFunction(b))return d.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return d.grep(a,function(a,d){return a===b===c});if(typeof b==="string"){var e=d.grep(a,function(a){return a.nodeType===1});if(L.test(b))return d.filter(b,e,!c);b=d.filter(b,e)}return d.grep(a,function(a,e){return d.inArray(a,b)>=0===c})}function P(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function H(a,b){return(a&&a!=="*"?a+".":"")+b.replace(t,"`").replace(u,"&")}function G(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,p=[],q=[],s=d._data(this,"events");if(a.liveFired!==this&&s&&s.live&&!a.target.disabled&&(!a.button||a.type!=="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var t=s.live.slice(0);for(i=0;i<t.length;i++)g=t[i],g.origType.replace(r,"")===a.type?q.push(g.selector):t.splice(i--,1);f=d(a.target).closest(q,a.currentTarget);for(j=0,k=f.length;j<k;j++){m=f[j];for(i=0;i<t.length;i++){g=t[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,e=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,e=d(a.relatedTarget).closest(g.selector)[0];(!e||e!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){f=p[j];if(c&&f.level>c)break;a.currentTarget=f.elem,a.data=f.handleObj.data,a.handleObj=f.handleObj,o=f.handleObj.origHandler.apply(f.elem,arguments);if(o===!1||a.isPropagationStopped()){c=f.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function E(a,c,e){var f=d.extend({},e[0]);f.type=a,f.originalEvent={},f.liveFired=b,d.event.handle.call(c,f),f.isDefaultPrevented()&&e[0].preventDefault()}function y(){return!0}function x(){return!1}function i(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function h(a,c,e){if(e===b&&a.nodeType===1){e=a.getAttribute("data-"+c);if(typeof e==="string"){try{e=e==="true"?!0:e==="false"?!1:e==="null"?null:d.isNaN(e)?g.test(e)?d.parseJSON(e):e:parseFloat(e)}catch(f){}d.data(a,c,e)}else e=b}return e}var c=a.document,d=function(){function G(){if(!d.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(G,1);return}d.ready()}}var d=function(a,b){return new d.fn.init(a,b,g)},e=a.jQuery,f=a.$,g,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,i=/\S/,j=/^\s+/,k=/\s+$/,l=/\d/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=navigator.userAgent,w,x,y,z=Object.prototype.toString,A=Object.prototype.hasOwnProperty,B=Array.prototype.push,C=Array.prototype.slice,D=String.prototype.trim,E=Array.prototype.indexOf,F={};d.fn=d.prototype={constructor:d,init:function(a,e,f){var g,i,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!e&&c.body){this.context=c,this[0]=c.body,this.selector="body",this.length=1;return this}if(typeof a==="string"){g=h.exec(a);if(!g||!g[1]&&e)return!e||e.jquery?(e||f).find(a):this.constructor(e).find(a);if(g[1]){e=e instanceof d?e[0]:e,k=e?e.ownerDocument||e:c,j=m.exec(a),j?d.isPlainObject(e)?(a=[c.createElement(j[1])],d.fn.attr.call(a,e,!0)):a=[k.createElement(j[1])]:(j=d.buildFragment([g[1]],[k]),a=(j.cacheable?d.clone(j.fragment):j.fragment).childNodes);return d.merge(this,a)}i=c.getElementById(g[2]);if(i&&i.parentNode){if(i.id!==g[2])return f.find(a);this.length=1,this[0]=i}this.context=c,this.selector=a;return this}if(d.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return d.makeArray(a,this)},selector:"",jquery:"1.5.2",length:0,size:function(){return this.length},toArray:function(){return C.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var e=this.constructor();d.isArray(a)?B.apply(e,a):d.merge(e,a),e.prevObject=this,e.context=this.context,b==="find"?e.selector=this.selector+(this.selector?" ":"")+c:b&&(e.selector=this.selector+"."+b+"("+c+")");return e},each:function(a,b){return d.each(this,a,b)},ready:function(a){d.bindReady(),x.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(C.apply(this,arguments),"slice",C.call(arguments).join(","))},map:function(a){return this.pushStack(d.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:B,sort:[].sort,splice:[].splice},d.fn.init.prototype=d.fn,d.extend=d.fn.extend=function(){var a,c,e,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i==="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!=="object"&&!d.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){e=i[c],f=a[c];if(i===f)continue;l&&f&&(d.isPlainObject(f)||(g=d.isArray(f)))?(g?(g=!1,h=e&&d.isArray(e)?e:[]):h=e&&d.isPlainObject(e)?e:{},i[c]=d.extend(l,h,f)):f!==b&&(i[c]=f)}return i},d.extend({noConflict:function(b){a.$=f,b&&(a.jQuery=e);return d},isReady:!1,readyWait:1,ready:function(a){a===!0&&d.readyWait--;if(!d.readyWait||a!==!0&&!d.isReady){if(!c.body)return setTimeout(d.ready,1);d.isReady=!0;if(a!==!0&&--d.readyWait>0)return;x.resolveWith(c,[d]),d.fn.trigger&&d(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!x){x=d._Deferred();if(c.readyState==="complete")return setTimeout(d.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",y,!1),a.addEventListener("load",d.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",y),a.attachEvent("onload",d.ready);var b=!1;try{b=a.frameElement==null}catch(e){}c.documentElement.doScroll&&b&&G()}}},isFunction:function(a){return d.type(a)==="function"},isArray:Array.isArray||function(a){return d.type(a)==="array"},isWindow:function(a){return a&&typeof a==="object"&&"setInterval"in a},isNaN:function(a){return a==null||!l.test(a)||isNaN(a)},type:function(a){return a==null?String(a):F[z.call(a)]||"object"},isPlainObject:function(a){if(!a||d.type(a)!=="object"||a.nodeType||d.isWindow(a))return!1;if(a.constructor&&!A.call(a,"constructor")&&!A.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a){}return c===b||A.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!=="string"||!b)return null;b=d.trim(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return a.JSON&&a.JSON.parse?a.JSON.parse(b):(new Function("return "+b))();d.error("Invalid JSON: "+b)},parseXML:function(b,c,e){a.DOMParser?(e=new DOMParser,c=e.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),e=c.documentElement,(!e||!e.nodeName||e.nodeName==="parsererror")&&d.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(a){if(a&&i.test(a)){var b=c.head||c.getElementsByTagName("head")[0]||c.documentElement,e=c.createElement("script");d.support.scriptEval()?e.appendChild(c.createTextNode(a)):e.text=a,b.insertBefore(e,b.firstChild),b.removeChild(e)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,e){var f,g=0,h=a.length,i=h===b||d.isFunction(a);if(e){if(i){for(f in a)if(c.apply(a[f],e)===!1)break}else for(;g<h;)if(c.apply(a[g++],e)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(var j=a[0];g<h&&c.call(j,g,j)!==!1;j=a[++g]){}return a},trim:D?function(a){return a==null?"":D.call(a)}:function(a){return a==null?"":(a+"").replace(j,"").replace(k,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var e=d.type(a);a.length==null||e==="string"||e==="function"||e==="regexp"||d.isWindow(a)?B.call(c,a):d.merge(c,a)}return c},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length==="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,b,c){var d=[],e;for(var f=0,g=a.length;f<g;f++)e=b(a[f],f,c),e!=null&&(d[d.length]=e);return d.concat.apply([],d)},guid:1,proxy:function(a,c,e){arguments.length===2&&(typeof c==="string"?(e=a,a=e[c],c=b):c&&!d.isFunction(c)&&(e=c,c=b)),!c&&a&&(c=function(){return a.apply(e||this,arguments)}),a&&(c.guid=a.guid=a.guid||c.guid||d.guid++);return c},access:function(a,c,e,f,g,h){var i=a.length;if(typeof c==="object"){for(var j in c)d.access(a,j,c[j],f,g,e);return a}if(e!==b){f=!h&&f&&d.isFunction(e);for(var k=0;k<i;k++)g(a[k],c,f?e.call(a[k],k,g(a[k],c)):e,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}d.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.subclass=this.subclass,a.fn.init=function b(b,c){c&&c instanceof d&&!(c instanceof a)&&(c=a(c));return d.fn.init.call(this,b,c,e)},a.fn.init.prototype=a.fn;var e=a(c);return a},browser:{}}),d.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){F["[object "+b+"]"]=b.toLowerCase()}),w=d.uaMatch(v),w.browser&&(d.browser[w.browser]=!0,d.browser.version=w.version),d.browser.webkit&&(d.browser.safari=!0),E&&(d.inArray=function(a,b){return E.call(b,a)}),i.test(" ")&&(j=/^[\s\xA0]+/,k=/[\s\xA0]+$/),g=d(c),c.addEventListener?y=function(){c.removeEventListener("DOMContentLoaded",y,!1),d.ready()}:c.attachEvent&&(y=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",y),d.ready())});return d}(),e="then done fail isResolved isRejected promise".split(" "),f=[].slice;d.extend({_Deferred:function(){var a=[],b,c,e,f={done:function(){if(!e){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=d.type(i),j==="array"?f.done.apply(f,i):j==="function"&&a.push(i);k&&f.resolveWith(k[0],k[1])}return this},resolveWith:function(d,f){if(!e&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(d,f)}finally{b=[d,f],c=0}}return this},resolve:function(){f.resolveWith(this,arguments);return this},isResolved:function(){return c||b},cancel:function(){e=1,a=[];return this}};return f},Deferred:function(a){var b=d._Deferred(),c=d._Deferred(),f;d.extend(b,{then:function(a,c){b.done(a).fail(c);return this},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,promise:function(a){if(a==null){if(f)return f;f=a={}}var c=e.length;while(c--)a[e[c]]=b[e[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?f.call(arguments,0):c,--g||h.resolveWith(h,f.call(b,0))}}var b=arguments,c=0,e=b.length,g=e,h=e<=1&&a&&d.isFunction(a.promise)?a:d.Deferred();if(e>1){for(;c<e;c++)b[c]&&d.isFunction(b[c].promise)?b[c].promise().then(i(c),h.reject):--g;g||h.resolveWith(h,b)}else h!==a&&h.resolveWith(h,e?[a]:[]);return h.promise()}}),function(){d.support={};var b=c.createElement("div");b.style.display="none",b.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=b.getElementsByTagName("*"),f=b.getElementsByTagName("a")[0],g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=b.getElementsByTagName("input")[0];if(e&&e.length&&f){d.support={leadingWhitespace:b.firstChild.nodeType===3,tbody:!b.getElementsByTagName("tbody").length,htmlSerialize:!!b.getElementsByTagName("link").length,style:/red/.test(f.getAttribute("style")),hrefNormalized:f.getAttribute("href")==="/a",opacity:/^0.55$/.test(f.style.opacity),cssFloat:!!f.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,deleteExpando:!0,optDisabled:!1,checkClone:!1,noCloneEvent:!0,noCloneChecked:!0,boxModel:null,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableHiddenOffsets:!0,reliableMarginRight:!0},i.checked=!0,d.support.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,d.support.optDisabled=!h.disabled;var j=null;d.support.scriptEval=function(){if(j===null){var b=c.documentElement,e=c.createElement("script"),f="script"+d.now();try{e.appendChild(c.createTextNode("window."+f+"=1;"))}catch(g){}b.insertBefore(e,b.firstChild),a[f]?(j=!0,delete a[f]):j=!1,b.removeChild(e)}return j};try{delete b.test}catch(k){d.support.deleteExpando=!1}!b.addEventListener&&b.attachEvent&&b.fireEvent&&(b.attachEvent("onclick",function l(){d.support.noCloneEvent=!1,b.detachEvent("onclick",l)}),b.cloneNode(!0).fireEvent("onclick")),b=c.createElement("div"),b.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";var m=c.createDocumentFragment();m.appendChild(b.firstChild),d.support.checkClone=m.cloneNode(!0).cloneNode(!0).lastChild.checked,d(function(){var a=c.createElement("div"),b=c.getElementsByTagName("body")[0];if(b){a.style.width=a.style.paddingLeft="1px",b.appendChild(a),d.boxModel=d.support.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,d.support.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",d.support.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";var e=a.getElementsByTagName("td");d.support.reliableHiddenOffsets=e[0].offsetHeight===0,e[0].style.display="",e[1].style.display="none",d.support.reliableHiddenOffsets=d.support.reliableHiddenOffsets&&e[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(a.style.width="1px",a.style.marginRight="0",d.support.reliableMarginRight=(parseInt(c.defaultView.getComputedStyle(a,null).marginRight,10)||0)===0),b.removeChild(a).style.display="none",a=e=null}});var n=function(a){var b=c.createElement("div");a="on"+a;if(!b.attachEvent)return!0;var d=a in b;d||(b.setAttribute(a,"return;"),d=typeof b[a]==="function");return d};d.support.submitBubbles=n("submit"),d.support.changeBubbles=n("change"),b=e=f=null}}();var g=/^(?:\{.*\}|\[.*\])$/;d.extend({cache:{},uuid:0,expando:"jQuery"+(d.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?d.cache[a[d.expando]]:a[d.expando];return!!a&&!i(a)},data:function(a,c,e,f){if(d.acceptData(a)){var g=d.expando,h=typeof c==="string",i,j=a.nodeType,k=j?d.cache:a,l=j?a[d.expando]:a[d.expando]&&d.expando;if((!l||f&&l&&!k[l][g])&&h&&e===b)return;l||(j?a[d.expando]=l=++d.uuid:l=d.expando),k[l]||(k[l]={},j||(k[l].toJSON=d.noop));if(typeof c==="object"||typeof c==="function")f?k[l][g]=d.extend(k[l][g],c):k[l]=d.extend(k[l],c);i=k[l],f&&(i[g]||(i[g]={}),i=i[g]),e!==b&&(i[c]=e);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[c]:i}},removeData:function(b,c,e){if(d.acceptData(b)){var f=d.expando,g=b.nodeType,h=g?d.cache:b,j=g?b[d.expando]:d.expando;if(!h[j])return;if(c){var k=e?h[j][f]:h[j];if(k){delete k[c];if(!i(k))return}}if(e){delete h[j][f];if(!i(h[j]))return}var l=h[j][f];d.support.deleteExpando||h!=a?delete h[j]:h[j]=null,l?(h[j]={},g||(h[j].toJSON=d.noop),h[j][f]=l):g&&(d.support.deleteExpando?delete b[d.expando]:b.removeAttribute?b.removeAttribute(d.expando):b[d.expando]=null)}},_data:function(a,b,c){return d.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=d.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),d.fn.extend({data:function(a,c){var e=null;if(typeof a==="undefined"){if(this.length){e=d.data(this[0]);if(this[0].nodeType===1){var f=this[0].attributes,g;for(var i=0,j=f.length;i<j;i++)g=f[i].name,g.indexOf("data-")===0&&(g=g.substr(5),h(this[0],g,e[g]))}}return e}if(typeof a==="object")return this.each(function(){d.data(this,a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(c===b){e=this.triggerHandler("getData"+k[1]+"!",[k[0]]),e===b&&this.length&&(e=d.data(this[0],a),e=h(this[0],a,e));return e===b&&k[1]?this.data(k[0]):e}return this.each(function(){var b=d(this),e=[k[0],c];b.triggerHandler("setData"+k[1]+"!",e),d.data(this,a,c),b.triggerHandler("changeData"+k[1]+"!",e)})},removeData:function(a){return this.each(function(){d.removeData(this,a)})}}),d.extend({queue:function(a,b,c){if(a){b=(b||"fx")+"queue";var e=d._data(a,b);if(!c)return e||[];!e||d.isArray(c)?e=d._data(a,b,d.makeArray(c)):e.push(c);return e}},dequeue:function(a,b){b=b||"fx";var c=d.queue(a,b),e=c.shift();e==="inprogress"&&(e=c.shift()),e&&(b==="fx"&&c.unshift("inprogress"),e.call(a,function(){d.dequeue(a,b)})),c.length||d.removeData(a,b+"queue",!0)}}),d.fn.extend({queue:function(a,c){typeof a!=="string"&&(c=a,a="fx");if(c===b)return d.queue(this[0],a);return this.each(function(b){var e=d.queue(this,a,c);a==="fx"&&e[0]!=="inprogress"&&d.dequeue(this,a)})},dequeue:function(a){return this.each(function(){d.dequeue(this,a)})},delay:function(a,b){a=d.fx?d.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){d.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var j=/[\n\t\r]/g,k=/\s+/,l=/\r/g,m=/^(?:href|src|style)$/,n=/^(?:button|input)$/i,o=/^(?:button|input|object|select|textarea)$/i,p=/^a(?:rea)?$/i,q=/^(?:radio|checkbox)$/i;d.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"},d.fn.extend({attr:function(a,b){return d.access(this,a,b,!0,d.attr)},removeAttr:function(a,b){return this.each(function(){d.attr(this,a,""),this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.addClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"){var b=(a||"").split(k);for(var c=0,e=this.length;c<e;c++){var f=this[c];if(f.nodeType===1)if(f.className){var g=" "+f.className+" ",h=f.className;for(var i=0,j=b.length;i<j;i++)g.indexOf(" "+b[i]+" ")<0&&(h+=" "+b[i]);f.className=d.trim(h)}else f.className=a}}return this},removeClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.removeClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"||a===b){var c=(a||"").split(k);for(var e=0,f=this.length;e<f;e++){var g=this[e];if(g.nodeType===1&&g.className)if(a){var h=(" "+g.className+" ").replace(j," ");for(var i=0,l=c.length;i<l;i++)h=h.replace(" "+c[i]+" "," ");g.className=d.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,e=typeof b==="boolean";if(d.isFunction(a))return this.each(function(c){var e=d(this);e.toggleClass(a.call(this,c,e.attr("class"),b),b)});return this.each(function(){if(c==="string"){var f,g=0,h=d(this),i=b,j=a.split(k);while(f=j[g++])i=e?i:!h.hasClass(f),h[i?"addClass":"removeClass"](f)}else if(c==="undefined"||c==="boolean")this.className&&d._data(this,"__className__",this.className),this.className=this.className||a===!1?"":d._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(j," ").indexOf(b)>-1)return!0;return!1},val:function(a){if(!arguments.length){var c=this[0];if(c){if(d.nodeName(c,"option")){var e=c.attributes.value;return!e||e.specified?c.value:c.text}if(d.nodeName(c,"select")){var f=c.selectedIndex,g=[],h=c.options,i=c.type==="select-one";if(f<0)return null;for(var j=i?f:0,k=i?f+1:h.length;j<k;j++){var m=h[j];if(m.selected&&(d.support.optDisabled?!m.disabled:m.getAttribute("disabled")===null)&&(!m.parentNode.disabled||!d.nodeName(m.parentNode,"optgroup"))){a=d(m).val();if(i)return a;g.push(a)}}if(i&&!g.length&&h.length)return d(h[f]).val();return g}if(q.test(c.type)&&!d.support.checkOn)return c.getAttribute("value")===null?"on":c.value;return(c.value||"").replace(l,"")}return b}var n=d.isFunction(a);return this.each(function(b){var c=d(this),e=a;if(this.nodeType===1){n&&(e=a.call(this,b,c.val())),e==null?e="":typeof e==="number"?e+="":d.isArray(e)&&(e=d.map(e,function(a){return a==null?"":a+""}));if(d.isArray(e)&&q.test(this.type))this.checked=d.inArray(c.val(),e)>=0;else if(d.nodeName(this,"select")){var f=d.makeArray(e);d("option",this).each(function(){this.selected=d.inArray(d(this).val(),f)>=0}),f.length||(this.selectedIndex=-1)}else this.value=e}})}}),d.extend({attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,e,f){if(!a||a.nodeType===3||a.nodeType===8||a.nodeType===2)return b;if(f&&c in d.attrFn)return d(a)[c](e);var g=a.nodeType!==1||!d.isXMLDoc(a),h=e!==b;c=g&&d.props[c]||c;if(a.nodeType===1){var i=m.test(c);if(c==="selected"&&!d.support.optSelected){var j=a.parentNode;j&&(j.selectedIndex,j.parentNode&&j.parentNode.selectedIndex)}if((c in a||a[c]!==b)&&g&&!i){h&&(c==="type"&&n.test(a.nodeName)&&a.parentNode&&d.error("type property can't be changed"),e===null?a.nodeType===1&&a.removeAttribute(c):a[c]=e);if(d.nodeName(a,"form")&&a.getAttributeNode(c))return a.getAttributeNode(c).nodeValue;if(c==="tabIndex"){var k=a.getAttributeNode("tabIndex");return k&&k.specified?k.value:o.test(a.nodeName)||p.test(a.nodeName)&&a.href?0:b}return a[c]}if(!d.support.style&&g&&c==="style"){h&&(a.style.cssText=""+e);return a.style.cssText}h&&a.setAttribute(c,""+e);if(!a.attributes[c]&&(a.hasAttribute&&!a.hasAttribute(c)))return b;var l=!d.support.hrefNormalized&&g&&i?a.getAttribute(c,2):a.getAttribute(c);return l===null?b:l}h&&(a[c]=e);return a[c]}});var r=/\.(.*)$/,s=/^(?:textarea|input|select)$/i,t=/\./g,u=/ /g,v=/[^\w\s.|`]/g,w=function(a){return a.replace(v,"\\$&")};d.event={add:function(c,e,f,g){if(c.nodeType!==3&&c.nodeType!==8){try{d.isWindow(c)&&(c!==a&&!c.frameElement)&&(c=a)}catch(h){}if(f===!1)f=x;else if(!f)return;var i,j;f.handler&&(i=f,f=i.handler),f.guid||(f.guid=d.guid++);var k=d._data(c);if(!k)return;var l=k.events,m=k.handle;l||(k.events=l={}),m||(k.handle=m=function(a){return typeof d!=="undefined"&&d.event.triggered!==a.type?d.event.handle.apply(m.elem,arguments):b}),m.elem=c,e=e.split(" ");var n,o=0,p;while(n=e[o++]){j=i?d.extend({},i):{handler:f,data:g},n.indexOf(".")>-1?(p=n.split("."),n=p.shift(),j.namespace=p.slice(0).sort().join(".")):(p=[],j.namespace=""),j.type=n,j.guid||(j.guid=f.guid);var q=l[n],r=d.event.special[n]||{};if(!q){q=l[n]=[];if(!r.setup||r.setup.call(c,g,p,m)===!1)c.addEventListener?c.addEventListener(n,m,!1):c.attachEvent&&c.attachEvent("on"+n,m)}r.add&&(r.add.call(c,j),j.handler.guid||(j.handler.guid=f.guid)),q.push(j),d.event.global[n]=!0}c=null}},global:{},remove:function(a,c,e,f){if(a.nodeType!==3&&a.nodeType!==8){e===!1&&(e=x);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=d.hasData(a)&&d._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(e=c.handler,c=c.type);if(!c||typeof c==="string"&&c.charAt(0)==="."){c=c||"";for(h in t)d.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+d.map(m.slice(0).sort(),w).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!e){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))d.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=d.event.special[h]||{};for(j=f||0;j<p.length;j++){q=p[j];if(e.guid===q.guid){if(l||n.test(q.namespace))f==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(f!=null)break}}if(p.length===0||f!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&d.removeEvent(a,h,s.handle),g=null,delete t[h]}if(d.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,d.isEmptyObject(s)&&d.removeData(a,b,!0)}}},trigger:function(a,c,e){var f=a.type||a,g=arguments[3];if(!g){a=typeof a==="object"?a[d.expando]?a:d.extend(d.Event(f),a):d.Event(f),f.indexOf("!")>=0&&(a.type=f=f.slice(0,-1),a.exclusive=!0),e||(a.stopPropagation(),d.event.global[f]&&d.each(d.cache,function(){var b=d.expando,e=this[b];e&&e.events&&e.events[f]&&d.event.trigger(a,c,e.handle.elem)}));if(!e||e.nodeType===3||e.nodeType===8)return b;a.result=b,a.target=e,c=d.makeArray(c),c.unshift(a)}a.currentTarget=e;var h=d._data(e,"handle");h&&h.apply(e,c);var i=e.parentNode||e.ownerDocument;try{e&&e.nodeName&&d.noData[e.nodeName.toLowerCase()]||e["on"+f]&&e["on"+f].apply(e,c)===!1&&(a.result=!1,a.preventDefault())}catch(j){}if(!a.isPropagationStopped()&&i)d.event.trigger(a,c,i,!0);else if(!a.isDefaultPrevented()){var k,l=a.target,m=f.replace(r,""),n=d.nodeName(l,"a")&&m==="click",o=d.event.special[m]||{};if((!o._default||o._default.call(e,a)===!1)&&!n&&!(l&&l.nodeName&&d.noData[l.nodeName.toLowerCase()])){try{l[m]&&(k=l["on"+m],k&&(l["on"+m]=null),d.event.triggered=a.type,l[m]())}catch(p){}k&&(l["on"+m]=k),d.event.triggered=b}}},handle:function(c){var e,f,g,h,i,j=[],k=d.makeArray(arguments);c=k[0]=d.event.fix(c||a.event),c.currentTarget=this,e=c.type.indexOf(".")<0&&!c.exclusive,e||(g=c.type.split("."),c.type=g.shift(),j=g.slice(0).sort(),h=new RegExp("(^|\\.)"+j.join("\\.(?:.*\\.)?")+"(\\.|$)")),c.namespace=c.namespace||j.join("."),i=d._data(this,"events"),f=(i||{})[c.type];if(i&&f){f=f.slice(0);for(var l=0,m=f.length;l<m;l++){var n=f[l];if(e||h.test(n.namespace)){c.handler=n.handler,c.data=n.data,c.handleObj=n;var o=n.handler.apply(this,k);o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[d.expando])return a;var e=a;a=d.Event(e);for(var f=this.props.length,g;f;)g=this.props[--f],a[g]=e[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=c.documentElement,i=c.body;a.pageX=a.clientX+(h&&h.scrollLeft||i&&i.scrollLeft||0)-(h&&h.clientLeft||i&&i.clientLeft||0),a.pageY=a.clientY+(h&&h.scrollTop||i&&i.scrollTop||0)-(h&&h.clientTop||i&&i.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:d.proxy,special:{ready:{setup:d.bindReady,teardown:d.noop},live:{add:function(a){d.event.add(this,H(a.origType,a.selector),d.extend({},a,{handler:G,guid:a.handler.guid}))},remove:function(a){d.event.remove(this,H(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){d.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},d.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},d.Event=function(a){if(!this.preventDefault)return new d.Event(a);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?y:x):this.type=a,this.timeStamp=d.now(),this[d.expando]=!0},d.Event.prototype={preventDefault:function(){this.isDefaultPrevented=y;var a=this.originalEvent;a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=y;var a=this.originalEvent;a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=y,this.stopPropagation()},isDefaultPrevented:x,isPropagationStopped:x,isImmediatePropagationStopped:x};var z=function(a){var b=a.relatedTarget;try{if(b&&b!==c&&!b.parentNode)return;while(b&&b!==this)b=b.parentNode;b!==this&&(a.type=a.data,d.event.handle.apply(this,arguments))}catch(e){}},A=function(a){a.type=a.data,d.event.handle.apply(this,arguments)};d.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){d.event.special[a]={setup:function(c){d.event.add(this,b,c&&c.selector?A:z,a)},teardown:function(a){d.event.remove(this,b,a&&a.selector?A:z)}}}),d.support.submitBubbles||(d.event.special.submit={setup:function(a,b){if(this.nodeName&&this.nodeName.toLowerCase()!=="form")d.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&d(b).closest("form").length&&E("submit",this,arguments)}),d.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&d(b).closest("form").length&&a.keyCode===13&&E("submit",this,arguments)});else return!1},teardown:function(a){d.event.remove(this,".specialSubmit")}});if(!d.support.changeBubbles){var B,C=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?d.map(a.options,function(a){return a.selected}).join("-"):"":a.nodeName.toLowerCase()==="select"&&(c=a.selectedIndex);return c},D=function D(a){var c=a.target,e,f;if(s.test(c.nodeName)&&!c.readOnly){e=d._data(c,"_change_data"),f=C(c),(a.type!=="focusout"||c.type!=="radio")&&d._data(c,"_change_data",f);if(e===b||f===e)return;if(e!=null||f)a.type="change",a.liveFired=b,d.event.trigger(a,arguments[1],c)}};d.event.special.change={filters:{focusout:D,beforedeactivate:D,click:function(a){var b=a.target,c=b.type;(c==="radio"||c==="checkbox"||b.nodeName.toLowerCase()==="select")&&D.call(this,a)},keydown:function(a){var b=a.target,c=b.type;(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&D.call(this,a)},beforeactivate:function(a){var b=a.target;d._data(b,"_change_data",C(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in B)d.event.add(this,c+".specialChange",B[c]);return s.test(this.nodeName)},teardown:function(a){d.event.remove(this,".specialChange");return s.test(this.nodeName)}},B=d.event.special.change.filters,B.focus=B.beforeactivate}c.addEventListener&&d.each({focus:"focusin",blur:"focusout"},function(a,b){function f(a){var c=d.event.fix(a);c.type=b,c.originalEvent={},d.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var e=0;d.event.special[b]={setup:function(){e++===0&&c.addEventListener(a,f,!0)},teardown:function(){--e===0&&c.removeEventListener(a,f,!0)}}}),d.each(["bind","one"],function(a,c){d.fn[c]=function(a,e,f){if(typeof a==="object"){for(var g in a)this[c](g,e,a[g],f);return this}if(d.isFunction(e)||e===!1)f=e,e=b;var h=c==="one"?d.proxy(f,function(a){d(this).unbind(a,h);return f.apply(this,arguments)}):f;if(a==="unload"&&c!=="one")this.one(a,e,f);else for(var i=0,j=this.length;i<j;i++)d.event.add(this[i],a,h,e);return this}}),d.fn.extend({unbind:function(a,b){if(typeof a!=="object"||a.preventDefault)for(var e=0,f=this.length;e<f;e++)d.event.remove(this[e],a,b);else for(var c in a)this.unbind(c,a[c]);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){d.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var c=d.Event(a);c.preventDefault(),c.stopPropagation(),d.event.trigger(c,b,this[0]);return c.result}},toggle:function(a){var b=arguments,c=1;while(c<b.length)d.proxy(a,b[c++]);return this.click(d.proxy(a,function(e){var f=(d._data(this,"lastToggle"+a.guid)||0)%c;d._data(this,"lastToggle"+a.guid,f+1),e.preventDefault();return b[f].apply(this,arguments)||!1}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var F={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};d.each(["live","die"],function(a,c){d.fn[c]=function(a,e,f,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:d(this.context);if(typeof a==="object"&&!a.preventDefault){for(var o in a)n[c](o,e,a[o],m);return this}d.isFunction(e)&&(f=e,e=b),a=(a||"").split(" ");while((h=a[i++])!=null){j=r.exec(h),k="",j&&(k=j[0],h=h.replace(r,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,h==="focus"||h==="blur"?(a.push(F[h]+k),h=h+k):h=(F[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)d.event.add(n[p],"live."+H(h,m),{data:e,selector:m,handler:f,origType:h,origHandler:f,preType:l});else n.unbind("live."+H(h,m),f)}return this}}),d.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){d.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},d.attrFn&&(d.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!=="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,e,g){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=="string")return e;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(f.call(n)==="[object Array]")if(u)if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&e.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&e.push(j[t]);else e.push.apply(e,n);else p(n,e);o&&(k(o,h,e,g),k.uniqueSort(e));return e};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!=="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(f){if(f===!0)continue}else g=o=!0}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b==="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1){}a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b==="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!=="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!=="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!=="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return"text"===c&&(b===c||b===null)},radio:function(a){return"radio"===a.type},checkbox:function(a){return"checkbox"===a.type},file:function(a){return"file"===a.type},password:function(a){return"password"===a.type},submit:function(a){return"submit"===a.type},image:function(a){return"image"===a.type},reset:function(a){return"reset"===a.type},button:function(a){return"button"===a.type||a.nodeName.toLowerCase()==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(f.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length==="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(a===b){g=!0;return 0}if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!=="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!=="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!=="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};d.find=k,d.expr=k.selectors,d.expr[":"]=d.expr.filters,d.unique=k.uniqueSort,d.text=k.getText,d.isXMLDoc=k.isXML,d.contains=k.contains}();var I=/Until$/,J=/^(?:parents|prevUntil|prevAll)/,K=/,/,L=/^.[^:#\[\.,]*$/,M=Array.prototype.slice,N=d.expr.match.POS,O={children:!0,contents:!0,next:!0,prev:!0};d.fn.extend({find:function(a){var b=this.pushStack("","find",a),c=0;for(var e=0,f=this.length;e<f;e++){c=b.length,d.find(a,this[e],b);if(e>0)for(var g=c;g<b.length;g++)for(var h=0;h<c;h++)if(b[h]===b[g]){b.splice(g--,1);break}}return b},has:function(a){var b=d(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(d.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(Q(this,a,!1),"not",a)},filter:function(a){return this.pushStack(Q(this,a,!0),"filter",a)},is:function(a){return!!a&&d.filter(a,this).length>0},closest:function(a,b){var c=[],e,f,g=this[0];if(d.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(e=0,f=a.length;e<f;e++)i=a[e],j[i]||(j[i]=d.expr.match.POS.test(i)?d(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:d(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=N.test(a)?d(a,b||this.context):null;for(e=0,f=this.length;e<f;e++){g=this[e];while(g){if(l?l.index(g)>-1:d.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b)break}}c=c.length>1?d.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a==="string")return d.inArray(this[0],a?d(a):this.parent().children());return d.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==="string"?d(a,b):d.makeArray(a),e=d.merge(this.get(),c);return this.pushStack(P(c[0])||P(e[0])?e:d.unique(e))},andSelf:function(){return this.add(this.prevObject)}}),d.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return d.dir(a,"parentNode")},parentsUntil:function(a,b,c){return d.dir(a,"parentNode",c)},next:function(a){return d.nth(a,2,"nextSibling")},prev:function(a){return d.nth(a,2,"previousSibling")},nextAll:function(a){return d.dir(a,"nextSibling")},prevAll:function(a){return d.dir(a,"previousSibling")},nextUntil:function(a,b,c){return d.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return d.dir(a,"previousSibling",c)},siblings:function(a){return d.sibling(a.parentNode.firstChild,a)},children:function(a){return d.sibling(a.firstChild)},contents:function(a){return d.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:d.makeArray(a.childNodes)}},function(a,b){d.fn[a]=function(c,e){var f=d.map(this,b,c),g=M.call(arguments);I.test(a)||(e=c),e&&typeof e==="string"&&(f=d.filter(e,f)),f=this.length>1&&!O[a]?d.unique(f):f,(this.length>1||K.test(e))&&J.test(a)&&(f=f.reverse());return this.pushStack(f,a,g.join(","))}}),d.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?d.find.matchesSelector(b[0],a)?[b[0]]:[]:d.find.matches(a,b)},dir:function(a,c,e){var f=[],g=a[c];while(g&&g.nodeType!==9&&(e===b||g.nodeType!==1||!d(g).is(e)))g.nodeType===1&&f.push(g),g=g[c];return f},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var R=/ jQuery\d+="(?:\d+|null)"/g,S=/^\s+/,T=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,U=/<([\w:]+)/,V=/<tbody/i,W=/<|&#?\w+;/,X=/<(?:script|object|embed|option|style)/i,Y=/checked\s*(?:[^=]|=\s*.checked.)/i,Z={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};Z.optgroup=Z.option,Z.tbody=Z.tfoot=Z.colgroup=Z.caption=Z.thead,Z.th=Z.td,d.support.htmlSerialize||(Z._default=[1,"div<div>","</div>"]),d.fn.extend({text:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.text(a.call(this,b,c.text()))});if(typeof a!=="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return d.text(this)},wrapAll:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapAll(a.call(this,b))});if(this[0]){var b=d(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapInner(a.call(this,b))});return this.each(function(){var b=d(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){d(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){d.nodeName(this,"body")||d(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=d(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,d(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,e;(e=this[c])!=null;c++)if(!a||d.filter(a,[e]).length)!b&&e.nodeType===1&&(d.cleanData(e.getElementsByTagName("*")),d.cleanData([e])),e.parentNode&&e.parentNode.removeChild(e);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&d.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return d.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(R,""):null;if(typeof a!=="string"||X.test(a)||!d.support.leadingWhitespace&&S.test(a)||Z[(U.exec(a)||["",""])[1].toLowerCase()])d.isFunction(a)?this.each(function(b){var c=d(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);else{a=a.replace(T,"<$1></$2>");try{for(var c=0,e=this.length;c<e;c++)this[c].nodeType===1&&(d.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(f){this.empty().append(a)}}return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(d.isFunction(a))return this.each(function(b){var c=d(this),e=c.html();c.replaceWith(a.call(this,b,e))});typeof a!=="string"&&(a=d(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;d(this).remove(),b?d(b).before(a):d(c).append(a)})}return this.length?this.pushStack(d(d.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,e){var f,g,h,i,j=a[0],k=[];if(!d.support.checkClone&&arguments.length===3&&typeof j==="string"&&Y.test(j))return this.each(function(){d(this).domManip(a,c,e,!0)});if(d.isFunction(j))return this.each(function(f){var g=d(this);a[0]=j.call(this,f,c?g.html():b),g.domManip(a,c,e)});if(this[0]){i=j&&j.parentNode,d.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?f={fragment:i}:f=d.buildFragment(a,this,k),h=f.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&d.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)e.call(c?$(this[l],g):this[l],f.cacheable||m>1&&l<n?d.clone(h,!0,!0):h)}k.length&&d.each(k,bc)}return this}}),d.buildFragment=function(a,b,e){var f,g,h,i=b&&b[0]?b[0].ownerDocument||b[0]:c;a.length===1&&typeof a[0]==="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!X.test(a[0])&&(d.support.checkClone||!Y.test(a[0]))&&(g=!0,h=d.fragments[a[0]],h&&(h!==1&&(f=h))),f||(f=i.createDocumentFragment(),d.clean(a,i,f,e)),g&&(d.fragments[a[0]]=h?f:1);return{fragment:f,cacheable:g}},d.fragments={},d.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){d.fn[a]=function(c){var e=[],f=d(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&f.length===1){f[b](this[0]);return this}for(var h=0,i=f.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();d(f[h])[b](j),e=e.concat(j)}return this.pushStack(e,a,f.selector)}}),d.extend({clone:function(a,b,c){var e=a.cloneNode(!0),f,g,h;if((!d.support.noCloneEvent||!d.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!d.isXMLDoc(a)){ba(a,e),f=bb(a),g=bb(e);for(h=0;f[h];++h)ba(f[h],g[h])}if(b){_(a,e);if(c){f=bb(a),g=bb(e);for(h=0;f[h];++h)_(f[h],g[h])}}return e},clean:function(a,b,e,f){b=b||c,typeof b.createElement==="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var g=[];for(var h=0,i;(i=a[h])!=null;h++){typeof i==="number"&&(i+="");if(!i)continue;if(typeof i!=="string"||W.test(i)){if(typeof i==="string"){i=i.replace(T,"<$1></$2>");var j=(U.exec(i)||["",""])[1].toLowerCase(),k=Z[j]||Z._default,l=k[0],m=b.createElement("div");m.innerHTML=k[1]+i+k[2];while(l--)m=m.lastChild;if(!d.support.tbody){var n=V.test(i),o=j==="table"&&!n?m.firstChild&&m.firstChild.childNodes:k[1]==="<table>"&&!n?m.childNodes:[];for(var p=o.length-1;p>=0;--p)d.nodeName(o[p],"tbody")&&!o[p].childNodes.length&&o[p].parentNode.removeChild(o[p])}!d.support.leadingWhitespace&&S.test(i)&&m.insertBefore(b.createTextNode(S.exec(i)[0]),m.firstChild),i=m.childNodes}}else i=b.createTextNode(i);i.nodeType?g.push(i):g=d.merge(g,i)}if(e)for(h=0;g[h];h++)!f||!d.nodeName(g[h],"script")||g[h].type&&g[h].type.toLowerCase()!=="text/javascript"?(g[h].nodeType===1&&g.splice.apply(g,[h+1,0].concat(d.makeArray(g[h].getElementsByTagName("script")))),e.appendChild(g[h])):f.push(g[h].parentNode?g[h].parentNode.removeChild(g[h]):g[h]);return g},cleanData:function(a){var b,c,e=d.cache,f=d.expando,g=d.event.special,h=d.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&d.noData[j.nodeName.toLowerCase()])continue;c=j[d.expando];if(c){b=e[c]&&e[c][f];if(b&&b.events){for(var k in b.events)g[k]?d.event.remove(j,k):d.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[d.expando]:j.removeAttribute&&j.removeAttribute(d.expando),delete e[c]}}}});var bd=/alpha\([^)]*\)/i,be=/opacity=([^)]*)/,bf=/-([a-z])/ig,bg=/([A-Z]|^ms)/g,bh=/^-?\d+(?:px)?$/i,bi=/^-?\d/,bj={position:"absolute",visibility:"hidden",display:"block"},bk=["Left","Right"],bl=["Top","Bottom"],bm,bn,bo,bp=function(a,b){return b.toUpperCase()};d.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return d.access(this,a,c,!0,function(a,c,e){return e!==b?d.style(a,c,e):d.css(a,c)})},d.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bm(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{zIndex:!0,fontWeight:!0,opacity:!0,zoom:!0,lineHeight:!0},cssProps:{"float":d.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,e,f){if(a&&a.nodeType!==3&&a.nodeType!==8&&a.style){var g,h=d.camelCase(c),i=a.style,j=d.cssHooks[h];c=d.cssProps[h]||h;if(e===b){if(j&&"get"in j&&(g=j.get(a,!1,f))!==b)return g;return i[c]}if(typeof e==="number"&&isNaN(e)||e==null)return;typeof e==="number"&&!d.cssNumber[h]&&(e+="px");if(!j||!("set"in j)||(e=j.set(a,e))!==b)try{i[c]=e}catch(k){}}},css:function(a,c,e){var f,g=d.camelCase(c),h=d.cssHooks[g];c=d.cssProps[g]||g;if(h&&"get"in h&&(f=h.get(a,!0,e))!==b)return f;if(bm)return bm(a,c,g)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]},camelCase:function(a){return a.replace(bf,bp)}}),d.curCSS=d.css,d.each(["height","width"],function(a,b){d.cssHooks[b]={get:function(a,c,e){var f;if(c){a.offsetWidth!==0?f=bq(a,b,e):d.swap(a,bj,function(){f=bq(a,b,e)});if(f<=0){f=bm(a,b,b),f==="0px"&&bo&&(f=bo(a,b,b));if(f!=null)return f===""||f==="auto"?"0px":f}if(f<0||f==null){f=a.style[b];return f===""||f==="auto"?"0px":f}return typeof f==="string"?f:f+"px"}},set:function(a,b){if(!bh.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),d.support.opacity||(d.cssHooks.opacity={get:function(a,b){return be.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style;c.zoom=1;var e=d.isNaN(b)?"":"alpha(opacity="+b*100+")",f=c.filter||"";c.filter=bd.test(f)?f.replace(bd,e):c.filter+" "+e}}),d(function(){d.support.reliableMarginRight||(d.cssHooks.marginRight={get:function(a,b){var c;d.swap(a,{display:"inline-block"},function(){b?c=bm(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bn=function(a,c,e){var f,g,h;e=e.replace(bg,"-$1").toLowerCase();if(!(g=a.ownerDocument.defaultView))return b;if(h=g.getComputedStyle(a,null))f=h.getPropertyValue(e),f===""&&!d.contains(a.ownerDocument.documentElement,a)&&(f=d.style(a,e));return f}),c.documentElement.currentStyle&&(bo=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bh.test(d)&&bi.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bm=bn||bo,d.expr&&d.expr.filters&&(d.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!d.support.reliableHiddenOffsets&&(a.style.display||d.css(a,"display"))==="none"},d.expr.filters.visible=function(a){return!d.expr.filters.hidden(a)});var br=/%20/g,bs=/\[\]$/,bt=/\r?\n/g,bu=/#.*$/,bv=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bw=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bx=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,by=/^(?:GET|HEAD)$/,bz=/^\/\//,bA=/\?/,bB=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bC=/^(?:select|textarea)/i,bD=/\s+/,bE=/([?&])_=[^&]*/,bF=/(^|\-)([a-z])/g,bG=function(a,b,c){return b+c.toUpperCase()},bH=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bI=d.fn.load,bJ={},bK={},bL,bM;try{bL=c.location.href}catch(bN){bL=c.createElement("a"),bL.href="",bL=bL.href}bM=bH.exec(bL.toLowerCase())||[],d.fn.extend({load:function(a,c,e){if(typeof a!=="string"&&bI)return bI.apply(this,arguments);if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var g=a.slice(f,a.length);a=a.slice(0,f)}var h="GET";c&&(d.isFunction(c)?(e=c,c=b):typeof c==="object"&&(c=d.param(c,d.ajaxSettings.traditional),h="POST"));var i=this;d.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?d("<div>").append(c.replace(bB,"")).find(g):c)),e&&i.each(e,[c,b,a])}});return this},serialize:function(){return d.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?d.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bC.test(this.nodeName)||bw.test(this.type))}).map(function(a,b){var c=d(this).val();return c==null?null:d.isArray(c)?d.map(c,function(a,c){return{name:b.name,value:a.replace(bt,"\r\n")}}):{name:b.name,value:c.replace(bt,"\r\n")}}).get()}}),d.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){d.fn[b]=function(a){return this.bind(b,a)}}),d.each(["get","post"],function(a,c){d[c]=function(a,e,f,g){d.isFunction(e)&&(g=g||f,f=e,e=b);return d.ajax({type:c,url:a,data:e,success:f,dataType:g})}}),d.extend({getScript:function(a,c){return d.get(a,b,c,"script")},getJSON:function(a,b,c){return d.get(a,b,c,"json")},ajaxSetup:function(a,b){b?d.extend(!0,a,d.ajaxSettings,b):(b=a,a=d.extend(!0,d.ajaxSettings,b));for(var c in {context:1,url:1})c in b?a[c]=b[c]:c in d.ajaxSettings&&(a[c]=d.ajaxSettings[c]);return a},ajaxSettings:{url:bL,isLocal:bx.test(bM[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":d.parseJSON,"text xml":d.parseXML}},ajaxPrefilter:bO(bJ),ajaxTransport:bO(bK),ajax:function(a,c){function v(a,c,l,n){if(r!==2){r=2,p&&clearTimeout(p),o=b,m=n||"",u.readyState=a?4:0;var q,t,v,w=l?bR(e,u,l):b,x,y;if(a>=200&&a<300||a===304){if(e.ifModified){if(x=u.getResponseHeader("Last-Modified"))d.lastModified[k]=x;if(y=u.getResponseHeader("Etag"))d.etag[k]=y}if(a===304)c="notmodified",q=!0;else try{t=bS(e,w),c="success",q=!0}catch(z){c="parsererror",v=z}}else{v=c;if(!c||a)c="error",a<0&&(a=0)}u.status=a,u.statusText=c,q?h.resolveWith(f,[t,c,u]):h.rejectWith(f,[u,c,v]),u.statusCode(j),j=b,s&&g.trigger("ajax"+(q?"Success":"Error"),[u,e,q?t:v]),i.resolveWith(f,[u,c]),s&&(g.trigger("ajaxComplete",[u,e]),--d.active||d.event.trigger("ajaxStop"))}}typeof a==="object"&&(c=a,a=b),c=c||{};var e=d.ajaxSetup({},c),f=e.context||e,g=f!==e&&(f.nodeType||f instanceof d)?d(f):d.event,h=d.Deferred(),i=d._Deferred(),j=e.statusCode||{},k,l={},m,n,o,p,q,r=0,s,t,u={readyState:0,setRequestHeader:function(a,b){r||(l[a.toLowerCase().replace(bF,bG)]=b);return this},getAllResponseHeaders:function(){return r===2?m:null},getResponseHeader:function(a){var c;if(r===2){if(!n){n={};while(c=bv.exec(m))n[c[1].toLowerCase()]=c[2]}c=n[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){r||(e.mimeType=a);return this},abort:function(a){a=a||"abort",o&&o.abort(a),v(0,a);return this}};h.promise(u),u.success=u.done,u.error=u.fail,u.complete=i.done,u.statusCode=function(a){if(a){var b;if(r<2)for(b in a)j[b]=[j[b],a[b]];else b=a[u.status],u.then(b,b)}return this},e.url=((a||e.url)+"").replace(bu,"").replace(bz,bM[1]+"//"),e.dataTypes=d.trim(e.dataType||"*").toLowerCase().split(bD),e.crossDomain==null&&(q=bH.exec(e.url.toLowerCase()),e.crossDomain=q&&(q[1]!=bM[1]||q[2]!=bM[2]||(q[3]||(q[1]==="http:"?80:443))!=(bM[3]||(bM[1]==="http:"?80:443)))),e.data&&e.processData&&typeof e.data!=="string"&&(e.data=d.param(e.data,e.traditional)),bP(bJ,e,c,u);if(r===2)return!1;s=e.global,e.type=e.type.toUpperCase(),e.hasContent=!by.test(e.type),s&&d.active++===0&&d.event.trigger("ajaxStart");if(!e.hasContent){e.data&&(e.url+=(bA.test(e.url)?"&":"?")+e.data),k=e.url;if(e.cache===!1){var w=d.now(),x=e.url.replace(bE,"$1_="+w);e.url=x+(x===e.url?(bA.test(e.url)?"&":"?")+"_="+w:"")}}if(e.data&&e.hasContent&&e.contentType!==!1||c.contentType)l["Content-Type"]=e.contentType;e.ifModified&&(k=k||e.url,d.lastModified[k]&&(l["If-Modified-Since"]=d.lastModified[k]),d.etag[k]&&(l["If-None-Match"]=d.etag[k])),l.Accept=e.dataTypes[0]&&e.accepts[e.dataTypes[0]]?e.accepts[e.dataTypes[0]]+(e.dataTypes[0]!=="*"?", */*; q=0.01":""):e.accepts["*"];for(t in e.headers)u.setRequestHeader(t,e.headers[t]);if(e.beforeSend&&(e.beforeSend.call(f,u,e)===!1||r===2)){u.abort();return!1}for(t in {success:1,error:1,complete:1})u[t](e[t]);o=bP(bK,e,c,u);if(o){u.readyState=1,s&&g.trigger("ajaxSend",[u,e]),e.async&&e.timeout>0&&(p=setTimeout(function(){u.abort("timeout")},e.timeout));try{r=1,o.send(l,v)}catch(y){status<2?v(-1,y):d.error(y)}}else v(-1,"No Transport");return u},param:function(a,c){var e=[],f=function(a,b){b=d.isFunction(b)?b():b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=d.ajaxSettings.traditional);if(d.isArray(a)||a.jquery&&!d.isPlainObject(a))d.each(a,function(){f(this.name,this.value)});else for(var g in a)bQ(g,a[g],c,f);return e.join("&").replace(br,"+")}}),d.extend({active:0,lastModified:{},etag:{}});var bT=d.now(),bU=/(\=)\?(&|$)|\?\?/i;d.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return d.expando+"_"+bT++}}),d.ajaxPrefilter("json jsonp",function(b,c,e){var f=typeof b.data==="string";if(b.dataTypes[0]==="jsonp"||c.jsonpCallback||c.jsonp!=null||b.jsonp!==!1&&(bU.test(b.url)||f&&bU.test(b.data))){var g,h=b.jsonpCallback=d.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2",m=function(){a[h]=i,g&&d.isFunction(i)&&a[h](g[0])};b.jsonp!==!1&&(j=j.replace(bU,l),b.url===j&&(f&&(k=k.replace(bU,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},e.then(m,m),b.converters["script json"]=function(){g||d.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),d.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){d.globalEval(a);return a}}}),d.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),d.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var bV=d.now(),bW,bX;d.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&bZ()||b$()}:bZ,bX=d.ajaxSettings.xhr(),d.support.ajax=!!bX,d.support.cors=bX&&"withCredentials"in bX,bX=b,d.support.ajax&&d.ajaxTransport(function(a){if(!a.crossDomain||d.support.cors){var c;return{send:function(e,f){var g=a.xhr(),h,i;a.username?g.open(a.type,a.url,a.async,a.username,a.password):g.open(a.type,a.url,a.async);if(a.xhrFields)for(i in a.xhrFields)g[i]=a.xhrFields[i];a.mimeType&&g.overrideMimeType&&g.overrideMimeType(a.mimeType),!a.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(i in e)g.setRequestHeader(i,e[i])}catch(j){}g.send(a.hasContent&&a.data||null),c=function(e,i){var j,k,l,m,n;try{if(c&&(i||g.readyState===4)){c=b,h&&(g.onreadystatechange=d.noop,delete bW[h]);if(i)g.readyState!==4&&g.abort();else{j=g.status,l=g.getAllResponseHeaders(),m={},n=g.responseXML,n&&n.documentElement&&(m.xml=n),m.text=g.responseText;try{k=g.statusText}catch(o){k=""}j||!a.isLocal||a.crossDomain?j===1223&&(j=204):j=m.text?200:404}}}catch(p){i||f(-1,p)}m&&f(j,k,m,l)},a.async&&g.readyState!==4?(bW||(bW={},bY()),h=bV++,g.onreadystatechange=bW[h]=c):c()},abort:function(){c&&c(0,1)}}}});var b_={},ca=/^(?:toggle|show|hide)$/,cb=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cc,cd=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];d.fn.extend({show:function(a,b,c){var e,f;if(a||a===0)return this.animate(ce("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)e=this[g],f=e.style.display,!d._data(e,"olddisplay")&&f==="none"&&(f=e.style.display=""),f===""&&d.css(e,"display")==="none"&&d._data(e,"olddisplay",cf(e.nodeName));for(g=0;g<h;g++){e=this[g],f=e.style.display;if(f===""||f==="none")e.style.display=d._data(e,"olddisplay")||""}return this},hide:function(a,b,c){if(a||a===0)return this.animate(ce("hide",3),a,b,c);for(var e=0,f=this.length;e<f;e++){var g=d.css(this[e],"display");g!=="none"&&!d._data(this[e],"olddisplay")&&d._data(this[e],"olddisplay",g)}for(e=0;e<f;e++)this[e].style.display="none";return this},_toggle:d.fn.toggle,toggle:function(a,b,c){var e=typeof a==="boolean";d.isFunction(a)&&d.isFunction(b)?this._toggle.apply(this,arguments):a==null||e?this.each(function(){var b=e?a:d(this).is(":hidden");d(this)[b?"show":"hide"]()}):this.animate(ce("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,e){var f=d.speed(b,c,e);if(d.isEmptyObject(a))return this.each(f.complete);return this[f.queue===!1?"each":"queue"](function(){var b=d.extend({},f),c,e=this.nodeType===1,g=e&&d(this).is(":hidden"),h=this;for(c in a){var i=d.camelCase(c);c!==i&&(a[i]=a[c],delete a[c],c=i);if(a[c]==="hide"&&g||a[c]==="show"&&!g)return b.complete.call(this);if(e&&(c==="height"||c==="width")){b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(d.css(this,"display")==="inline"&&d.css(this,"float")==="none")if(d.support.inlineBlockNeedsLayout){var j=cf(this.nodeName);j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)}else this.style.display="inline-block"}d.isArray(a[c])&&((b.specialEasing=b.specialEasing||{})[c]=a[c][1],a[c]=a[c][0])}b.overflow!=null&&(this.style.overflow="hidden"),b.curAnim=d.extend({},a),d.each(a,function(c,e){var f=new d.fx(h,b,c);if(ca.test(e))f[e==="toggle"?g?"show":"hide":e](a);else{var i=cb.exec(e),j=f.cur();if(i){var k=parseFloat(i[2]),l=i[3]||(d.cssNumber[c]?"":"px");l!=="px"&&(d.style(h,c,(k||1)+l),j=(k||1)/f.cur()*j,d.style(h,c,j+l)),i[1]&&(k=(i[1]==="-="?-1:1)*k+j),f.custom(j,k,l)}else f.custom(j,e,"")}});return!0})},stop:function(a,b){var c=d.timers;a&&this.queue([]),this.each(function(){for(var a=c.length-1;a>=0;a--)c[a].elem===this&&(b&&c[a](!0),c.splice(a,1))}),b||this.dequeue();return this}}),d.each({slideDown:ce("show",1),slideUp:ce("hide",1),slideToggle:ce("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){d.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),d.extend({speed:function(a,b,c){var e=a&&typeof a==="object"?d.extend({},a):{complete:c||!c&&b||d.isFunction(a)&&a,duration:a,easing:c&&b||b&&!d.isFunction(b)&&b};e.duration=d.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in d.fx.speeds?d.fx.speeds[e.duration]:d.fx.speeds._default,e.old=e.complete,e.complete=function(){e.queue!==!1&&d(this).dequeue(),d.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig||(b.orig={})}}),d.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(d.fx.step[this.prop]||d.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=d.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function g(a){return e.step(a)}var e=this,f=d.fx;this.startTime=d.now(),this.start=a,this.end=b,this.unit=c||this.unit||(d.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,g.elem=this.elem,g()&&d.timers.push(g)&&!cc&&(cc=setInterval(f.tick,f.interval))},show:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),d(this.elem).show()},hide:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=d.now(),c=!0;if(a||b>=this.options.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),this.options.curAnim[this.prop]=!0;for(var e in this.options.curAnim)this.options.curAnim[e]!==!0&&(c=!1);if(c){if(this.options.overflow!=null&&!d.support.shrinkWrapBlocks){var f=this.elem,g=this.options;d.each(["","X","Y"],function(a,b){f.style["overflow"+b]=g.overflow[a]})}this.options.hide&&d(this.elem).hide();if(this.options.hide||this.options.show)for(var h in this.options.curAnim)d.style(this.elem,h,this.options.orig[h]);this.options.complete.call(this.elem)}return!1}var i=b-this.startTime;this.state=i/this.options.duration;var j=this.options.specialEasing&&this.options.specialEasing[this.prop],k=this.options.easing||(d.easing.swing?"swing":"linear");this.pos=d.easing[j||k](this.state,i,0,1,this.options.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update();return!0}},d.extend(d.fx,{tick:function(){var a=d.timers;for(var b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||d.fx.stop()},interval:13,stop:function(){clearInterval(cc),cc=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){d.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),d.expr&&d.expr.filters&&(d.expr.filters.animated=function(a){return d.grep(d.timers,function(b){return a===b.elem}).length});var cg=/^t(?:able|d|h)$/i,ch=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?d.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,g=f.documentElement;if(!c||!d.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=f.body,i=ci(f),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||d.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||d.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:d.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);d.offset.initialize();var c,e=b.offsetParent,f=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(d.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===e&&(l+=b.offsetTop,m+=b.offsetLeft,d.offset.doesNotAddBorder&&(!d.offset.doesAddBorderForTableAndCells||!cg.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),f=e,e=b.offsetParent),d.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;d.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},d.offset={initialize:function(){var a=c.body,b=c.createElement("div"),e,f,g,h,i=parseFloat(d.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";d.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),e=b.firstChild,f=e.firstChild,h=e.nextSibling.firstChild.firstChild,this.doesNotAddBorder=f.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,f.style.position="fixed",f.style.top="20px",this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15,f.style.position=f.style.top="",e.style.overflow="hidden",e.style.position="relative",this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),d.offset.initialize=d.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;d.offset.initialize(),d.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(d.css(a,"marginTop"))||0,c+=parseFloat(d.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var e=d.css(a,"position");e==="static"&&(a.style.position="relative");var f=d(a),g=f.offset(),h=d.css(a,"top"),i=d.css(a,"left"),j=(e==="absolute"||e==="fixed")&&d.inArray("auto",[h,i])>-1,k={},l={},m,n;j&&(l=f.position()),m=j?l.top:parseInt(h,10)||0,n=j?l.left:parseInt(i,10)||0,d.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):f.css(k)}},d.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),e=ch.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(d.css(a,"marginTop"))||0,c.left-=parseFloat(d.css(a,"marginLeft"))||0,e.top+=parseFloat(d.css(b[0],"borderTopWidth"))||0,e.left+=parseFloat(d.css(b[0],"borderLeftWidth"))||0;return{top:c.top-e.top,left:c.left-e.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&(!ch.test(a.nodeName)&&d.css(a,"position")==="static"))a=a.offsetParent;return a})}}),d.each(["Left","Top"],function(a,c){var e="scroll"+c;d.fn[e]=function(c){var f=this[0],g;if(!f)return null;if(c!==b)return this.each(function(){g=ci(this),g?g.scrollTo(a?d(g).scrollLeft():c,a?c:d(g).scrollTop()):this[e]=c});g=ci(f);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:d.support.boxModel&&g.document.documentElement[e]||g.document.body[e]:f[e]}}),d.each(["Height","Width"],function(a,c){var e=c.toLowerCase();d.fn["inner"+c]=function(){return this[0]?parseFloat(d.css(this[0],e,"padding")):null},d.fn["outer"+c]=function(a){return this[0]?parseFloat(d.css(this[0],e,a?"margin":"border")):null},d.fn[e]=function(a){var f=this[0];if(!f)return a==null?null:this;if(d.isFunction(a))return this.each(function(b){var c=d(this);c[e](a.call(this,b,c[e]()))});if(d.isWindow(f)){var g=f.document.documentElement["client"+c];return f.document.compatMode==="CSS1Compat"&&g||f.document.body["client"+c]||g}if(f.nodeType===9)return Math.max(f.documentElement["client"+c],f.body["scroll"+c],f.documentElement["scroll"+c],f.body["offset"+c],f.documentElement["offset"+c]);if(a===b){var h=d.css(f,e),i=parseFloat(h);return d.isNaN(i)?h:i}return this.css(e,typeof a==="string"?a:a+"px")}}),a.jQuery=a.$=d})(window);
\ No newline at end of file
diff --git a/framework/images/webapp/images/jquery/plugins/validate/version.txt b/framework/images/webapp/images/jquery/plugins/validate/version.txt
new file mode 100644
index 0000000..f8e233b
--- /dev/null
+++ b/framework/images/webapp/images/jquery/plugins/validate/version.txt
@@ -0,0 +1 @@
+1.9.0
diff --git a/framework/images/webapp/images/jquery/ui/css/smoothness/jquery-ui-1.8.5.custom.css b/framework/images/webapp/images/jquery/ui/css/smoothness/jquery-ui-1.8.5.custom.css
new file mode 100644
index 0000000..0cb22be
--- /dev/null
+++ b/framework/images/webapp/images/jquery/ui/css/smoothness/jquery-ui-1.8.5.custom.css
@@ -0,0 +1,572 @@
+/*
+ * jQuery UI CSS Framework @VERSION
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
+
+
+/*
+ * jQuery UI CSS Framework @VERSION
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; }
+.ui-widget-content a { color: #222222; }
+.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
+.ui-widget-header a { color: #222222; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; }
+.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-right {  -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; }
+
+/* Overlays */
+.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
+.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/*
+ * jQuery UI Resizable @VERSION
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizable#theming
+ */
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
+ * jQuery UI Selectable @VERSION
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectable#theming
+ */
+.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
+/*
+ * jQuery UI Accordion @VERSION
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+/* IE/Win - Fix animation bug - #4615 */
+.ui-accordion { width: 100%; }
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
+.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
+.ui-accordion .ui-accordion-content-active { display: block; }/*
+ * jQuery UI Autocomplete @VERSION
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete#theming
+ */
+.ui-autocomplete { position: absolute; cursor: default; }	
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/*
+ * jQuery UI Menu @VERSION
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu#theming
+ */
+.ui-menu {
+	list-style:none;
+	padding: 2px;
+	margin: 0;
+	display:block;
+	float: left;
+}
+.ui-menu .ui-menu {
+	margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+	margin:0;
+	padding: 0;
+	zoom: 1;
+	float: left;
+	clear: left;
+	width: 100%;
+}
+.ui-menu .ui-menu-item a {
+	text-decoration:none;
+	display:block;
+	padding:.2em .4em;
+	line-height:1.5;
+	zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+	font-weight: normal;
+	margin: -1px;
+}
+/*
+ * jQuery UI Button @VERSION
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button#theming
+ */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; } 
+button.ui-button-icons-only { width: 3.7em; } 
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4;  }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+/*
+ * jQuery UI Dialog @VERSION
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog#theming
+ */
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; } 
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
+/*
+ * jQuery UI Slider @VERSION
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider#theming
+ */
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
+ * jQuery UI Tabs @VERSION
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs#theming
+ */
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
+/*
+ * jQuery UI Datepicker @VERSION
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+.ui-datepicker { width: 17em; padding: .2em .2em 0; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    display: none; /*sorry for IE5*/
+    display/**/: block; /*sorry for IE5*/
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}/*
+ * jQuery UI Progressbar @VERSION
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar#theming
+ */
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
\ No newline at end of file
diff --git a/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png
new file mode 100644
index 0000000..954e22d
--- /dev/null
+++ b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png
Binary files differ
diff --git a/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png
new file mode 100644
index 0000000..64ece57
--- /dev/null
+++ b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png
Binary files differ
diff --git a/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png
new file mode 100644
index 0000000..abdc010
--- /dev/null
+++ b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png
Binary files differ
diff --git a/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png
new file mode 100644
index 0000000..9b383f4
--- /dev/null
+++ b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png
Binary files differ
diff --git a/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png
new file mode 100644
index 0000000..a23baad
--- /dev/null
+++ b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png
Binary files differ
diff --git a/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png
new file mode 100644
index 0000000..42ccba2
--- /dev/null
+++ b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png
Binary files differ
diff --git a/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png
new file mode 100644
index 0000000..39d5824
--- /dev/null
+++ b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png
Binary files differ
diff --git a/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
new file mode 100644
index 0000000..f127367
--- /dev/null
+++ b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
Binary files differ
diff --git a/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
new file mode 100644
index 0000000..359397a
--- /dev/null
+++ b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
Binary files differ
diff --git a/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-icons_222222_256x240.png b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-icons_222222_256x240.png
new file mode 100644
index 0000000..b273ff1
--- /dev/null
+++ b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-icons_222222_256x240.png
Binary files differ
diff --git a/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-icons_228ef1_256x240.png b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-icons_228ef1_256x240.png
new file mode 100644
index 0000000..a641a37
--- /dev/null
+++ b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-icons_228ef1_256x240.png
Binary files differ
diff --git a/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-icons_ef8c08_256x240.png b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-icons_ef8c08_256x240.png
new file mode 100644
index 0000000..85e63e9
--- /dev/null
+++ b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-icons_ef8c08_256x240.png
Binary files differ
diff --git a/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-icons_ffd27a_256x240.png b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-icons_ffd27a_256x240.png
new file mode 100644
index 0000000..d9dc509
--- /dev/null
+++ b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-icons_ffd27a_256x240.png
Binary files differ
diff --git a/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-icons_ffffff_256x240.png b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-icons_ffffff_256x240.png
new file mode 100644
index 0000000..42f8f99
--- /dev/null
+++ b/framework/images/webapp/images/jquery/ui/css/ui-lightness/images/ui-icons_ffffff_256x240.png
Binary files differ
diff --git a/framework/images/webapp/images/jquery/ui/css/ui-lightness/jquery-ui-1.8.11.custom.css b/framework/images/webapp/images/jquery/ui/css/ui-lightness/jquery-ui-1.8.11.custom.css
new file mode 100644
index 0000000..ea78b97
--- /dev/null
+++ b/framework/images/webapp/images/jquery/ui/css/ui-lightness/jquery-ui-1.8.11.custom.css
@@ -0,0 +1,573 @@
+/*
+ * jQuery UI CSS Framework 1.8.11
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
+
+
+/*
+ * jQuery UI CSS Framework 1.8.11
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; }
+.ui-widget-content a { color: #333333; }
+.ui-widget-header { border: 1px solid #e78f08; background: #f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }
+.ui-widget-header a { color: #ffffff; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #fbcb09; background: #fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #c77405; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #c77405; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #fbd850; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eb8f00; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fed22f; background: #ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_ef8c08_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_228ef1_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ffd27a_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; }
+.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-right {  -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; }
+
+/* Overlays */
+.ui-widget-overlay { background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); }
+.ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/*
+ * jQuery UI Resizable 1.8.11
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizable#theming
+ */
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
+ * jQuery UI Selectable 1.8.11
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectable#theming
+ */
+.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
+/*
+ * jQuery UI Accordion 1.8.11
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+/* IE/Win - Fix animation bug - #4615 */
+.ui-accordion { width: 100%; }
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
+.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
+.ui-accordion .ui-accordion-content-active { display: block; }
+/*
+ * jQuery UI Autocomplete 1.8.11
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete#theming
+ */
+.ui-autocomplete { position: absolute; cursor: default; }	
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/*
+ * jQuery UI Menu 1.8.11
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu#theming
+ */
+.ui-menu {
+	list-style:none;
+	padding: 2px;
+	margin: 0;
+	display:block;
+	float: left;
+}
+.ui-menu .ui-menu {
+	margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+	margin:0;
+	padding: 0;
+	zoom: 1;
+	float: left;
+	clear: left;
+	width: 100%;
+}
+.ui-menu .ui-menu-item a {
+	text-decoration:none;
+	display:block;
+	padding:.2em .4em;
+	line-height:1.5;
+	zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+	font-weight: normal;
+	margin: -1px;
+}
+/*
+ * jQuery UI Button 1.8.11
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button#theming
+ */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; } 
+button.ui-button-icons-only { width: 3.7em; } 
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4;  }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+/*
+ * jQuery UI Dialog 1.8.11
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog#theming
+ */
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } 
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
+/*
+ * jQuery UI Slider 1.8.11
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider#theming
+ */
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
+ * jQuery UI Tabs 1.8.11
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs#theming
+ */
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
+/*
+ * jQuery UI Datepicker 1.8.11
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    display: none; /*sorry for IE5*/
+    display/**/: block; /*sorry for IE5*/
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}/*
+ * jQuery UI Progressbar 1.8.11
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar#theming
+ */
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
\ No newline at end of file
diff --git a/framework/images/webapp/images/jquery/ui/css/ui-lightness/jquery-ui-1.8.13.custom.css b/framework/images/webapp/images/jquery/ui/css/ui-lightness/jquery-ui-1.8.13.custom.css
new file mode 100644
index 0000000..4c33c4c
--- /dev/null
+++ b/framework/images/webapp/images/jquery/ui/css/ui-lightness/jquery-ui-1.8.13.custom.css
@@ -0,0 +1,578 @@
+/*
+ * jQuery UI CSS Framework 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
+
+
+/*
+ * jQuery UI CSS Framework 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; }
+.ui-widget-content a { color: #333333; }
+.ui-widget-header { border: 1px solid #e78f08; background: #f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }
+.ui-widget-header a { color: #ffffff; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #fbcb09; background: #fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #c77405; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #c77405; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #fbd850; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eb8f00; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fed22f; background: #ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_ef8c08_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_228ef1_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ffd27a_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; }
+.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-right {  -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; }
+
+/* Overlays */
+.ui-widget-overlay { background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); }
+.ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/*
+ * jQuery UI Resizable 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizable#theming
+ */
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;
+	/* http://bugs.jqueryui.com/ticket/7233
+	 - Resizable: resizable handles fail to work in IE if transparent and content overlaps
+	*/
+	background-image:url(data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=);
+}
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
+ * jQuery UI Selectable 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectable#theming
+ */
+.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
+/*
+ * jQuery UI Accordion 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+/* IE/Win - Fix animation bug - #4615 */
+.ui-accordion { width: 100%; }
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
+.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
+.ui-accordion .ui-accordion-content-active { display: block; }
+/*
+ * jQuery UI Autocomplete 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete#theming
+ */
+.ui-autocomplete { position: absolute; cursor: default; }	
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/*
+ * jQuery UI Menu 1.8.13
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu#theming
+ */
+.ui-menu {
+	list-style:none;
+	padding: 2px;
+	margin: 0;
+	display:block;
+	float: left;
+}
+.ui-menu .ui-menu {
+	margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+	margin:0;
+	padding: 0;
+	zoom: 1;
+	float: left;
+	clear: left;
+	width: 100%;
+}
+.ui-menu .ui-menu-item a {
+	text-decoration:none;
+	display:block;
+	padding:.2em .4em;
+	line-height:1.5;
+	zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+	font-weight: normal;
+	margin: -1px;
+}
+/*
+ * jQuery UI Button 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button#theming
+ */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; } 
+button.ui-button-icons-only { width: 3.7em; } 
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4;  }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+/*
+ * jQuery UI Dialog 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog#theming
+ */
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } 
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
+/*
+ * jQuery UI Slider 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider#theming
+ */
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
+ * jQuery UI Tabs 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs#theming
+ */
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
+/*
+ * jQuery UI Datepicker 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    display: none; /*sorry for IE5*/
+    display/**/: block; /*sorry for IE5*/
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}/*
+ * jQuery UI Progressbar 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar#theming
+ */
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
\ No newline at end of file
diff --git a/framework/images/webapp/images/jquery/ui/css/ui-lightness/jquery-ui-1.8.16.custom.css b/framework/images/webapp/images/jquery/ui/css/ui-lightness/jquery-ui-1.8.16.custom.css
new file mode 100644
index 0000000..5547c7b
--- /dev/null
+++ b/framework/images/webapp/images/jquery/ui/css/ui-lightness/jquery-ui-1.8.16.custom.css
@@ -0,0 +1,568 @@
+/*
+ * jQuery UI CSS Framework 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
+
+
+/*
+ * jQuery UI CSS Framework 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; }
+.ui-widget-content a { color: #333333; }
+.ui-widget-header { border: 1px solid #e78f08; background: #f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }
+.ui-widget-header a { color: #ffffff; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #fbcb09; background: #fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #c77405; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #c77405; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #fbd850; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eb8f00; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fed22f; background: #ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_ef8c08_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_228ef1_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ffd27a_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; }
+.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+
+/* Overlays */
+.ui-widget-overlay { background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); }
+.ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -khtml-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/*
+ * jQuery UI Resizable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizable#theming
+ */
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; }
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
+ * jQuery UI Selectable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectable#theming
+ */
+.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
+/*
+ * jQuery UI Accordion 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+/* IE/Win - Fix animation bug - #4615 */
+.ui-accordion { width: 100%; }
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
+.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
+.ui-accordion .ui-accordion-content-active { display: block; }
+/*
+ * jQuery UI Autocomplete 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete#theming
+ */
+.ui-autocomplete { position: absolute; cursor: default; }	
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/*
+ * jQuery UI Menu 1.8.16
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu#theming
+ */
+.ui-menu {
+	list-style:none;
+	padding: 2px;
+	margin: 0;
+	display:block;
+	float: left;
+}
+.ui-menu .ui-menu {
+	margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+	margin:0;
+	padding: 0;
+	zoom: 1;
+	float: left;
+	clear: left;
+	width: 100%;
+}
+.ui-menu .ui-menu-item a {
+	text-decoration:none;
+	display:block;
+	padding:.2em .4em;
+	line-height:1.5;
+	zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+	font-weight: normal;
+	margin: -1px;
+}
+/*
+ * jQuery UI Button 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button#theming
+ */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; } 
+button.ui-button-icons-only { width: 3.7em; } 
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4;  }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+/*
+ * jQuery UI Dialog 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog#theming
+ */
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } 
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
+/*
+ * jQuery UI Slider 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider#theming
+ */
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
+ * jQuery UI Tabs 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs#theming
+ */
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
+/*
+ * jQuery UI Datepicker 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    display: none; /*sorry for IE5*/
+    display/**/: block; /*sorry for IE5*/
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}/*
+ * jQuery UI Progressbar 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar#theming
+ */
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
\ No newline at end of file
diff --git a/framework/images/webapp/images/jquery/ui/css/ui-lightness/jquery-ui-1.8.6.custom.css b/framework/images/webapp/images/jquery/ui/css/ui-lightness/jquery-ui-1.8.6.custom.css
new file mode 100644
index 0000000..dc60200
--- /dev/null
+++ b/framework/images/webapp/images/jquery/ui/css/ui-lightness/jquery-ui-1.8.6.custom.css
@@ -0,0 +1,572 @@
+/*
+ * jQuery UI CSS Framework 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
+
+
+/*
+ * jQuery UI CSS Framework 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; }
+.ui-widget-content a { color: #333333; }
+.ui-widget-header { border: 1px solid #e78f08; background: #f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }
+.ui-widget-header a { color: #ffffff; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #fbcb09; background: #fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #c77405; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #c77405; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #fbd850; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eb8f00; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fed22f; background: #ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_ef8c08_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_228ef1_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ffd27a_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; }
+.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-right {  -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; }
+
+/* Overlays */
+.ui-widget-overlay { background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); }
+.ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/*
+ * jQuery UI Resizable 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizable#theming
+ */
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
+ * jQuery UI Selectable 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectable#theming
+ */
+.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
+/*
+ * jQuery UI Accordion 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+/* IE/Win - Fix animation bug - #4615 */
+.ui-accordion { width: 100%; }
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
+.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
+.ui-accordion .ui-accordion-content-active { display: block; }/*
+ * jQuery UI Autocomplete 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete#theming
+ */
+.ui-autocomplete { position: absolute; cursor: default; }	
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/*
+ * jQuery UI Menu 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu#theming
+ */
+.ui-menu {
+	list-style:none;
+	padding: 2px;
+	margin: 0;
+	display:block;
+	float: left;
+}
+.ui-menu .ui-menu {
+	margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+	margin:0;
+	padding: 0;
+	zoom: 1;
+	float: left;
+	clear: left;
+	width: 100%;
+}
+.ui-menu .ui-menu-item a {
+	text-decoration:none;
+	display:block;
+	padding:.2em .4em;
+	line-height:1.5;
+	zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+	font-weight: normal;
+	margin: -1px;
+}
+/*
+ * jQuery UI Button 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button#theming
+ */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; } 
+button.ui-button-icons-only { width: 3.7em; } 
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4;  }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+/*
+ * jQuery UI Dialog 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog#theming
+ */
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; } 
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
+/*
+ * jQuery UI Slider 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider#theming
+ */
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
+ * jQuery UI Tabs 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs#theming
+ */
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
+/*
+ * jQuery UI Datepicker 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+.ui-datepicker { width: 17em; padding: .2em .2em 0; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    display: none; /*sorry for IE5*/
+    display/**/: block; /*sorry for IE5*/
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}/*
+ * jQuery UI Progressbar 1.8.6
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar#theming
+ */
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
\ No newline at end of file
diff --git a/framework/jcr/build.xml b/framework/jcr/build.xml
new file mode 100644
index 0000000..1d08c7e
--- /dev/null
+++ b/framework/jcr/build.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<!--

+Licensed to the Apache Software Foundation (ASF) under one

+or more contributor license agreements.  See the NOTICE file

+distributed with this work for additional information

+regarding copyright ownership.  The ASF licenses this file

+to you 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.

+-->

+

+<project name="OFBiz - JCR" default="jar" basedir=".">

+    <import file="../../common.xml"/>

+

+    <!-- ================================================================== -->

+    <!-- Initialization of all property settings                            -->

+    <!-- ================================================================== -->

+

+    <property name="desc" value="JCR Component"/>

+    <property name="name" value="ofbiz-jcr"/>

+    <property name="ofbiz.home.dir" value="../.."/>

+

+    <path id="local.class.path">

+        <fileset dir="${lib.dir}" includes="*.jar"/>

+        <fileset dir="../../framework/base/lib" includes="*.jar"/>

+        <fileset dir="../../framework/base/lib/commons" includes="*.jar"/>

+        <fileset dir="../../framework/base/lib/j2eespecs" includes="*.jar"/>

+        <fileset dir="../../framework/base/build/lib" includes="*.jar"/>

+        <fileset dir="../../framework/webapp/lib" includes="*.jar"/>

+        <fileset dir="../../framework/entity/build/lib" includes="*.jar"/>

+        <fileset dir="../../framework/service/build/lib" includes="*.jar"/>

+        <fileset dir="../../framework/security/build/lib" includes="*.jar"/>

+        <fileset dir="../../framework/jetty/lib" includes="*.jar"/>

+    </path>

+

+    <target name="jar" depends="classes">

+        <main-jar/>

+        <test-jar/>

+    </target>

+</project>

diff --git a/framework/jcr/config/custom-jackrabbit-nodetypes.xml b/framework/jcr/config/custom-jackrabbit-nodetypes.xml
new file mode 100644
index 0000000..bba7fa0
--- /dev/null
+++ b/framework/jcr/config/custom-jackrabbit-nodetypes.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>

+<nodeTypes xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:fn_old="http://www.w3.org/2004/10/xpath-functions" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0"

+    xmlns:ocm="http://jackrabbit.apache.org/ocm" xmlns:rep="internal" xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

+

+    <nodeType hasOrderableChildNodes="false" isAbstract="false" isMixin="true" isQueryable="true" name="ocm:discriminator" primaryItemName="">

+        <supertypes>

+            <supertype>nt:base</supertype>

+        </supertypes>

+        <propertyDefinition autoCreated="false" isFullTextSearchable="false" isQueryOrderable="false" mandatory="true" multiple="false" name="ocm_classname" onParentVersion="COPY" protected="false" requiredType="String" />

+    </nodeType>

+

+</nodeTypes>
\ No newline at end of file
diff --git a/framework/jcr/config/jackrabbit.xml b/framework/jcr/config/jackrabbit.xml
new file mode 100644
index 0000000..e54d692
--- /dev/null
+++ b/framework/jcr/config/jackrabbit.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0"?>

+<!--

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You 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.

+-->

+

+<!DOCTYPE Repository

+          PUBLIC "-//The Apache Software Foundation//DTD Jackrabbit 2.0//EN"

+          "http://jackrabbit.apache.org/dtd/repository-2.0.dtd">

+

+<!-- Example Repository Configuration File

+     Used by

+     - org.apache.jackrabbit.core.config.RepositoryConfigTest.java

+     -

+-->

+<Repository>

+    <!--

+        virtual file system where the repository stores global state

+        (e.g. registered namespaces, custom node types, etc.)

+    -->

+    <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">

+        <param name="path" value="${rep.home}/repository"/>

+    </FileSystem>

+

+    <!--

+        data store configuration

+    -->

+    <DataStore class="org.apache.jackrabbit.core.data.FileDataStore" >

+        <param name="path" value="${rep.home}/repository/datastore"/>

+        <param name="minRecordLength" value="0"/>

+    </DataStore>

+    <!--

+        security configuration

+    -->

+    <Security appName="Jackrabbit">

+        <!--

+            security manager:

+            class: FQN of class implementing the JackrabbitSecurityManager interface

+        -->

+        <SecurityManager class="org.apache.jackrabbit.core.security.simple.SimpleSecurityManager" workspaceName="security">

+            <!--

+            workspace access:

+            class: FQN of class implementing the WorkspaceAccessManager interface

+            -->

+            <!-- <WorkspaceAccessManager class="..."/> -->

+            <!-- <param name="config" value="${rep.home}/security.xml"/> -->

+        </SecurityManager>

+

+        <!--

+            access manager:

+            class: FQN of class implementing the AccessManager interface

+        -->

+        <AccessManager class="org.apache.jackrabbit.core.security.simple.SimpleAccessManager">

+            <!-- <param name="config" value="${rep.home}/access.xml"/> -->

+        </AccessManager>

+

+        <LoginModule class="org.ofbiz.jcr.loader.OFBizLoginModule"/>

+    </Security>

+

+    <!--

+        location of workspaces root directory and name of default workspace

+    -->

+    <Workspaces rootPath="${rep.home}/workspaces" defaultWorkspace="default"/>

+    <!--

+        workspace configuration template:

+        used to create the initial workspace if there's no workspace yet

+    -->

+    <Workspace name="${wsp.name}">

+        <!--

+            virtual file system of the workspace:

+            class: FQN of class implementing the FileSystem interface

+        -->

+        <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">

+            <param name="path" value="${wsp.home}"/>

+        </FileSystem>

+        <!--

+            persistence manager of the workspace:

+            class: FQN of class implementing the PersistenceManager interface

+        -->

+        <PersistenceManager class="org.apache.jackrabbit.core.persistence.pool.DerbyPersistenceManager">

+          <param name="url" value="jdbc:derby:${wsp.home}/db;create=true"/>

+          <param name="schemaObjectPrefix" value="${wsp.name}_"/>

+        </PersistenceManager>

+        <!--

+            Search index and the file system it uses.

+            class: FQN of class implementing the QueryHandler interface

+        -->

+        <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">

+            <param name="path" value="${wsp.home}/index"/>

+            <param name="supportHighlighting" value="true"/>

+        </SearchIndex>

+    </Workspace>

+

+    <!--

+        Configures the versioning

+    -->

+    <Versioning rootPath="${rep.home}/version">

+        <!--

+            Configures the filesystem to use for versioning for the respective

+            persistence manager

+        -->

+        <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">

+            <param name="path" value="${rep.home}/version" />

+        </FileSystem>

+

+        <!--

+            Configures the persistence manager to be used for persisting version state.

+            Please note that the current versioning implementation is based on

+            a 'normal' persistence manager, but this could change in future

+            implementations.

+        -->

+        <PersistenceManager class="org.apache.jackrabbit.core.persistence.pool.DerbyPersistenceManager">

+          <param name="url" value="jdbc:derby:${rep.home}/version/db;create=true"/>

+          <param name="schemaObjectPrefix" value="version_"/>

+        </PersistenceManager>

+    </Versioning>

+

+    <!--

+        Search index for content that is shared repository wide

+        (/jcr:system tree, contains mainly versions)

+    -->

+    <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">

+        <param name="path" value="${rep.home}/repository/index"/>

+        <param name="supportHighlighting" value="true"/>

+    </SearchIndex>

+</Repository>
\ No newline at end of file
diff --git a/framework/jcr/config/jcr-config.xml b/framework/jcr/config/jcr-config.xml
new file mode 100644
index 0000000..98f3b01
--- /dev/null
+++ b/framework/jcr/config/jcr-config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>

+<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you 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. -->

+

+<jcr-config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

+

+    <!-- define the default jcr implementation, to be used -->

+    <jcr-context name="default" />

+

+    <!-- This is the default implementation and uses the JackRabbit implementation as its default -->

+    <jcr name="default" class="org.ofbiz.jcr.loader.jackrabbit.JCRFactoryImpl" jndi-name="jcr/local" />

+

+    <!-- This is an example custom implementation and uses the class name specified as jcr implementation -->

+    <!-- <jcr name="myCustom" class="com.mycompany.jcr.MyCustomJCR"/> -->

+

+    <!-- jcr home directory -->

+    <home-dir path="runtime/data/jcr/" />

+

+    <!-- config file for thr jcr implementation -->

+    <config-file-path path="framework/jcr/config/jackrabbit.xml" />

+

+    <!-- jcr workspace credentials -->

+    <jcr-credentials username="system" password="ofbiz" />

+

+</jcr-config>

diff --git a/framework/jcr/config/jcr-test-config.xml b/framework/jcr/config/jcr-test-config.xml
new file mode 100644
index 0000000..0e6c027
--- /dev/null
+++ b/framework/jcr/config/jcr-test-config.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8" ?>

+<!--

+Licensed to the Apache Software Foundation (ASF) under one

+or more contributor license agreements.  See the NOTICE file

+distributed with this work for additional information

+regarding copyright ownership.  The ASF licenses this file

+to you 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.

+-->

+

+<jcr-config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

+

+    <!-- define the default jcr implementation, to be used -->

+    <jcr-context name="default" />

+

+    <!-- This is the default implementation and uses the JackRabbit implementation as its default -->

+    <jcr name="default" class="org.ofbiz.jcr.loader.jackrabbit.JCRFactoryImpl" jndi-name="jcr/local"/>

+

+    <!-- This is an example custom implementation and uses the class name specified as jcr implementation -->

+    <!--

+    <jcr name="myCustom" class="com.mycompany.jcr.MyCustomJCR"/>

+    -->

+

+    <!-- jcr home directory -->

+    <home-dir path="runtime/data/jcr-test/" />

+

+    <!-- config file for thr jcr implementation -->

+    <config-file-path path="framework/jcr/config/jackrabbit.xml" />

+

+    <!-- jcr workspace credentials -->

+    <jcr-credentials username="system" password="ofbiz" />

+

+</jcr-config>

diff --git a/framework/jcr/lib/cglib-2.2.jar b/framework/jcr/lib/cglib-2.2.jar
new file mode 100644
index 0000000..084ef6e
--- /dev/null
+++ b/framework/jcr/lib/cglib-2.2.jar
Binary files differ
diff --git a/framework/jcr/lib/concurrent-1.3.4.jar b/framework/jcr/lib/concurrent-1.3.4.jar
new file mode 100644
index 0000000..551f347
--- /dev/null
+++ b/framework/jcr/lib/concurrent-1.3.4.jar
Binary files differ
diff --git a/framework/jcr/lib/jackrabbit-api-2.3.3.jar b/framework/jcr/lib/jackrabbit-api-2.3.3.jar
new file mode 100644
index 0000000..43ca34c
--- /dev/null
+++ b/framework/jcr/lib/jackrabbit-api-2.3.3.jar
Binary files differ
diff --git a/framework/jcr/lib/jackrabbit-core-2.3.3.jar b/framework/jcr/lib/jackrabbit-core-2.3.3.jar
new file mode 100644
index 0000000..3d52cfc
--- /dev/null
+++ b/framework/jcr/lib/jackrabbit-core-2.3.3.jar
Binary files differ
diff --git a/framework/jcr/lib/jackrabbit-jca-2.3.3.jar b/framework/jcr/lib/jackrabbit-jca-2.3.3.jar
new file mode 100644
index 0000000..4c01421
--- /dev/null
+++ b/framework/jcr/lib/jackrabbit-jca-2.3.3.jar
Binary files differ
diff --git a/framework/jcr/lib/jackrabbit-jcr-commons-2.3.3.jar b/framework/jcr/lib/jackrabbit-jcr-commons-2.3.3.jar
new file mode 100644
index 0000000..344132b
--- /dev/null
+++ b/framework/jcr/lib/jackrabbit-jcr-commons-2.3.3.jar
Binary files differ
diff --git a/framework/jcr/lib/jackrabbit-ocm-2.0.jar b/framework/jcr/lib/jackrabbit-ocm-2.0.jar
new file mode 100644
index 0000000..dc368c6
--- /dev/null
+++ b/framework/jcr/lib/jackrabbit-ocm-2.0.jar
Binary files differ
diff --git a/framework/jcr/lib/jackrabbit-spi-2.3.3.jar b/framework/jcr/lib/jackrabbit-spi-2.3.3.jar
new file mode 100644
index 0000000..bb9ce84
--- /dev/null
+++ b/framework/jcr/lib/jackrabbit-spi-2.3.3.jar
Binary files differ
diff --git a/framework/jcr/lib/jackrabbit-spi-commons-2.3.3.jar b/framework/jcr/lib/jackrabbit-spi-commons-2.3.3.jar
new file mode 100644
index 0000000..dec4de8
--- /dev/null
+++ b/framework/jcr/lib/jackrabbit-spi-commons-2.3.3.jar
Binary files differ
diff --git a/framework/jcr/lib/jcr-2.0.jar b/framework/jcr/lib/jcr-2.0.jar
new file mode 100644
index 0000000..6afce9b
--- /dev/null
+++ b/framework/jcr/lib/jcr-2.0.jar
Binary files differ
diff --git a/framework/jcr/lib/tagsoup-1.2.1.jar b/framework/jcr/lib/tagsoup-1.2.1.jar
new file mode 100644
index 0000000..2751601
--- /dev/null
+++ b/framework/jcr/lib/tagsoup-1.2.1.jar
Binary files differ
diff --git a/framework/jcr/lib/tika-core-0.10.jar b/framework/jcr/lib/tika-core-0.10.jar
new file mode 100644
index 0000000..78087e1
--- /dev/null
+++ b/framework/jcr/lib/tika-core-0.10.jar
Binary files differ
diff --git a/framework/jcr/lib/tika-parsers-0.10.jar b/framework/jcr/lib/tika-parsers-0.10.jar
new file mode 100644
index 0000000..b1eca29
--- /dev/null
+++ b/framework/jcr/lib/tika-parsers-0.10.jar
Binary files differ
diff --git a/framework/jcr/ofbiz-component.xml b/framework/jcr/ofbiz-component.xml
new file mode 100644
index 0000000..56ba5fc
--- /dev/null
+++ b/framework/jcr/ofbiz-component.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<!--

+Licensed to the Apache Software Foundation (ASF) under one

+or more contributor license agreements.  See the NOTICE file

+distributed with this work for additional information

+regarding copyright ownership.  The ASF licenses this file

+to you 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.

+-->

+

+<ofbiz-component name="jcr"

+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/ofbiz-component.xsd">

+    <resource-loader name="main" type="component"/>

+    <classpath type="dir" location="config"/>

+    <classpath type="jar" location="build/lib/*"/>

+    <classpath type="jar" location="lib/*"/>

+

+    <service-resource type="model" loader="main" location="servicedef/services.xml"/>

+    <test-suite loader="main" location="testdef/jcrtests.xml"/>

+

+</ofbiz-component>

+

diff --git a/framework/jcr/servicedef/services.xml b/framework/jcr/servicedef/services.xml
new file mode 100644
index 0000000..eb9efda
--- /dev/null
+++ b/framework/jcr/servicedef/services.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<!--

+Licensed to the Apache Software Foundation (ASF) under one

+or more contributor license agreements.  See the NOTICE file

+distributed with this work for additional information

+regarding copyright ownership.  The ASF licenses this file

+to you 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.

+-->

+

+<services xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/services.xsd">

+    <description>Jackrabbit Services</description>

+    <vendor>OFBiz</vendor>

+    <version>1.0</version>

+

+    <!-- Example Jackrabbit Services -->

+    <service name="determineJackrabbitRepositorySpeed" engine="java" location="org.ofbiz.jcr.services.JackrabbitServices"

+        invoke="determineJackrabbitRepositorySpeed" auth="true" use-transaction="false">

+        <description>Determine the JCR Repository Overhead</description>

+        <attribute mode="IN" name="maxNodes" optional="false" type="Integer"/>

+        <attribute mode="IN" name="userLogin" optional="false" type="org.ofbiz.entity.GenericValue"/>

+        <attribute mode="OUT" name="repositoryDirectAccessTime" optional="false" type="String"/>

+        <attribute mode="OUT" name="repositoryOcmAccessTime" optional="false" type="String"/>

+    </service>

+</services>
\ No newline at end of file
diff --git a/framework/jcr/src/org/ofbiz/jcr/access/ContentReader.java b/framework/jcr/src/org/ofbiz/jcr/access/ContentReader.java
new file mode 100644
index 0000000..f1e5ce9
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/access/ContentReader.java
@@ -0,0 +1,63 @@
+package org.ofbiz.jcr.access;

+

+import javax.jcr.PathNotFoundException;

+import javax.jcr.RepositoryException;

+import javax.jcr.query.QueryResult;

+

+import net.sf.json.JSONArray;

+

+import org.ofbiz.jcr.orm.OfbizRepositoryMapping;

+

+public interface ContentReader {

+

+    /**

+     * Return an OfbizRepositoryMapping Object from the JCR Repository. The node

+     * path have to be an absolute path.

+     *

+     * @param nodePath

+     * @return

+     * @throws PathNotFoundException

+     */

+    OfbizRepositoryMapping getContentObject(String nodePath) throws PathNotFoundException;

+

+    /**

+     * Return an OfbizRepositoryMapping Object in the specified language and

+     * version from the JCR Repository. The Method checks if the requested

+     * version for this node exist. If not the latest version of the node will

+     * be returned. The node path have to be an absolute path.

+     *

+     * @param nodePath

+     * @param language

+     * @param version

+     * @return

+     * @throws PathNotFoundException

+     */

+    OfbizRepositoryMapping getContentObject(String nodePath, String version) throws PathNotFoundException;

+

+    /**

+     * Returns a tree of all content nodes (except folders and files) in the

+     * repository.

+     *

+     * @return

+     * @throws RepositoryException

+     */

+    JSONArray getJsonDataTree() throws RepositoryException;

+

+    /**

+     * Returns a tree of all folder/file nodes in the repository.

+     *

+     * @return

+     * @throws RepositoryException

+     */

+    JSONArray getJsonFileTree() throws RepositoryException;

+

+    /**

+     * Query for Data in the JCR Repository using the SQL2 or JQOM Query

+     * language. Returns the Query Result.

+     *

+     * @param query

+     *            either a SQL2 or JQOM statement.

+     * @return

+     */

+    QueryResult queryRepositoryData(String query) throws RepositoryException;

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/access/ContentWriter.java b/framework/jcr/src/org/ofbiz/jcr/access/ContentWriter.java
new file mode 100644
index 0000000..3beea5e
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/access/ContentWriter.java
@@ -0,0 +1,36 @@
+package org.ofbiz.jcr.access;

+

+import javax.jcr.ItemExistsException;

+

+import org.apache.jackrabbit.ocm.exception.ObjectContentManagerException;

+import org.ofbiz.jcr.orm.OfbizRepositoryMapping;

+

+public interface ContentWriter {

+

+    /**

+     * Stores the OfbizRepositoryMapping Class in the content repository.

+     *

+     * @param orm

+     * @throws ObjectContentManagerException

+     * @throws ItemExistsException

+     */

+    public void storeContentObject(OfbizRepositoryMapping orm) throws ObjectContentManagerException, ItemExistsException;

+

+    /**

+     * Update the OfbizRepositoryMapping Class in the content repository.

+     *

+     * @param orm

+     * @throws ObjectContentManagerException

+     */

+    public void updateContentObject(OfbizRepositoryMapping orm) throws ObjectContentManagerException;

+

+    /**

+     * Remove the passed node from the content repository. The node path should be absolute.

+     *

+     * @param nodePath

+     * @throws ObjectContentManagerException

+     */

+    public void removeContentObject(String nodePath) throws ObjectContentManagerException;

+

+

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/access/JcrRepositoryAccessor.java b/framework/jcr/src/org/ofbiz/jcr/access/JcrRepositoryAccessor.java
new file mode 100644
index 0000000..eee919b
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/access/JcrRepositoryAccessor.java
@@ -0,0 +1,144 @@
+package org.ofbiz.jcr.access;

+

+import java.util.List;

+

+import javax.jcr.ItemExistsException;

+import javax.jcr.PathNotFoundException;

+import javax.jcr.RepositoryException;

+import javax.jcr.Session;

+import javax.jcr.query.QueryResult;

+

+import net.sf.json.JSONArray;

+

+import org.apache.jackrabbit.ocm.exception.ObjectContentManagerException;

+import org.ofbiz.jcr.orm.OfbizRepositoryMapping;

+

+public interface JcrRepositoryAccessor {

+

+    /**

+     * Close the current repository session should be used when the operation

+     * with this object are finished.

+     */

+    public void closeAccess();

+

+    /**

+     * Return an OfbizRepositoryMapping Object from the content repository.

+     *

+     * @param nodePath

+     * @return

+     * @throws PathNotFoundException

+     */

+    OfbizRepositoryMapping getContentObject(String nodePath) throws PathNotFoundException;

+

+    /**

+     * Return an OfbizRepositoryMapping Object in the specified version from the

+     * JCR Repository.

+     *

+     * @param nodePath

+     * @param language

+     * @param version

+     * @return

+     * @throws PathNotFoundException

+     */

+    OfbizRepositoryMapping getContentObject(String nodePath, String version) throws PathNotFoundException;

+

+    /**

+     * Stores the OfbizRepositoryMapping Class in the content repository.

+     *

+     * @param orm

+     * @throws ObjectContentManagerException

+     * @throws ItemExistsException

+     */

+    void storeContentObject(OfbizRepositoryMapping orm) throws ObjectContentManagerException, ItemExistsException;

+

+    /**

+     * Update the passed content object.

+     *

+     * @param orm

+     * @throws ObjectContentManagerException

+     */

+    public void updateContentObject(OfbizRepositoryMapping orm) throws ObjectContentManagerException;

+

+    /**

+     * Remove the passed node from the content repository

+     *

+     * @param nodePath

+     * @throws ObjectContentManagerException

+     */

+    public void removeContentObject(String nodePath) throws ObjectContentManagerException;

+

+    /**

+     * Remove the passed node from the content repository

+     *

+     * @param orm

+     * @throws ObjectContentManagerException

+     */

+    public void removeContentObject(OfbizRepositoryMapping orm) throws ObjectContentManagerException;

+

+    /**

+     * Returns a tree of all content nodes (except folders and files) in the

+     * repository.

+     *

+     * @return

+     * @throws RepositoryException

+     */

+    JSONArray getJsonDataTree() throws RepositoryException;

+

+    /**

+     * Returns a tree of all file/folder nodes in the repository.

+     *

+     * @return

+     * @throws RepositoryException

+     */

+    JSONArray getJsonFileTree() throws RepositoryException;

+

+    /**

+     * Returns a list of the available versions.

+     *

+     * @param nodePath

+     * @return

+     */

+    public List<String> getVersionList(String nodePath);

+

+    /**

+     * Returns the last checked in version.

+     *

+     * @param nodePath

+     * @return

+     */

+    public String getBaseVersion(String nodePath);

+

+    /**

+     * Returns the first checked in version.

+     *

+     * @param nodePath

+     * @return

+     */

+    public String getRootVersion(String nodePath);

+

+    /**

+     * Query for Data in the JCR Repository using the SQL2 or JQOM Query

+     * language. Returns the Query result.

+     *

+     * @param query

+     *            either a SQL2 or JQOM statement.

+     * @return

+     */

+    public QueryResult queryForRepositoryData(String query) throws RepositoryException;

+

+    /**

+     * Returns a JCR Session object

+     *

+     * @return

+     */

+    public Session getSession();

+

+    /**

+     * Returns true if the node with the passed node path exist, if not or if an

+     * exception occurs false will be returned.

+     *

+     * @param nodePathToCheck

+     * @return

+     */

+    public boolean checkIfNodeExist(String nodePathToCheck);

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/access/VersioningManager.java b/framework/jcr/src/org/ofbiz/jcr/access/VersioningManager.java
new file mode 100644
index 0000000..0217064
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/access/VersioningManager.java
@@ -0,0 +1,70 @@
+package org.ofbiz.jcr.access;

+

+import java.util.List;

+

+public interface VersioningManager {

+

+    /**

+     * Returns a List of all available versions for the passed node.

+     *

+     * @param nodePath

+     * @return

+     */

+    public List<String> getVersionList(String nodePath);

+

+    /**

+     * Returns true if the passed node exist in the requested version.

+     *

+     * @param nodePath

+     * @param version

+     * @return

+     */

+    public boolean checkIfVersionExist(String nodePath, String version);

+

+    /**

+     * Returns the last checked in version.

+     *

+     * @param nodePath

+     * @return

+     */

+    public String getBaseVersion(String nodePath);

+

+    /**

+     * Returns the first checked in version.

+     *

+     * @param nodePath

+     * @return

+     */

+    public String getRootVersion(String nodePath);

+

+    /**

+     * Check Out a node from a repository

+     *

+     * @param nodePath

+     */

+    public void checkOutContentObject(String nodePath);

+

+    /**

+     * Check Out a node from a repository. If recursive is set to TRUE all

+     * related sub nodes and the parent node will also be checked out.

+     *

+     * @param nodePath

+     * @param recursiv

+     */

+    public void checkOutContentObject(String nodePath, boolean recursiv);

+

+    /**

+     * Saves the state of the session and checks in all checkout content nodes.

+     */

+    public void checkInContentAndSaveState();

+

+    /**

+     * Add a node path to a list of node path which will be checked in when the

+     * state is saved. This is to add new created nodes which could not checked

+     * out before.

+     *

+     * @param nodePath

+     */

+    public void addContentToCheckInList(String nodePath);

+

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/ConstantsJackrabbit.java b/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/ConstantsJackrabbit.java
new file mode 100644
index 0000000..7827903
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/ConstantsJackrabbit.java
@@ -0,0 +1,22 @@
+package org.ofbiz.jcr.access.jackrabbit;

+

+import javax.jcr.nodetype.NodeType;

+

+public class ConstantsJackrabbit {

+    // JCR Variables

+    public static String MESSAGE = "jcr:message";

+    public static String FILE = NodeType.NT_FILE;

+    public static String FOLDER = NodeType.NT_FOLDER;

+    public static String RESOURCE = NodeType.NT_RESOURCE;

+    public static String DATA = "jcr:data";

+    public static String UNSTRUCTURED = NodeType.NT_UNSTRUCTURED;

+    public static String MIMETYPE = "jcr:mimeType";

+    public static String MIXIN_LANGUAGE = "mix:language";

+    public static String MIXIN_VERSIONING = "mix:versionable";

+    public static String ROOTVERSION = "jcr:rootVersion";

+

+    //

+    public static String ROOTPATH = "/";

+    public static String FILEROOT = ROOTPATH + "fileHome";

+    public static String NODEPATHDELIMITER = "/";

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/ContentReaderJackrabbit.java b/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/ContentReaderJackrabbit.java
new file mode 100644
index 0000000..d338b92
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/ContentReaderJackrabbit.java
@@ -0,0 +1,212 @@
+package org.ofbiz.jcr.access.jackrabbit;

+

+import javax.jcr.Node;

+import javax.jcr.NodeIterator;

+import javax.jcr.PathNotFoundException;

+import javax.jcr.RepositoryException;

+import javax.jcr.query.Query;

+import javax.jcr.query.QueryManager;

+import javax.jcr.query.QueryResult;

+import javax.jcr.version.VersionException;

+

+import net.sf.json.JSONArray;

+import net.sf.json.JSONObject;

+

+import org.apache.jackrabbit.ocm.manager.ObjectContentManager;

+import org.ofbiz.base.util.Debug;

+import org.ofbiz.jcr.access.ContentReader;

+import org.ofbiz.jcr.access.VersioningManager;

+import org.ofbiz.jcr.orm.OfbizRepositoryMapping;

+import org.ofbiz.jcr.util.jackrabbit.JcrUtilJackrabbit;

+

+public class ContentReaderJackrabbit implements ContentReader {

+

+    private final static String module = ContentReaderJackrabbit.class.getName();

+

+    private final ObjectContentManager ocm;

+

+    public ContentReaderJackrabbit(ObjectContentManager ocm) {

+        this.ocm = ocm;

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.access.ContentReader#getContentObject(java.lang.String)

+     */

+    @Override

+    public OfbizRepositoryMapping getContentObject(String nodePath) throws PathNotFoundException{

+        nodePath = JcrUtilJackrabbit.createAbsoluteNodePath(nodePath);

+        OfbizRepositoryMapping orm = (OfbizRepositoryMapping) ocm.getObject(nodePath);

+        try {

+            if (orm != null) {

+                orm.setVersion(ocm.getBaseVersion(nodePath).getName());

+            }

+        } catch (VersionException e) {

+            // -0.0 means we have no version information

+            orm.setVersion("-0.0");

+            Debug.logError(e, module);

+        }

+        return orm;

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.access.ContentReader#getContentObject(java.lang.String,

+     * java.lang.String, java.lang.String)

+     */

+    @Override

+    public OfbizRepositoryMapping getContentObject(String nodePath, String version) throws PathNotFoundException {

+        nodePath = JcrUtilJackrabbit.createAbsoluteNodePath(nodePath);

+        VersioningManager vm = new VersioningManagerJackrabbit(ocm);

+        if (!vm.checkIfVersionExist(nodePath, version)) {

+            Debug.logWarning("The version: " + version + " for content object: " + nodePath + " does not exist, the latest version for this object will be returned.", module);

+            return getContentObject(nodePath);

+        }

+

+        OfbizRepositoryMapping orm = (OfbizRepositoryMapping) ocm.getObject(nodePath, version);

+        orm.setVersion(version);

+        return orm;

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see org.ofbiz.jcr.orm.ContentReader#getJsonDataTree()

+     */

+    @Override

+    public JSONArray getJsonDataTree() throws RepositoryException {

+        return getJsonDataChildNodes(ocm.getSession().getRootNode());

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see org.ofbiz.jcr.access.ContentReader#getJsonFileTree()

+     */

+    @Override

+    public JSONArray getJsonFileTree() throws RepositoryException {

+        return getJsonFileChildNodes(ocm.getSession().getRootNode());

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.access.ContentReader#queryRepositoryData(java.lang.String)

+     */

+    @Override

+    public QueryResult queryRepositoryData(String query) throws RepositoryException {

+        return executeQuery(query);

+    }

+

+    /**

+     * Returns a JSON Array with the repository folder structure. The JSON array

+     * is directly build for the jsTree jQuery plugin.

+     *

+     * @param startNode

+     * @return

+     * @throws RepositoryException

+     */

+    private JSONArray getJsonFileChildNodes(Node startNode) throws RepositoryException {

+        NodeIterator nodeIterator = startNode.getNodes();

+

+        JSONArray folderStrucutre = new JSONArray();

+        JSONObject attr = new JSONObject();

+

+        while (nodeIterator.hasNext()) {

+            JSONObject folder = new JSONObject();

+            Node node = nodeIterator.nextNode();

+

+            if (node.getPrimaryNodeType().isNodeType(ConstantsJackrabbit.FOLDER)) {

+                attr.element("title", node.getName());

+                folder.element("data", attr);

+

+                attr = new JSONObject();

+                attr.element("NodePath", node.getPath());

+                attr.element("NodeType", node.getPrimaryNodeType().getName());

+                folder.element("attr", attr);

+

+                folder.element("children", getJsonFileChildNodes(node).toString());

+

+                folderStrucutre.element(folder);

+            } else if (node.getPrimaryNodeType().isNodeType(ConstantsJackrabbit.FILE)) {

+                attr = new JSONObject();

+                attr.element("title", node.getName());

+                folder.element("data", attr);

+

+                attr = new JSONObject();

+                attr.element("NodePath", node.getPath());

+                attr.element("NodeType", node.getPrimaryNodeType().getName());

+                folder.element("attr", attr);

+

+                folderStrucutre.element(folder);

+            }

+

+        }

+

+        return folderStrucutre;

+    }

+

+    /**

+     * Returns a JSON Array with the repository text data structure. The JSON

+     * array is directly build for the jsTree jQuery plugin.

+     *

+     * @param startNode

+     * @return

+     * @throws RepositoryException

+     */

+    private JSONArray getJsonDataChildNodes(Node startNode) throws RepositoryException {

+        NodeIterator nodeIterator = startNode.getNodes();

+

+        JSONArray folderStrucutre = new JSONArray();

+        JSONObject attr = new JSONObject();

+

+        while (nodeIterator.hasNext()) {

+            JSONObject folder = new JSONObject();

+            Node node = nodeIterator.nextNode();

+

+            //

+            if (node.getPrimaryNodeType().isNodeType(ConstantsJackrabbit.UNSTRUCTURED) && !node.hasProperty(ConstantsJackrabbit.MIXIN_LANGUAGE)) {

+                attr.element("title", node.getName());

+                folder.element("data", attr);

+

+                attr = new JSONObject();

+                attr.element("NodePath", node.getPath());

+                attr.element("NodeType", node.getPrimaryNodeType().getName());

+                folder.element("attr", attr);

+

+                folder.element("children", getJsonDataChildNodes(node).toString());

+

+                folderStrucutre.element(folder);

+            }

+        }

+

+        return folderStrucutre;

+    }

+

+    /**

+     * Executes the query specified by <code>statement</code> and returns the

+     * query result.

+     *

+     * @param statement

+     *            either a SQL2 or JQOM statement.

+     * @return the query result.

+     * @throws RepositoryException

+     *             if an error occurs.

+     */

+    protected QueryResult executeQuery(String statement) throws RepositoryException {

+        // TODO create a query manager which uses the OCM Layer.

+        QueryManager qm = ocm.getSession().getWorkspace().getQueryManager();

+

+        if (statement.trim().toLowerCase().startsWith("select")) {

+            return qm.createQuery(statement, Query.JCR_SQL2).execute();

+        } else {

+            return qm.createQuery(statement, Query.JCR_JQOM).execute();

+        }

+    }

+

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/ContentWriterJackrabbit.java b/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/ContentWriterJackrabbit.java
new file mode 100644
index 0000000..a1987e8
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/ContentWriterJackrabbit.java
@@ -0,0 +1,203 @@
+package org.ofbiz.jcr.access.jackrabbit;

+

+import javax.jcr.ItemExistsException;

+import javax.jcr.Node;

+import javax.jcr.PathNotFoundException;

+import javax.jcr.RepositoryException;

+import javax.jcr.lock.LockException;

+import javax.jcr.nodetype.ConstraintViolationException;

+import javax.jcr.nodetype.NoSuchNodeTypeException;

+import javax.jcr.version.VersionException;

+

+import org.apache.jackrabbit.ocm.exception.ObjectContentManagerException;

+import org.apache.jackrabbit.ocm.manager.ObjectContentManager;

+import org.ofbiz.base.util.Debug;

+import org.ofbiz.base.util.UtilValidate;

+import org.ofbiz.jcr.access.ContentWriter;

+import org.ofbiz.jcr.access.VersioningManager;

+import org.ofbiz.jcr.orm.OfbizRepositoryMapping;

+import org.ofbiz.jcr.util.jackrabbit.JcrUtilJackrabbit;

+

+public class ContentWriterJackrabbit implements ContentWriter {

+

+    private final static String module = ContentWriterJackrabbit.class.getName();

+

+    private final ObjectContentManager ocm;

+    private final VersioningManager versioningManager;

+

+    /**

+     *

+     * @param ocm

+     */

+    public ContentWriterJackrabbit(ObjectContentManager ocm) {

+        this.ocm = ocm;

+        versioningManager = new VersioningManagerJackrabbit(ocm);

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.access.ContentWriter#storeContentObject(org.ofbiz.jcr.orm

+     * .OfbizRepositoryMapping)

+     */

+    @Override

+    public void storeContentObject(OfbizRepositoryMapping orm) throws ObjectContentManagerException, ItemExistsException {

+        if (orm == null) {

+            return;

+        }

+

+        // we want to avoid same name sibling (SnS) for each node Type

+        try {

+            if (this.ocm.getSession().itemExists(orm.getPath())) {

+                // we could either throw an exception or call the update method

+                throw new ItemExistsException("There already exists an object stored at " + orm.getPath() + ". Please use update if you want to change it.");

+            }

+        } catch (ItemExistsException e) {

+            throw (e);

+        } catch (RepositoryException e) {

+            Debug.logError(e, module);

+            return;

+        }

+

+        // create all nodes in the node structure which do not exist yet

+        try {

+            createNodeStructure(orm.getPath(), orm.getClass().getAnnotation(org.apache.jackrabbit.ocm.mapper.impl.annotation.Node.class).jcrType());

+        } catch (PathNotFoundException e) {

+            Debug.logError(e, "The new node could not be created: " + orm.getPath(), module);

+            return;

+        } catch (RepositoryException e) {

+            Debug.logError(e, "The new node could not be created: " + orm.getPath(), module);

+            return;

+        }

+

+        ocm.insert(orm);

+        versioningManager.addContentToCheckInList(orm.getPath());

+

+        this.saveState();

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.access.ContentWriter#updateContentObject(org.ofbiz.jcr.

+     * orm.OfbizRepositoryMapping)

+     */

+    @Override

+    public void updateContentObject(OfbizRepositoryMapping orm) throws ObjectContentManagerException {

+        versioningManager.checkOutContentObject(orm.getPath());

+        ocm.update(orm);

+        this.saveState();

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.access.ContentWriter#removeContentObject(java.lang.String)

+     */

+    @Override

+    public void removeContentObject(String nodePath) throws ObjectContentManagerException {

+        nodePath = JcrUtilJackrabbit.createAbsoluteNodePath(nodePath);

+        versioningManager.checkOutContentObject(nodePath, true);

+

+        ocm.remove(nodePath);

+        this.saveState();

+    }

+

+    private void saveState() {

+        versioningManager.checkInContentAndSaveState();

+    }

+

+    /**

+     * Create the new Node structure.

+     *

+     * @param completeNodePath

+     * @param primaryNodeType

+     *            a primary node type from the mapping annotation class, that

+     *            will be used as primary type for the created nodes

+     * @throws PathNotFoundException

+     * @throws RepositoryException

+     */

+    private void createNodeStructure(String completeNodePath, String primaryNodeType) throws PathNotFoundException, RepositoryException {

+        // We have to check if the node structure (the sub nodes of the passed

+        // ORM Object) exist, otherwise they will be created.

+        String[] nodeStructure = completeNodePath.split(ConstantsJackrabbit.NODEPATHDELIMITER);

+        Node parentNode = null;

+        try {

+            parentNode = this.ocm.getSession().getRootNode();

+        } catch (RepositoryException e) {

+            Debug.logError(e, "The new node could not be created: " + completeNodePath, module);

+            return;

+        }

+

+        // We loop only over the sub nodes.

+        for (int i = 0; i < (nodeStructure.length - 1); i++) {

+            String node = nodeStructure[i];

+            if (UtilValidate.isEmpty(node)) {

+                continue;

+            }

+

+            parentNode = createNewSubNodeIfNotExist(primaryNodeType, parentNode, node);

+        }

+    }

+

+    /**

+     * Checks if the new node already exist, otherwise it will be created.

+     *

+     * @param primaryNodeType

+     * @param parentNode

+     * @param node

+     * @return

+     * @throws RepositoryException

+     * @throws PathNotFoundException

+     * @throws ItemExistsException

+     * @throws NoSuchNodeTypeException

+     * @throws LockException

+     * @throws VersionException

+     * @throws ConstraintViolationException

+     */

+    private Node createNewSubNodeIfNotExist(String primaryNodeType, Node parentNode, String node) throws RepositoryException, PathNotFoundException, ItemExistsException, NoSuchNodeTypeException, LockException, VersionException,

+            ConstraintViolationException {

+

+        if (parentNode.hasNode(node)) {

+            parentNode = parentNode.getNode(node);

+            versioningManager.checkOutContentObject(parentNode.getPath());

+        } else {

+            versioningManager.checkOutContentObject(parentNode.getPath());

+

+            Node newNode = addNewNode(primaryNodeType, parentNode, node);

+

+            versioningManager.addContentToCheckInList(newNode.getPath());

+            parentNode = newNode;

+        }

+

+        return parentNode;

+    }

+

+    /**

+     * The method adds a new node to its parent, write the versioning mixin and

+     * set the primary node type.

+     *

+     * @param primaryNodeType

+     * @param parentNode

+     * @param node

+     * @return

+     * @throws ItemExistsException

+     * @throws PathNotFoundException

+     * @throws NoSuchNodeTypeException

+     * @throws LockException

+     * @throws VersionException

+     * @throws ConstraintViolationException

+     * @throws RepositoryException

+     */

+    private Node addNewNode(String primaryNodeType, Node parentNode, String node) throws ItemExistsException, PathNotFoundException, NoSuchNodeTypeException, LockException, VersionException, ConstraintViolationException, RepositoryException {

+        Node newNode = parentNode.addNode(node, primaryNodeType);

+        newNode.addMixin(ConstantsJackrabbit.MIXIN_VERSIONING);

+        if (!ConstantsJackrabbit.ROOTPATH.equals(parentNode.getPath())) {

+            newNode.setPrimaryType(parentNode.getPrimaryNodeType().getName());

+        }

+        return newNode;

+    }

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/JackrabbitRepositoryAccessor.java b/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/JackrabbitRepositoryAccessor.java
new file mode 100644
index 0000000..1ee6ea0
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/JackrabbitRepositoryAccessor.java
@@ -0,0 +1,241 @@
+package org.ofbiz.jcr.access.jackrabbit;

+

+import java.util.List;

+

+import javax.jcr.ItemExistsException;

+import javax.jcr.PathNotFoundException;

+import javax.jcr.RepositoryException;

+import javax.jcr.Session;

+import javax.jcr.query.QueryResult;

+

+import net.sf.json.JSONArray;

+

+import org.apache.jackrabbit.ocm.exception.ObjectContentManagerException;

+import org.apache.jackrabbit.ocm.manager.impl.ObjectContentManagerImpl;

+import org.ofbiz.base.util.Debug;

+import org.ofbiz.entity.GenericValue;

+import org.ofbiz.jcr.access.ContentReader;

+import org.ofbiz.jcr.access.ContentWriter;

+import org.ofbiz.jcr.access.JcrRepositoryAccessor;

+import org.ofbiz.jcr.access.VersioningManager;

+import org.ofbiz.jcr.loader.JCRFactoryUtil;

+import org.ofbiz.jcr.loader.jackrabbit.JCRFactoryImpl;

+import org.ofbiz.jcr.orm.OfbizRepositoryMapping;

+

+public class JackrabbitRepositoryAccessor implements JcrRepositoryAccessor {

+

+    private final static String module = JackrabbitRepositoryAccessor.class.getName();

+

+    private final Session session;

+    private final ObjectContentManagerImpl ocm;

+

+    /**

+     * Create a repository Access object based on the userLogin.

+     *

+     * @param userLogin

+     */

+    public JackrabbitRepositoryAccessor(GenericValue userLogin) {

+        // TODO pass the userLogin to the getSession() method and perform some

+        this(JCRFactoryUtil.getSession());

+    }

+

+    /**

+     * Create a repository Access object based on a JCR Session.

+     *

+     * @param userLogin

+     */

+    public JackrabbitRepositoryAccessor(Session session) {

+        this.session = session;

+        this.ocm = new ObjectContentManagerImpl(session, JCRFactoryImpl.getMapper());

+

+        return;

+    }

+

+    /**

+     * Returns the Jackrabbit session object.

+     *

+     * @return

+     */

+    public Session getSession() {

+        return this.session;

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see org.ofbiz.jcr.orm.RepositoryAccess#closeAccess()

+     */

+    @Override

+    public void closeAccess() {

+        if (this.ocm != null && this.ocm.getSession().isLive()) {

+            this.ocm.logout();

+        }

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.orm.RepositoryAccess#getContentObject(java.lang.String)

+     */

+    @Override

+    public OfbizRepositoryMapping getContentObject(String nodePath) throws PathNotFoundException {

+        ContentReader contentReader = new ContentReaderJackrabbit(this.ocm);

+        return contentReader.getContentObject(nodePath);

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.access.RepositoryAccess#getContentObject(java.lang.String,

+     * java.lang.String)

+     */

+    @Override

+    public OfbizRepositoryMapping getContentObject(String nodePath, String version) throws PathNotFoundException {

+        ContentReader contentReader = new ContentReaderJackrabbit(this.ocm);

+        return contentReader.getContentObject(nodePath, version);

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.orm.RepositoryAccess#storeContentObject(org.ofbiz.jcr.orm

+     * .OfbizRepositoryMapping)

+     */

+    @Override

+    public void storeContentObject(OfbizRepositoryMapping orm) throws ObjectContentManagerException, ItemExistsException {

+        ContentWriter contentWriter = new ContentWriterJackrabbit(this.ocm);

+        contentWriter.storeContentObject(orm);

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.orm.RepositoryAccess#updateContentObject(org.ofbiz.jcr.

+     * orm.OfbizRepositoryMapping)

+     */

+    @Override

+    public void updateContentObject(OfbizRepositoryMapping orm) throws ObjectContentManagerException {

+        ContentWriter contentWriter = new ContentWriterJackrabbit(this.ocm);

+        contentWriter.updateContentObject(orm);

+

+        return;

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.orm.RepositoryAccess#removeContentObject(java.lang.String)

+     */

+    @Override

+    public void removeContentObject(String nodePath) throws ObjectContentManagerException {

+        ContentWriter contentWriter = new ContentWriterJackrabbit(this.ocm);

+        contentWriter.removeContentObject(nodePath);

+

+        return;

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.orm.RepositoryAccess#removeContentObject(org.ofbiz.jcr.

+     * orm.OfbizRepositoryMapping)

+     */

+    @Override

+    public void removeContentObject(OfbizRepositoryMapping orm) throws ObjectContentManagerException {

+        removeContentObject(orm.getPath());

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.access.RepositoryAccess#getVersionList(java.lang.String)

+     */

+    @Override

+    public List<String> getVersionList(String nodePath) {

+        VersioningManager versioningnManager = new VersioningManagerJackrabbit(this.ocm);

+        return versioningnManager.getVersionList(nodePath);

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.access.RepositoryAccess#getBaseVersion(java.lang.String)

+     */

+    @Override

+    public String getBaseVersion(String nodePath) {

+        VersioningManager versioningnManager = new VersioningManagerJackrabbit(this.ocm);

+        return versioningnManager.getBaseVersion(nodePath);

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.access.RepositoryAccess#getRootVersion(java.lang.String)

+     */

+    @Override

+    public String getRootVersion(String nodePath) {

+        VersioningManager versioningnManager = new VersioningManagerJackrabbit(this.ocm);

+        return versioningnManager.getRootVersion(nodePath);

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see org.ofbiz.jcr.orm.RepositoryAccess#getJsonFileTree()

+     */

+    @Override

+    public JSONArray getJsonDataTree() throws RepositoryException {

+        ContentReader contentReader = new ContentReaderJackrabbit(this.ocm);

+        return contentReader.getJsonDataTree();

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see org.ofbiz.jcr.access.RepositoryAccess#getJsonFileTree()

+     */

+    @Override

+    public JSONArray getJsonFileTree() throws RepositoryException {

+        ContentReader contentReader = new ContentReaderJackrabbit(this.ocm);

+        return contentReader.getJsonFileTree();

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.access.RepositoryAccess#queryForRepositoryData(java.lang

+     * .String)

+     */

+    @Override

+    public QueryResult queryForRepositoryData(String query) throws RepositoryException {

+        ContentReader contentReader = new ContentReaderJackrabbit(this.ocm);

+        return contentReader.queryRepositoryData(query);

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.access.JcrRepositoryAccessor#checkIfNodeExist(java.lang

+     * .String)

+     */

+    @Override

+    public boolean checkIfNodeExist(String nodePathToCheck) {

+        try {

+            return getSession().itemExists(nodePathToCheck);

+        } catch (RepositoryException e) {

+            Debug.logError(e, module);

+            return false;

+        }

+    }

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/VersioningManagerJackrabbit.java b/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/VersioningManagerJackrabbit.java
new file mode 100644
index 0000000..7ab3d92
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/access/jackrabbit/VersioningManagerJackrabbit.java
@@ -0,0 +1,233 @@
+package org.ofbiz.jcr.access.jackrabbit;

+

+import java.util.ArrayList;

+import java.util.Collections;

+import java.util.HashSet;

+import java.util.List;

+import java.util.Set;

+

+import javax.jcr.Node;

+import javax.jcr.NodeIterator;

+import javax.jcr.RepositoryException;

+import javax.jcr.UnsupportedRepositoryOperationException;

+import javax.jcr.version.VersionException;

+

+import org.apache.jackrabbit.ocm.manager.ObjectContentManager;

+import org.apache.jackrabbit.ocm.version.Version;

+import org.apache.jackrabbit.ocm.version.VersionIterator;

+import org.ofbiz.base.util.Debug;

+import org.ofbiz.jcr.access.VersioningManager;

+

+public class VersioningManagerJackrabbit implements VersioningManager {

+

+    private final static String module = VersioningManagerJackrabbit.class.getName();

+

+    private final ObjectContentManager ocm;

+

+    private final Set<String> checkedOutNodeStore = Collections.synchronizedSet(new HashSet<String>());

+    private final static String NOVERSION = "-0.0";

+

+    VersioningManagerJackrabbit(ObjectContentManager ocm) {

+        this.ocm = ocm;

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.access.VersioningManager#getVersionList(java.lang.String)

+     */

+    @Override

+    public List<String> getVersionList(String nodePath) {

+        List<String> result = new ArrayList<String>();

+        VersionIterator versionIterator = null;

+        try {

+            versionIterator = this.ocm.getAllVersions(nodePath);

+        } catch (VersionException e) {

+            Debug.logError(e, module);

+            // return an empty List

+            return result;

+        }

+

+        // write the versions to the array list.

+        while (versionIterator.hasNext()) {

+            Version version = (Version) versionIterator.next();

+            // filter the root version string, because it's not needed each node

+            // starts with the version number 1.0

+            if (!ConstantsJackrabbit.ROOTVERSION.equals(version.getName())) {

+                result.add(version.getName());

+            }

+        }

+

+        return result;

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.access.VersioningManager#checkIfVersionExist(java.lang.

+     * String, java.lang.String)

+     */

+    @Override

+    public boolean checkIfVersionExist(String nodePath, String version) {

+        return getVersionList(nodePath).contains(version);

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.access.VersioningManager#checkOutContentObject(java.lang

+     * .String)

+     */

+    @Override

+    public void checkOutContentObject(String nodePath) {

+        // check if the parent node is the root node, because the

+        // root node can not be checked out.

+        if (ConstantsJackrabbit.ROOTPATH.equals(nodePath)) {

+            return;

+        }

+

+        try {

+            if (this.ocm.getSession().nodeExists(nodePath) && !this.ocm.getSession().getWorkspace().getVersionManager().isCheckedOut(nodePath) && !checkedOutNodeStore.contains(nodePath)) {

+                this.ocm.checkout(nodePath);

+                this.addContentToCheckInList(nodePath);

+            }

+        } catch (VersionException e) {

+            Debug.logError(e, module);

+        } catch (UnsupportedRepositoryOperationException e) {

+            Debug.logError(e, module);

+        } catch (RepositoryException e) {

+            Debug.logError(e, module);

+        }

+    }

+

+    public void checkOutContentObject(String nodePath, boolean recursiv) {

+        if (recursiv) {

+            try {

+                checkOutRelatedNodes(nodePath);

+            } catch (RepositoryException e) {

+                Debug.logError(e, module);

+            }

+        } else {

+            checkOutContentObject(nodePath);

+        }

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.access.VersioningManager#addContentToCheckInList(java.lang

+     * .String)

+     */

+    @Override

+    public void addContentToCheckInList(String nodePath) {

+        checkedOutNodeStore.add(nodePath);

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see org.ofbiz.jcr.access.VersioningManager#checkInContentAndSaveState()

+     */

+    @Override

+    public void checkInContentAndSaveState() {

+        if (ocm != null) {

+            ocm.save();

+        }

+

+        try {

+            for (String nodePath : checkedOutNodeStore) {

+                // add the new resource content to the version history

+                if (this.ocm.getSession().nodeExists(nodePath) && this.ocm.getSession().getWorkspace().getVersionManager().isCheckedOut(nodePath)) {

+                    this.ocm.checkin(nodePath);

+                }

+            }

+

+            // reset the node store after everything is checked in

+            checkedOutNodeStore.clear();

+        } catch (VersionException e) {

+            Debug.logError(e, module);

+        } catch (UnsupportedRepositoryOperationException e) {

+            Debug.logError(e, module);

+        } catch (RepositoryException e) {

+            Debug.logError(e, module);

+        }

+

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.access.VersioningManager#getBaseVersion(java.lang.String)

+     */

+    public String getBaseVersion(String nodePath) {

+        try {

+            return ocm.getBaseVersion(nodePath).getName();

+        } catch (VersionException e) {

+            Debug.logError(e, module);

+            return NOVERSION;

+        }

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.access.VersioningManager#getRootVersion(java.lang.String)

+     */

+    public String getRootVersion(String nodePath) {

+        try {

+            return ocm.getRootVersion(nodePath).getName();

+        } catch (VersionException e) {

+            Debug.logError(e, module);

+            return NOVERSION;

+        }

+    }

+

+    /**

+     * Checks out recursively all related nodes (parent, all child's (if exists)

+     * and the node itself)

+     *

+     * @param startNode

+     * @throws RepositoryException

+     */

+    protected void checkOutRelatedNodes(String startNodePath) throws RepositoryException {

+        List<String> nodesToCheckOut = new ArrayList<String>();

+        nodesToCheckOut.add(startNodePath);

+        nodesToCheckOut.add(ocm.getSession().getNode(startNodePath).getParent().getPath());

+        if (ocm.getSession().getNode(startNodePath).hasNodes()) {

+            nodesToCheckOut.addAll(getAllChildNodes(startNodePath));

+        }

+

+        for (String node : nodesToCheckOut) {

+            this.checkOutContentObject(node);

+        }

+

+    }

+

+    /**

+     * Return recursively all child nodes

+     *

+     * @param startNode

+     * @return

+     * @throws RepositoryException

+     */

+    private List<String> getAllChildNodes(String startNode) throws RepositoryException {

+        List<String> nodes = new ArrayList<String>();

+        NodeIterator ni = ocm.getSession().getNode(startNode).getNodes();

+        while (ni.hasNext()) {

+            Node nextNode = ni.nextNode();

+            if (nextNode.hasNodes()) {

+                nodes.addAll(getAllChildNodes(nextNode.getPath()));

+            }

+

+            nodes.add(nextNode.getPath());

+        }

+

+        return nodes;

+    }

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/api/JcrDataHelper.java b/framework/jcr/src/org/ofbiz/jcr/api/JcrDataHelper.java
new file mode 100644
index 0000000..addeb02
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/api/JcrDataHelper.java
@@ -0,0 +1,88 @@
+package org.ofbiz.jcr.api;

+

+import java.util.Calendar;

+import java.util.List;

+

+import javax.jcr.ItemExistsException;

+import javax.jcr.PathNotFoundException;

+import javax.jcr.RepositoryException;

+

+import org.apache.jackrabbit.ocm.exception.ObjectContentManagerException;

+import org.ofbiz.jcr.orm.jackrabbit.JackrabbitArticle;

+

+public interface JcrDataHelper extends JcrHelper{

+

+    /**

+     * Read the article content object from the repository. Throws an Exception

+     * when the read content type is not an article content type.

+     *

+     * @param contentPath

+     * @return content article object

+     * @throws PathNotFoundException

+     * @throws ClassCastException

+     */

+    public abstract JackrabbitArticle readContentFromRepository(String contentPath) throws ClassCastException, PathNotFoundException;

+

+    /**

+     * @throws PathNotFoundException

+     * Read the article content object, in the passed language, from the

+     * repository. if the language is not available, the default language will

+     * be choose. Throws an Exception when the read content type is not an

+     * article content type.

+     *

+     * @param contentPath

+     * @return content article object

+     * @throws PathNotFoundException

+     * @throws ClassCastException

+     */

+    public abstract JackrabbitArticle readContentFromRepository(String contentPath, String language) throws ClassCastException, PathNotFoundException;

+

+    /**

+     * @throws PathNotFoundException

+     * Read the article content object, in the passed language and version, from

+     * the repository. if the language is not available, the default language

+     * will be choose. Throws an Exception when the read content type is not an

+     * article content type.

+     *

+     * @param contentPath

+     * @param language

+     * @param version

+     * @return

+     * @throws PathNotFoundException

+     * @throws ClassCastException

+     */

+    public abstract JackrabbitArticle readContentFromRepository(String contentPath, String language, String version) throws ClassCastException, PathNotFoundException;

+

+    /**

+     * Stores a new article content object in the repository.

+     *

+     * @param contentPath

+     * @param language

+     * @param title

+     * @param content

+     * @param publicationDate

+     * @throws ObjectContentManagerException

+     * @throws ItemExistsException

+     */

+    public abstract void storeContentInRepository(String contentPath, String language, String title, String content, Calendar publicationDate) throws ObjectContentManagerException, ItemExistsException;

+

+    /**

+     * Update an existing content article object in the repository.

+     *

+     * @param updatedArticle

+     * @throws RepositoryException

+     * @throws ObjectContentManagerException

+     */

+    public abstract void updateContentInRepository(JackrabbitArticle updatedArticle) throws RepositoryException, ObjectContentManagerException;

+

+    /**

+     * Returns a list of versions which are available for the current article.

+     * If no article is loaded before, the list will be empty.

+     *

+     * @return

+     */

+    public abstract List<String> getVersionListForCurrentArticle();

+

+    public abstract List<String> getAvailableLanguageList();

+

+}
\ No newline at end of file
diff --git a/framework/jcr/src/org/ofbiz/jcr/api/JcrFileHelper.java b/framework/jcr/src/org/ofbiz/jcr/api/JcrFileHelper.java
new file mode 100644
index 0000000..59bcf52
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/api/JcrFileHelper.java
@@ -0,0 +1,76 @@
+package org.ofbiz.jcr.api;

+

+import java.io.InputStream;

+

+import javax.jcr.PathNotFoundException;

+import javax.jcr.RepositoryException;

+

+import org.apache.jackrabbit.ocm.exception.ObjectContentManagerException;

+import org.ofbiz.jcr.orm.jackrabbit.JackrabbitHierarchyNode;

+

+public interface JcrFileHelper extends JcrHelper{

+

+    /**

+     * Returns a content file object from the repository. Throws an Exception

+     * when the read content type is not an article content type.

+     *

+     * @param contentPath

+     * @return

+     * @throws ClassCastException

+     * @throws PathNotFoundException

+     */

+    public abstract JackrabbitHierarchyNode getRepositoryContent(String contentPath) throws ClassCastException, PathNotFoundException;

+

+    /**

+     * Returns a content file object in the passed version from the repository.

+     * Throws an Exception when the read content type is not an article content

+     * type.

+     *

+     * @param contentPath

+     * @return

+     * @throws ClassCastException

+     * @throws PathNotFoundException

+     */

+    public abstract JackrabbitHierarchyNode getRepositoryContent(String contentPath, String version) throws ClassCastException, PathNotFoundException;

+

+    /**

+     * Stores a new file content object in the repository.

+     *

+     * @param fileData

+     * @param fileName

+     * @param folderPath

+     * @param mimeType

+     * @throws ObjectContentManagerException

+     * @throws RepositoryException

+     */

+    public abstract void storeContentInRepository(byte[] fileData, String fileName, String folderPath) throws ObjectContentManagerException, RepositoryException;

+

+    /**

+     * Stores a new file content object in the repository.

+     *

+     * @param fileData

+     * @param fileName

+     * @param folderPath

+     * @param mimeType

+     * @throws ObjectContentManagerException

+     * @throws RepositoryException

+     */

+    public abstract void storeContentInRepository(InputStream fileData, String fileName, String folderPath) throws ObjectContentManagerException, RepositoryException;

+

+    /**

+     * Returns TRUE if the current content is a file content (Type:

+     * OfbizRepositoryMappingJackrabbitFile)

+     *

+     * @return

+     */

+    public abstract boolean isFileContent();

+

+    /**

+     * Returns TRUE if the current content is a folder content (Type:

+     * OfbizRepositoryMappingJackrabbitFolder)

+     *

+     * @return

+     */

+    public abstract boolean isFolderContent();

+

+}
\ No newline at end of file
diff --git a/framework/jcr/src/org/ofbiz/jcr/api/JcrHelper.java b/framework/jcr/src/org/ofbiz/jcr/api/JcrHelper.java
new file mode 100644
index 0000000..e21fc5d
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/api/JcrHelper.java
@@ -0,0 +1,25 @@
+package org.ofbiz.jcr.api;

+

+import java.util.List;

+import java.util.Map;

+

+import javax.jcr.RepositoryException;

+

+public interface JcrHelper {

+

+    /**

+     * This will close the connection to the content repository and make sure

+     * that all changes a stored successfully.

+     */

+    public abstract void closeContentSession();

+

+    /**

+     * Remove the passed node from the content repository.

+     *

+     * @param contentPath

+     */

+    public abstract void removeContentObject(String contentPath);

+

+    public abstract List<Map<String, String>> queryData(String query) throws RepositoryException;

+

+}
\ No newline at end of file
diff --git a/framework/jcr/src/org/ofbiz/jcr/api/jackrabbit/JackrabbitAbstractHelper.java b/framework/jcr/src/org/ofbiz/jcr/api/jackrabbit/JackrabbitAbstractHelper.java
new file mode 100644
index 0000000..f4e324a
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/api/jackrabbit/JackrabbitAbstractHelper.java
@@ -0,0 +1,68 @@
+package org.ofbiz.jcr.api.jackrabbit;

+

+import java.util.ArrayList;

+import java.util.List;

+import java.util.Map;

+

+import javax.jcr.RepositoryException;

+import javax.jcr.query.QueryResult;

+import javax.jcr.query.Row;

+import javax.jcr.query.RowIterator;

+

+import javolution.util.FastMap;

+

+import org.ofbiz.base.util.Debug;

+import org.ofbiz.jcr.access.JcrRepositoryAccessor;

+import org.ofbiz.jcr.api.JcrHelper;

+

+public abstract class JackrabbitAbstractHelper implements JcrHelper {

+

+    private static String module = JackrabbitAbstractHelper.class.getName();

+

+    protected final JcrRepositoryAccessor access;

+

+    public JackrabbitAbstractHelper(JcrRepositoryAccessor accessor) {

+        this.access = accessor;

+    }

+

+    /* (non-Javadoc)

+     * @see org.ofbiz.jcr.api.jackrabbit.JcrHelper#closeContentSession()

+     */

+    @Override

+    public void closeContentSession() {

+        access.closeAccess();

+    }

+

+    /* (non-Javadoc)

+     * @see org.ofbiz.jcr.api.jackrabbit.JcrHelper#removeContentObject(java.lang.String)

+     */

+    @Override

+    public void removeContentObject(String contentPath) {

+        access.removeContentObject(contentPath);

+    }

+

+    /* (non-Javadoc)

+     * @see org.ofbiz.jcr.api.jackrabbit.JcrHelper#queryData(java.lang.String)

+     */

+    @Override

+    public List<Map<String, String>> queryData(String query) throws RepositoryException {

+        QueryResult qr = this.access.queryForRepositoryData(query);

+

+        List<Map<String, String>> resultNodePaths = new ArrayList<Map<String, String>>();

+        RowIterator rows = qr.getRows();

+        while (rows.hasNext()) {

+            Row row = rows.nextRow();

+            Map<String, String> content = FastMap.newInstance();

+            content.put("path", row.getPath());

+            content.put("score", String.valueOf(row.getScore()));

+

+            resultNodePaths.add(content);

+            if (Debug.isOn(Debug.INFO)) {

+                Debug.logInfo("For query: " + query + " found node with path: " + row.getPath(), module);

+            }

+

+        }

+

+        return resultNodePaths;

+    }

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/api/jackrabbit/JackrabbitArticleHelper.java b/framework/jcr/src/org/ofbiz/jcr/api/jackrabbit/JackrabbitArticleHelper.java
new file mode 100644
index 0000000..c89de14
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/api/jackrabbit/JackrabbitArticleHelper.java
@@ -0,0 +1,405 @@
+package org.ofbiz.jcr.api.jackrabbit;

+

+import java.util.ArrayList;

+import java.util.Calendar;

+import java.util.List;

+import java.util.Locale;

+

+import javax.jcr.ItemExistsException;

+import javax.jcr.Node;

+import javax.jcr.NodeIterator;

+import javax.jcr.PathNotFoundException;

+import javax.jcr.RepositoryException;

+import javax.jcr.Session;

+import javax.jcr.ValueFormatException;

+

+import org.apache.jackrabbit.ocm.exception.ObjectContentManagerException;

+import org.ofbiz.base.util.Debug;

+import org.ofbiz.base.util.UtilValidate;

+import org.ofbiz.entity.GenericValue;

+import org.ofbiz.jcr.access.jackrabbit.ConstantsJackrabbit;

+import org.ofbiz.jcr.access.jackrabbit.JackrabbitRepositoryAccessor;

+import org.ofbiz.jcr.api.JcrDataHelper;

+import org.ofbiz.jcr.orm.OfbizRepositoryMapping;

+import org.ofbiz.jcr.orm.jackrabbit.JackrabbitArticle;

+import org.ofbiz.jcr.util.jackrabbit.JcrUtilJackrabbit;

+

+/**

+ * This Helper class encapsulate the jcr article content bean. it provide all

+ * attributes and operations which are necessary to work with the content

+ * repository.

+ *

+ * The concrete implementations covers the different content use case related

+ * workflows. I.E. Different behavior for File/Folder or Text content.

+ *

+ * The Helper classes should be build on top of the generic JCR implementation

+ * in the Framework.

+ *

+ */

+public class JackrabbitArticleHelper extends JackrabbitAbstractHelper implements JcrDataHelper {

+

+    private final static String module = JackrabbitArticleHelper.class.getName();

+

+    private JackrabbitArticle article = null;

+    private static List<String> possibleLocales = null;

+

+    static {

+        if (UtilValidate.isEmpty(possibleLocales)) {

+            possibleLocales = new ArrayList<String>();

+            List<Locale> locales = org.ofbiz.base.util.UtilMisc.availableLocales();

+            for (Locale locale : locales) {

+                possibleLocales.add(locale.toString());

+            }

+        }

+    }

+

+    /**

+     * Setup my content Object

+     */

+    public JackrabbitArticleHelper(GenericValue userLogin) {

+        super(new JackrabbitRepositoryAccessor(userLogin));

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.api.jackrabbit.DataHelper#readContentFromRepository(java

+     * .lang.String)

+     */

+    @Override

+    public JackrabbitArticle readContentFromRepository(String contentPath) throws ClassCastException, PathNotFoundException {

+        return readContentFromRepository(contentPath, "");

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.api.jackrabbit.DataHelper#readContentFromRepository(java

+     * .lang.String, java.lang.String)

+     */

+    @Override

+    public JackrabbitArticle readContentFromRepository(String contentPath, String language) throws ClassCastException, PathNotFoundException {

+        contentPath = determineContentLanguagePath(contentPath, language);

+

+        OfbizRepositoryMapping orm = super.access.getContentObject(contentPath);

+

+        if (checkAndSetArticleContentObject(orm)) {

+            article.setVersion(super.access.getBaseVersion(contentPath));

+            return article;

+        } else {

+            throw new ClassCastException("The content object for the path: " + contentPath + " is not an article content object. This Helper can only handle content objects with the type: " + JackrabbitArticle.class.getName());

+        }

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.api.jackrabbit.DataHelper#readContentFromRepository(java

+     * .lang.String, java.lang.String, java.lang.String)

+     */

+    @Override

+    public JackrabbitArticle readContentFromRepository(String contentPath, String language, String version) throws ClassCastException, PathNotFoundException {

+        contentPath = determineContentLanguagePath(contentPath, language);

+        OfbizRepositoryMapping orm = super.access.getContentObject(contentPath, version);

+

+        if (checkAndSetArticleContentObject(orm)) {

+            // the content path must be manipulated because, the jackrabbit orm

+            // returns a full blown path with version information.

+            article.setPath(contentPath);

+            return article;

+        } else {

+            throw new ClassCastException("The content object for the path: " + contentPath + " is not an article content object. This Helper can only handle content objects with the type: " + JackrabbitArticle.class.getName());

+        }

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.api.jackrabbit.DataHelper#storeContentInRepository(java

+     * .lang.String, java.lang.String, java.lang.String, java.lang.String,

+     * java.util.Calendar)

+     */

+    @Override

+    public void storeContentInRepository(String contentPath, String language, String title, String content, Calendar publicationDate) throws ObjectContentManagerException, ItemExistsException {

+        if (UtilValidate.isEmpty(language)) {

+            language = JcrUtilJackrabbit.determindeTheDefaultLanguage();

+        }

+

+        // construct the content article object

+        article = new JackrabbitArticle(contentPath, language, title, content, publicationDate);

+

+        super.access.storeContentObject(article);

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.api.jackrabbit.DataHelper#updateContentInRepository(org

+     * .ofbiz.jcr.orm.jackrabbit.OfbizRepositoryMappingJackrabbitArticle)

+     */

+    @Override

+    public void updateContentInRepository(JackrabbitArticle updatedArticle) throws RepositoryException, ObjectContentManagerException {

+        // if the item not already exist create it.

+        if (!super.access.checkIfNodeExist(updatedArticle.getPath())) {

+            Debug.logWarning("This content object with the path: " + updatedArticle.getPath() + " doesn't exist in the repository. It will now created.", module);

+            this.storeContentInRepository(updatedArticle.getPath(), updatedArticle.getLanguage(), updatedArticle.getTitle(), updatedArticle.getContent(), updatedArticle.getPubDate());

+            return;

+        }

+

+        super.access.updateContentObject(updatedArticle);

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.api.jackrabbit.DataHelper#getVersionListForCurrentArticle()

+     */

+    @Override

+    public List<String> getVersionListForCurrentArticle() {

+        List<String> versions = new ArrayList<String>();

+

+        if (article != null) {

+            versions = super.access.getVersionList(article.getPath());

+        } else {

+            Debug.logWarning("No Article is loaded from the repository, please load an article first before requesting the version list.", module);

+            versions = new ArrayList<String>(1);

+        }

+

+        return versions;

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see org.ofbiz.jcr.api.jackrabbit.DataHelper#getAvailableLanguageList()

+     */

+    @Override

+    public List<String> getAvailableLanguageList() {

+        List<String> availableLanguages = new ArrayList<String>();

+

+        if (article == null || !article.getLocalized()) {

+            Debug.logWarning("No Article is loaded from the repository, please load an article first before requesting the version list.", module);

+            return availableLanguages;

+        }

+

+        Session session = super.access.getSession();

+

+        try {

+            Node node = session.getNode(article.getPath()).getParent();

+            NodeIterator nodeList = node.getNodes();

+

+            while (nodeList.hasNext()) {

+                Node currentNodeToExtractLanguage = nodeList.nextNode();

+                // only use nodes which have the language mix in

+                if (checkIfNodeHaveValidLanguageMixIn(currentNodeToExtractLanguage)) {

+                    String languageFlag = extractLanguageFlagFromNodePath(currentNodeToExtractLanguage.getPath());

+                    availableLanguages.add(languageFlag);

+                }

+            }

+

+        } catch (PathNotFoundException e) {

+            Debug.logError(e, module);

+        } catch (RepositoryException e) {

+            Debug.logError(e, module);

+        }

+

+        return availableLanguages;

+    }

+

+    /**

+     * This method should determine the correct language for the content. It

+     * covers the case when the passed language is not available.

+     *

+     * A default (system) language will be taken, if the passed language, does

+     * not exist, if no default language node is specified the first language

+     * node which will be found will be choose.

+     *

+     * @param contentPath

+     * @param contentLanguage

+     * @return

+     * @throws PathNotFoundException

+     */

+    private String determineContentLanguagePath(String contentPath, String contentLanguage) throws PathNotFoundException {

+        // return if only the root node path is requested

+        if (ConstantsJackrabbit.ROOTPATH.equals(contentPath)) {

+            return contentPath;

+        }

+

+        // contentLanaguage should never be null, because the concatenation

+        // looks really bad if the String have a null value.

+        if (contentLanguage == null) {

+            contentLanguage = "";

+        }

+

+        String canonicalizedContentPath = canonicalizeContentPath(contentPath, contentLanguage);

+

+        // Step 1.) Check if the requested node language combination exist and

+        // if it have a valid localize flag

+        // Step 2.) If the first condition is not true, check the combination

+        // from node path and default language have a valid node result

+        // Step 3.) If condition one and two are false, determine the first node

+        // which have a valid language flag

+

+        if (super.access.checkIfNodeExist(canonicalizedContentPath + contentLanguage) && checkIfNodeHaveValidLanguageMixIn(canonicalizedContentPath + contentLanguage)) {

+            contentPath = canonicalizedContentPath + contentLanguage;

+        } else if (super.access.checkIfNodeExist(canonicalizedContentPath + JcrUtilJackrabbit.determindeTheDefaultLanguage())) {

+            contentPath = canonicalizedContentPath + JcrUtilJackrabbit.determindeTheDefaultLanguage();

+        } else {

+            contentPath = determineFirstAvailableLanguageNode(canonicalizedContentPath);

+        }

+

+        return contentPath;

+    }

+

+    /**

+     * Iterate over all child nodes and returns the first with a valid language

+     * flag.

+     *

+     * @param canonicalizedContentPath

+     * @return

+     * @throws PathNotFoundException

+     */

+    private String determineFirstAvailableLanguageNode(String canonicalizedContentPath) throws PathNotFoundException {

+        String contentPath = "";

+

+        try {

+            // return the first available language

+            NodeIterator childNodes = super.access.getSession().getNode(canonicalizedContentPath).getNodes();

+            while (childNodes.hasNext()) {

+                Node child = childNodes.nextNode();

+                if (possibleLocales.contains(child.getName()) && checkIfNodeHaveValidLanguageMixIn(child)) {

+                    contentPath = child.getPath();

+                    break;

+                }

+            }

+            childNodes = null;

+        } catch(PathNotFoundException pnf) {

+            throw new PathNotFoundException(pnf);

+        } catch (RepositoryException e) {

+            Debug.logError(e, module);

+        }

+        return contentPath;

+    }

+

+    /**

+     * We check if the content path already contains a language. If a language

+     * is found it will be removed from the path string.

+     *

+     * @param contentPath

+     * @return

+     */

+    private String canonicalizeContentPath(String contentPath, String contentLanguage) {

+        // we split the path string in chunks

+        String[] splitContentPath = contentPath.split(ConstantsJackrabbit.NODEPATHDELIMITER);

+

+        String canonicalizedCotnentPath = "";

+        // check if the last chunk contains a language which is part of our

+        // locale list, but this should only be called if the language should be

+        // changed. Because it is possible to request a node directly with the

+        // language flag. That means if the node path contains a language and

+        // the language should not be changed (contentLanaguage is empty), the

+        // language flag should be stay in the content path.

+        if (UtilValidate.isNotEmpty(contentLanguage) && possibleLocales.contains(splitContentPath[splitContentPath.length - 1])) {

+            // this local field should not be part of our path string

+            canonicalizedCotnentPath = buildCanonicalizeContentPath(splitContentPath, splitContentPath.length - 1);

+        } else {

+            // make sure the passed content path is absolute and ends with a

+            // slash "/"

+            canonicalizedCotnentPath = buildCanonicalizeContentPath(splitContentPath, splitContentPath.length);

+        }

+

+        return canonicalizedCotnentPath;

+    }

+

+    /**

+     * Build a new path string from the split content path. A loop iterates

+     * throw the array until lastFieldWhichShouldBeAddedToTheNewPathString is

+     * reached. That means if you want to avoid that the last field of the array

+     * is added to the string lastFieldWhichShouldBeAddedToTheNewPathString

+     * should be array.length -1.

+     *

+     * @param splitContentPath

+     * @param lastFieldWhichShouldBeAddedToTheNewPathString

+     * @return

+     */

+    private String buildCanonicalizeContentPath(String[] splitContentPath, int lastFieldWhichShouldBeAddedToTheNewPathString) {

+        StringBuffer canonicalizedContentPath = new StringBuffer(ConstantsJackrabbit.ROOTPATH);

+

+        for (int i = 0; i < lastFieldWhichShouldBeAddedToTheNewPathString; i++) {

+            if (UtilValidate.isNotEmpty(splitContentPath[i])) {

+                canonicalizedContentPath.append(splitContentPath[i]).append(ConstantsJackrabbit.NODEPATHDELIMITER);

+            }

+        }

+        return canonicalizedContentPath.toString();

+    }

+

+    /**

+     * This extract the language flag from the node path, normally the language

+     * should be the substring after the last / (slash).

+     *

+     * @param nodePathWithLanguageFlag

+     * @return

+     */

+    private String extractLanguageFlagFromNodePath(String nodePathWithLanguageFlag) {

+        int startPointAfterLastSlash = nodePathWithLanguageFlag.lastIndexOf(ConstantsJackrabbit.NODEPATHDELIMITER) + 1;

+

+        return nodePathWithLanguageFlag.substring(startPointAfterLastSlash);

+    }

+

+    /**

+     * Checks if a node have the property <code>localized</code> and if this

+     * property is be <code>true</code>. If an exception occurs false will be

+     * returned.

+     *

+     * @param nodePathWhichShouldHaveAValidLanguageFlag

+     * @return

+     */

+    private boolean checkIfNodeHaveValidLanguageMixIn(String nodePathWhichShouldHaveAValidLanguageFlag) {

+        try {

+            Node node = super.access.getSession().getNode(nodePathWhichShouldHaveAValidLanguageFlag);

+            return checkIfNodeHaveValidLanguageMixIn(node);

+        } catch (RepositoryException e) {

+            Debug.logError(e, module);

+            return false;

+        }

+    }

+

+    /**

+     * Checks if a node have the property <code>localized</code> and if this

+     * property is be <code>true</code>

+     *

+     * @param nodeWhichShouldHaveAValidLanguageFlag

+     * @return

+     * @throws RepositoryException

+     * @throws ValueFormatException

+     * @throws PathNotFoundException

+     */

+    private boolean checkIfNodeHaveValidLanguageMixIn(Node nodeWhichShouldHaveAValidLanguageFlag) throws RepositoryException, ValueFormatException, PathNotFoundException {

+        return nodeWhichShouldHaveAValidLanguageFlag.hasProperty("localized") && nodeWhichShouldHaveAValidLanguageFlag.getProperty("localized").getBoolean();

+    }

+

+    /**

+     * Checks if the <code>orm</code> Object is an instance of

+     * <code>JackrabbitArticle</code>, set the class variable and return true,

+     * otherwise false will be returned and the class variable is det to null.

+     *

+     * @param orm

+     * @return

+     */

+    private boolean checkAndSetArticleContentObject(OfbizRepositoryMapping orm) {

+        if (orm != null && orm instanceof JackrabbitArticle) {

+            article = (JackrabbitArticle) orm;

+            return true;

+        } else {

+            article = null;

+        }

+

+        return false;

+    }

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/api/jackrabbit/JackrabbitFileHelper.java b/framework/jcr/src/org/ofbiz/jcr/api/jackrabbit/JackrabbitFileHelper.java
new file mode 100644
index 0000000..e63880e
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/api/jackrabbit/JackrabbitFileHelper.java
@@ -0,0 +1,220 @@
+package org.ofbiz.jcr.api.jackrabbit;

+

+import java.io.ByteArrayInputStream;

+import java.io.IOException;

+import java.io.InputStream;

+import java.util.GregorianCalendar;

+

+import javax.jcr.PathNotFoundException;

+import javax.jcr.RepositoryException;

+

+import org.apache.jackrabbit.ocm.exception.ObjectContentManagerException;

+import org.apache.tika.Tika;

+import org.apache.tika.io.TikaInputStream;

+import org.ofbiz.base.util.Debug;

+import org.ofbiz.base.util.UtilValidate;

+import org.ofbiz.entity.GenericValue;

+import org.ofbiz.jcr.access.jackrabbit.ConstantsJackrabbit;

+import org.ofbiz.jcr.access.jackrabbit.JackrabbitRepositoryAccessor;

+import org.ofbiz.jcr.api.JcrFileHelper;

+import org.ofbiz.jcr.orm.OfbizRepositoryMapping;

+import org.ofbiz.jcr.orm.jackrabbit.JackrabbitFile;

+import org.ofbiz.jcr.orm.jackrabbit.JackrabbitFolder;

+import org.ofbiz.jcr.orm.jackrabbit.JackrabbitHierarchyNode;

+import org.ofbiz.jcr.orm.jackrabbit.JackrabbitResource;

+import org.ofbiz.jcr.util.jackrabbit.JcrUtilJackrabbit;

+

+/**

+ * This Helper class encapsulate the jcr file content bean. it provide all

+ * attributes and operations which are necessary to work with the content

+ * repository.

+ *

+ * The concrete implementations covers the different content use case related

+ * workflows. I.E. Different behavior for File/Folder or Text content.

+ *

+ * The Helper classes should be build on top of the generic JCR implementation

+ * in the Framework.

+ *

+ */

+public class JackrabbitFileHelper extends JackrabbitAbstractHelper implements JcrFileHelper {

+

+    private final static String module = JackrabbitFileHelper.class.getName();

+

+    private JackrabbitHierarchyNode hierarchy = null;

+

+    public JackrabbitFileHelper(GenericValue userLogin) {

+        super(new JackrabbitRepositoryAccessor(userLogin));

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.api.jackrabbit.FileHelper#getRepositoryContent(java.lang

+     * .String)

+     */

+    @Override

+    public JackrabbitHierarchyNode getRepositoryContent(String contentPath) throws ClassCastException, PathNotFoundException {

+        return getRepositoryContent(contentPath, null);

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.api.jackrabbit.FileHelper#getRepositoryContent(java.lang

+     * .String, java.lang.String)

+     */

+    @Override

+    public JackrabbitHierarchyNode getRepositoryContent(String contentPath, String version) throws ClassCastException, PathNotFoundException {

+        OfbizRepositoryMapping orm = null;

+        if (version != null) {

+            orm = super.access.getContentObject(contentPath, version);

+        } else {

+            orm = super.access.getContentObject(contentPath);

+        }

+

+        if (orm instanceof JackrabbitFile) {

+            JackrabbitFile fileObj = (JackrabbitFile) orm;

+            hierarchy = fileObj;

+            return fileObj;

+        } else if (orm instanceof JackrabbitFolder) {

+            JackrabbitFile fileObj = (JackrabbitFile) orm;

+            hierarchy = fileObj;

+            return fileObj;

+        }

+

+        throw new ClassCastException("The content object for the path: " + contentPath + " is not a file content object. This Helper can only handle content objects with the type: " + JackrabbitFile.class.getName());

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.api.jackrabbit.FileHelper#storeContentInRepository(byte[],

+     * java.lang.String, java.lang.String)

+     */

+    @Override

+    public void storeContentInRepository(byte[] fileData, String fileName, String folderPath) throws ObjectContentManagerException, RepositoryException {

+        storeContentInRepository(new ByteArrayInputStream(fileData), fileName, folderPath);

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.api.jackrabbit.FileHelper#storeContentInRepository(java

+     * .io.InputStream, java.lang.String, java.lang.String)

+     */

+    @Override

+    public void storeContentInRepository(InputStream fileData, String fileName, String folderPath) throws ObjectContentManagerException, RepositoryException {

+        if (UtilValidate.isEmpty(folderPath)) {

+            throw new ObjectContentManagerException("Please specify a folder path, the folder path should not be empty!");

+        } else if (ConstantsJackrabbit.ROOTPATH.equals(folderPath)) {

+            throw new ObjectContentManagerException("Please specify a folder, a file content can't be stored directly under root.");

+        }

+

+        JackrabbitResource ormResource = createResource(fileData);

+

+        JackrabbitFile ormFile = createFile(fileName, ormResource);

+

+        // Create the folder if necessary, otherwise we just update the folder

+        // content

+        folderPath = JcrUtilJackrabbit.createAbsoluteNodePath(folderPath);

+        if (super.access.checkIfNodeExist(folderPath)) {

+            OfbizRepositoryMapping orm = super.access.getContentObject(folderPath);

+            if (orm instanceof JackrabbitFolder) {

+                JackrabbitFolder ormFolder = (JackrabbitFolder) orm;

+                ormFolder.addChild(ormFile);

+                super.access.updateContentObject(ormFolder);

+            }

+        } else {

+            JackrabbitFolder ormFolder = createFolder(folderPath, ormFile);

+            super.access.storeContentObject(ormFolder);

+        }

+

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see org.ofbiz.jcr.api.jackrabbit.FileHelper#isFileContent()

+     */

+    @Override

+    public boolean isFileContent() {

+        return (hierarchy instanceof JackrabbitFile);

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see org.ofbiz.jcr.api.jackrabbit.FileHelper#isFolderContent()

+     */

+    @Override

+    public boolean isFolderContent() {

+        return (hierarchy instanceof JackrabbitFolder);

+    }

+

+    private static String getMimeTypeFromInputStream(InputStream is) {

+        if (!TikaInputStream.isTikaInputStream(is)) {

+            is = TikaInputStream.get(is);

+        }

+        Tika tika = new Tika();

+        try {

+            return tika.detect(is);

+        } catch (IOException e) {

+            Debug.logError(e, module);

+            return "application/octet-stream";

+        }

+    }

+

+    /**

+     * Creates a Jackrabbit Folder Object which should be stored in the

+     * repository.

+     *

+     * @param folderPath

+     * @param ormFile

+     * @return

+     */

+    private JackrabbitFolder createFolder(String folderPath, JackrabbitFile ormFile) {

+        // create the ORM folder Object

+        JackrabbitFolder ormFolder = new JackrabbitFolder();

+        ormFolder.addChild(ormFile);

+        ormFolder.setPath(folderPath);

+        return ormFolder;

+    }

+

+    /**

+     * Creates a Jackrabbit File Object which is needed for a Jackrabbit Folder

+     * Object.

+     *

+     * @param fileName

+     * @param ormResource

+     * @return

+     */

+    private JackrabbitFile createFile(String fileName, JackrabbitResource ormResource) {

+        // create an ORM File Object

+        JackrabbitFile ormFile = new JackrabbitFile();

+        ormFile.setCreationDate(new GregorianCalendar());

+        ormFile.setResource(ormResource);

+        ormFile.setPath(fileName);

+        return ormFile;

+    }

+

+    /**

+     * Creates a Jackrabbit Resource Object which is needed for a Jackrabbit

+     * File Object.

+     *

+     * @param fileData

+     * @return

+     */

+    private JackrabbitResource createResource(InputStream fileData) {

+        // create an ORM Resource Object

+        JackrabbitResource ormResource = new JackrabbitResource();

+        ormResource.setData(fileData);

+        ormResource.setMimeType(getMimeTypeFromInputStream(fileData));

+        ormResource.setLastModified(new GregorianCalendar());

+        return ormResource;

+    }

+

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/handler/JcrEventHandler.java b/framework/jcr/src/org/ofbiz/jcr/handler/JcrEventHandler.java
new file mode 100644
index 0000000..8053b1e
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/handler/JcrEventHandler.java
@@ -0,0 +1,5 @@
+package org.ofbiz.jcr.handler;

+

+public interface JcrEventHandler {

+

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/loader/JCRContainer.java b/framework/jcr/src/org/ofbiz/jcr/loader/JCRContainer.java
new file mode 100644
index 0000000..cc80949
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/loader/JCRContainer.java
@@ -0,0 +1,203 @@
+/*******************************************************************************

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements.  See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership.  The ASF licenses this file

+ * to you 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.

+ *******************************************************************************/

+package org.ofbiz.jcr.loader;

+

+import javax.jcr.Repository;

+import javax.jcr.RepositoryException;

+import javax.naming.Context;

+import javax.naming.NamingException;

+import javax.naming.Reference;

+import javax.naming.StringRefAddr;

+

+import org.ofbiz.base.config.GenericConfigException;

+import org.ofbiz.base.config.ResourceLoader;

+import org.ofbiz.base.container.Container;

+import org.ofbiz.base.container.ContainerConfig;

+import org.ofbiz.base.container.ContainerException;

+import org.ofbiz.base.util.Debug;

+import org.ofbiz.base.util.JNDIContextFactory;

+import org.ofbiz.base.util.UtilXml;

+import org.w3c.dom.Element;

+

+/**

+ * A container for a local JCR-compliant content repository. The default

+ * implementation uses Apache Jackrabbit.

+ */

+public class JCRContainer implements Container {

+

+    public static final String module = JCRContainer.class.getName();

+

+    public static final String DEFAULT_JCR_CONFIG_PATH = "framework/jcr/config/jcr-config.xml";

+    public static final String REP_HOME_DIR = "0";

+    public static final String CONFIG_FILE_PATH = "1";

+

+    private static String jndiName = null;

+    private static String factoryClassName = null;

+    private static String jcrContextName = null;

+

+    private static String configFilePath = null;

+    private boolean removeRepositoryOnShutdown = false;

+    private String homeDir = null;

+

+    Context jndiContext = null;

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see org.ofbiz.base.container.Container#init(java.lang.String[],

+     * java.lang.String)

+     */

+    @Override

+    public void init(String[] args, String configFile) throws ContainerException {

+        // get the container configuration

+        ContainerConfig.Container cc = ContainerConfig.getContainer("jcr-container", configFile);

+        if (cc == null) {

+            throw new ContainerException("No jcr-container configuration found in container config!");

+        }

+

+        // embedded properties

+        removeRepositoryOnShutdown = ContainerConfig.getPropertyValue(cc, "removeRepositoryOnShutdown", false);

+        configFilePath = ContainerConfig.getPropertyValue(cc, "configFilePath", DEFAULT_JCR_CONFIG_PATH);

+

+        Element configRootElement = null;

+        try {

+            configRootElement = ResourceLoader.getXmlRootElement(configFilePath);

+        } catch (GenericConfigException e) {

+            throw new ContainerException("Could not load the jcr configuration in file " + configFilePath, e);

+        }

+

+        if (configRootElement == null) {

+            throw new ContainerException("No jcr configuration found in file " + configFilePath);

+        }

+

+        homeDir = UtilXml.childElementAttribute(configRootElement, "home-dir", "path", "runtime/data/jcr/");

+        Element childElement = UtilXml.firstChildElement(configRootElement, "jcr-context");

+        jcrContextName = UtilXml.elementAttribute(childElement, "name", "default");

+

+        // find the default JCR implementation

+        for (Element curElement : UtilXml.childElementList(configRootElement, "jcr")) {

+            if (jcrContextName.equals(curElement.getAttribute("name"))) {

+                factoryClassName = curElement.getAttribute("class");

+                jndiName = curElement.getAttribute("jndi-name");

+                break;

+            }

+        }

+

+        // get the default JCR factory

+        JCRFactory jcrFactory = JCRFactoryUtil.getJCRFactory();

+

+        if (jcrFactory == null) {

+            throw new ContainerException("Cannot load JCRFactory implementation class");

+        }

+

+        try {

+            jcrFactory.initialize(configRootElement);

+        } catch (RepositoryException e) {

+            throw new ContainerException("Cannot initialize JCRFactory context", e);

+        }

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see org.ofbiz.base.container.Container#start()

+     */

+    @Override

+    public boolean start() throws ContainerException {

+        JCRFactory jcrFactory = JCRFactoryUtil.getJCRFactory();

+        if (jcrFactory == null) {

+            throw new ContainerException("Cannot load JCRFactory implementation class");

+        }

+

+        try {

+            jcrFactory.start();

+        } catch (RepositoryException e) {

+            throw new ContainerException("Cannot start JCRFactory context", e);

+        }

+

+        // get JNDI context

+        try {

+            jndiContext = JNDIContextFactory.getInitialContext("localjndi");

+        } catch (GenericConfigException e) {

+            Debug.logError(e, module);

+        }

+

+        bindRepository();

+        // Test JNDI bind

+        RepositoryLoader.getRepository();

+

+        return true;

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see org.ofbiz.base.container.Container#stop()

+     */

+    @Override

+    public void stop() throws ContainerException {

+        JCRFactory jcrFactory = JCRFactoryUtil.getJCRFactory();

+        if (jcrFactory == null) {

+            throw new ContainerException("Cannot load JCRFactory implementation class");

+        }

+

+        try {

+            jcrFactory.stop(removeRepositoryOnShutdown);

+        } catch (RepositoryException e) {

+            throw new ContainerException("Cannot stop JCRFactory context", e);

+        }

+    }

+

+    /**

+     * returns the class name of the JCRFactory implementation

+     *

+     * @return

+     */

+    public static String getFactoryClassName() {

+        return factoryClassName;

+    }

+

+    public static String getConfigFilePath() {

+        return configFilePath;

+    }

+

+    protected void bindRepository() {

+        if (this.jndiContext != null) {

+            try {

+                Reference ref = new Reference(Repository.class.getName(), org.ofbiz.jcr.loader.RepositoryFactory.class.getName(), null);

+                ref.add(new StringRefAddr(REP_HOME_DIR, homeDir));

+                ref.add(new StringRefAddr(CONFIG_FILE_PATH, configFilePath));

+                this.jndiContext.bind(jndiName, ref);

+                Debug.logInfo("Repository bound to JNDI as " + jndiName, module);

+            } catch (NamingException ne) {

+                Debug.logError(ne, module);

+            }

+        }

+    }

+

+    protected void unbindRepository(String name) {

+        if (this.jndiContext != null) {

+            try {

+                this.jndiContext.unbind(jndiName);

+            } catch (NamingException e) {

+                Debug.logError(e, module);

+            }

+        }

+    }

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/loader/JCRFactory.java b/framework/jcr/src/org/ofbiz/jcr/loader/JCRFactory.java
new file mode 100644
index 0000000..7dcab5d
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/loader/JCRFactory.java
@@ -0,0 +1,64 @@
+/*******************************************************************************

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements.  See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership.  The ASF licenses this file

+ * to you 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.

+ *******************************************************************************/

+package org.ofbiz.jcr.loader;

+

+import javax.jcr.Repository;

+import javax.jcr.RepositoryException;

+import javax.jcr.Session;

+

+import org.w3c.dom.Element;

+

+public interface JCRFactory {

+

+    /**

+     *

+     * @param configRootElement

+     * @throws RepositoryException

+     */

+    public void initialize(Element configRootElement) throws RepositoryException;

+

+    /**

+     *

+     * @throws RepositoryException

+     */

+    public void start() throws RepositoryException;

+

+    /**

+     *

+     * @param removeRepositoryOnShutdown

+     * @throws RepositoryException

+     */

+    public void stop(boolean removeRepositoryOnShutdown) throws RepositoryException;

+

+    /**

+     *

+     * @param workspaceName

+     * @return

+     * @throws RepositoryException

+     */

+    public Session createSession() throws RepositoryException;

+

+    /**

+     * Should return an instance of the repository implementation.

+     *

+     * @return

+     */

+    public Repository getInstance();

+

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/loader/JCRFactoryUtil.java b/framework/jcr/src/org/ofbiz/jcr/loader/JCRFactoryUtil.java
new file mode 100644
index 0000000..0fee454
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/loader/JCRFactoryUtil.java
@@ -0,0 +1,73 @@
+/*******************************************************************************

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements.  See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership.  The ASF licenses this file

+ * to you 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.

+ *******************************************************************************/

+package org.ofbiz.jcr.loader;

+

+import javax.jcr.RepositoryException;

+import javax.jcr.Session;

+

+import org.ofbiz.base.util.Debug;

+import org.ofbiz.security.SecurityFactory;

+

+public class JCRFactoryUtil {

+

+    public static final String module = JCRFactoryUtil.class.getName();

+

+    private static JCRFactory jcrFactory = null;

+

+    /**

+     *

+     * @return

+     */

+    public static JCRFactory getJCRFactory() {

+        if (jcrFactory == null) {

+

+            synchronized (SecurityFactory.class) {

+                if (jcrFactory == null) {

+

+                    ClassLoader loader = Thread.currentThread().getContextClassLoader();

+                    Class<?> c;

+                    try {

+                        c = loader.loadClass(JCRContainer.getFactoryClassName());

+                        jcrFactory = (JCRFactory) c.newInstance();

+                    } catch (ClassNotFoundException e) {

+                        Debug.logError(e, "Cannot get instance of the jcr implementation", module);

+                    } catch (InstantiationException e) {

+                        Debug.logError(e, "Cannot get instance of the jcr implementation", module);

+                    } catch (IllegalAccessException e) {

+                        Debug.logError(e, "Cannot get instance of the jcr implementation", module);

+                    }

+

+                }

+            }

+        }

+

+        return jcrFactory;

+    }

+

+    public static Session getSession() {

+        Session session = null;

+        try {

+            session = getJCRFactory().createSession();

+        } catch (RepositoryException e) {

+            Debug.logError(e, module);

+        }

+

+        return session;

+    }

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/loader/OFBizLoginModule.java b/framework/jcr/src/org/ofbiz/jcr/loader/OFBizLoginModule.java
new file mode 100644
index 0000000..5638696
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/loader/OFBizLoginModule.java
@@ -0,0 +1,146 @@
+/*******************************************************************************

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements.  See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership.  The ASF licenses this file

+ * to you 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.

+ *******************************************************************************/

+package org.ofbiz.jcr.loader;

+

+import java.io.IOException;

+import java.util.Map;

+

+import javax.security.auth.Subject;

+import javax.security.auth.callback.Callback;

+import javax.security.auth.callback.CallbackHandler;

+import javax.security.auth.callback.NameCallback;

+import javax.security.auth.callback.PasswordCallback;

+import javax.security.auth.callback.UnsupportedCallbackException;

+import javax.security.auth.login.LoginException;

+import javax.security.auth.spi.LoginModule;

+

+import javolution.util.FastMap;

+

+import org.ofbiz.base.util.Debug;

+import org.ofbiz.base.util.UtilValidate;

+import org.ofbiz.entity.Delegator;

+import org.ofbiz.entity.DelegatorFactory;

+import org.ofbiz.entity.GenericEntityException;

+import org.ofbiz.entity.GenericValue;

+import org.ofbiz.service.GenericDispatcher;

+import org.ofbiz.service.GenericServiceException;

+import org.ofbiz.service.LocalDispatcher;

+import org.ofbiz.service.ServiceUtil;

+

+public class OFBizLoginModule implements LoginModule {

+

+    public static final String module = OFBizLoginModule.class.getName();

+

+    protected Subject subject;

+    protected CallbackHandler callbackHandler;

+    protected Map<String, ?> sharedState;

+    protected Map<String, ?> options;

+

+    private Delegator delegator;

+    private LocalDispatcher dispatcher;

+

+    private GenericValue userLogin;

+

+    @Override

+    public boolean abort() throws LoginException {

+        return logout();

+    }

+

+    @Override

+    public boolean commit() throws LoginException {

+        if (userLogin != null) {

+            return true;

+        }

+        return false;

+    }

+

+    @Override

+    public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) {

+        // get the delegator

+        delegator = DelegatorFactory.getDelegator("default");

+

+        // get the dispatcher

+        dispatcher = GenericDispatcher.getLocalDispatcher("auth-dispatcher", delegator);

+

+        this.subject = subject;

+        this.callbackHandler = callbackHandler;

+        this.sharedState = sharedState;

+        this.options = options;

+

+        if (options != null) {

+            for (Map.Entry<String, ?> option : options.entrySet()) {

+                Debug.logWarning("OFBizLoginModule does not support provided option [" + option.getKey() + "] with value [" + option.getValue() + "], ignoring", module);

+            }

+        }

+    }

+

+    @Override

+    public boolean login() throws LoginException {

+        NameCallback nameCallback = new NameCallback("userLoginId");

+        PasswordCallback passwordCallback = new PasswordCallback("currentPassword", false);

+        Callback[] callbacks = new Callback[]{nameCallback, passwordCallback};

+        try {

+            callbackHandler.handle(callbacks);

+        } catch (IOException e) {

+            Debug.logError(e, module);

+            throw new LoginException(e.getMessage());

+        } catch (UnsupportedCallbackException e) {

+            Debug.logError(e, module);

+            throw new LoginException(e.getMessage());

+        }

+

+        String userLoginId = nameCallback.getName();

+        String password = String.valueOf(passwordCallback.getPassword());

+        passwordCallback.clearPassword();

+        // try matching against the encrypted password

+        try {

+            GenericValue newUserLogin = delegator.findOne("UserLogin", false, "userLoginId", userLoginId);

+            if (newUserLogin.getString("currentPassword") == null || newUserLogin.getString("currentPassword").equals(password)) {

+                userLogin = newUserLogin;

+                return true;

+            }

+        } catch (GenericEntityException e) {

+            Debug.logError(e, module);

+        }

+        // plain text password

+        if (UtilValidate.isNotEmpty(password)) {

+            Map<String, Object> loginCtx = FastMap.newInstance();

+            loginCtx.put("login.username", userLoginId);

+            loginCtx.put("login.password", password);

+            try {

+                Map<String, ? extends Object> result = dispatcher.runSync("userLogin", loginCtx);

+                if (ServiceUtil.isSuccess(result)) {

+                    userLogin = (GenericValue) result.get("userLogin");

+                    return true;

+                }

+            } catch (GenericServiceException e) {

+                Debug.logError(e, module);

+                throw new LoginException(e.getMessage());

+            }

+        }

+        return false;

+    }

+

+    @Override

+    public boolean logout() throws LoginException {

+        userLogin = null;

+        return true;

+    }

+

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/loader/RepositoryFactory.java b/framework/jcr/src/org/ofbiz/jcr/loader/RepositoryFactory.java
new file mode 100644
index 0000000..4a7bc02
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/loader/RepositoryFactory.java
@@ -0,0 +1,43 @@
+package org.ofbiz.jcr.loader;

+

+import java.io.File;

+import java.util.Hashtable;

+import java.util.Map;

+

+import javax.jcr.RepositoryException;

+import javax.naming.Context;

+import javax.naming.Name;

+import javax.naming.Reference;

+import javax.naming.spi.ObjectFactory;

+

+import org.apache.commons.collections.map.ReferenceMap;

+import org.apache.jackrabbit.commons.JcrUtils;

+import org.apache.jackrabbit.core.TransientRepository;

+

+public class RepositoryFactory implements ObjectFactory {

+

+    private static final Map<Object, Object> cache = new ReferenceMap();

+

+    public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment) throws RepositoryException {

+        synchronized (cache) {

+            Object instance = cache.get(obj);

+            if (instance == null && obj instanceof Reference) {

+                Reference ref = (Reference) obj;

+                String repHomeDir = ref.get(JCRContainer.REP_HOME_DIR).getContent().toString();

+                // check if the repository is already started, than use it

+                // otherwise create it

+                File lock = new File(repHomeDir);

+                if (lock.exists()) {

+                    instance = JcrUtils.getRepository(lock.toURI().toString());

+                } else {

+                    instance = new TransientRepository(ref.get(JCRContainer.DEFAULT_JCR_CONFIG_PATH).getContent().toString(), repHomeDir);

+                }

+

+                cache.put(obj, instance);

+            }

+

+            return instance;

+        }

+    }

+

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/loader/RepositoryLoader.java b/framework/jcr/src/org/ofbiz/jcr/loader/RepositoryLoader.java
new file mode 100644
index 0000000..1e61521
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/loader/RepositoryLoader.java
@@ -0,0 +1,97 @@
+package org.ofbiz.jcr.loader;

+

+import java.util.Map;

+

+import javax.jcr.Repository;

+import javax.naming.NamingException;

+

+import javolution.util.FastMap;

+

+import org.ofbiz.base.config.GenericConfigException;

+import org.ofbiz.base.config.ResourceLoader;

+import org.ofbiz.base.util.Debug;

+import org.ofbiz.base.util.JNDIContextFactory;

+import org.ofbiz.base.util.UtilValidate;

+import org.ofbiz.base.util.UtilXml;

+import org.w3c.dom.Element;

+

+public class RepositoryLoader {

+    public static final String module = RepositoryLoader.class.getName();

+    private static Map<String, Repository> repositories = loadRepositories();

+

+    public static Repository getRepository(String name) {

+        return repositories.get(name);

+    }

+

+    public static Repository getRepository() {

+        return repositories.get("default");

+    }

+

+    private static Repository createFromFactory(String repositoryName, ClassLoader loader, String className) {

+        try {

+            JCRFactory factory = (JCRFactory) loader.loadClass(className).newInstance();

+            return factory.getInstance();

+        } catch (InstantiationException e) {

+            Debug.logError(e, module);

+        } catch (IllegalAccessException e) {

+            Debug.logError(e, module);

+        } catch (ClassNotFoundException e) {

+            Debug.logError(e, module);

+        }

+

+        return null;

+    }

+

+    private static Map<String, Repository> loadRepositories() {

+        Map<String, Repository> repos = FastMap.newInstance();

+

+        String configFilePath = JCRContainer.getConfigFilePath();

+        Element configRootElement = null;

+        try {

+            configRootElement = ResourceLoader.getXmlRootElement(configFilePath);

+        } catch (GenericConfigException e) {

+            Debug.logError(e, "Could not load the jcr configuration in file " + configFilePath, module);

+        }

+

+        if (configRootElement == null) {

+            Debug.logError("No jcr configuration found in file " + configFilePath, module);

+        }

+

+        ClassLoader loader = Thread.currentThread().getContextClassLoader();

+        // find the default JCR implementations

+        for (Element curElement : UtilXml.childElementList(configRootElement, "jcr")) {

+            String name = curElement.getAttribute("name");

+

+            // first check if the found repository is already in the repository

+            // map

+            if (repos.get(name) != null && (repos.get(name) instanceof Repository)) {

+                continue;

+            }

+

+            String jndiName = curElement.getAttribute("jndi-name");

+            if (UtilValidate.isNotEmpty(jndiName)) {

+                try {

+                    repos.put(name, (Repository) JNDIContextFactory.getInitialContext("localjndi").lookup(jndiName));

+                } catch (NamingException e) {

+                    Debug.logError(e, module);

+                } catch (GenericConfigException e) {

+                    Debug.logError(e, module);

+                }

+                continue;

+            }

+

+            String factoryClass = curElement.getAttribute("class");

+            if (UtilValidate.isNotEmpty(factoryClass)) {

+                try {

+                    repos.put(name, createFromFactory(name, loader, factoryClass));

+                } catch (Exception e) {

+                    Debug.logError(e, module);

+                }

+            }

+

+        }

+

+        return repos;

+    }

+

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/loader/jackrabbit/JCRFactoryImpl.java b/framework/jcr/src/org/ofbiz/jcr/loader/jackrabbit/JCRFactoryImpl.java
new file mode 100644
index 0000000..51cb0b0
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/loader/jackrabbit/JCRFactoryImpl.java
@@ -0,0 +1,207 @@
+/*******************************************************************************

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements.  See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership.  The ASF licenses this file

+ * to you 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.

+ *******************************************************************************/

+package org.ofbiz.jcr.loader.jackrabbit;

+

+import java.io.File;

+import java.io.FileInputStream;

+import java.io.IOException;

+import java.io.InputStream;

+import java.util.ArrayList;

+import java.util.List;

+

+import javax.jcr.Credentials;

+import javax.jcr.Repository;

+import javax.jcr.RepositoryException;

+import javax.jcr.Session;

+import javax.jcr.SimpleCredentials;

+import javax.jcr.Workspace;

+import javax.jcr.nodetype.NoSuchNodeTypeException;

+import javax.jcr.nodetype.NodeTypeManager;

+

+import org.apache.jackrabbit.core.TransientRepository;

+import org.apache.jackrabbit.core.nodetype.InvalidNodeTypeDefException;

+import org.apache.jackrabbit.core.nodetype.NodeTypeManagerImpl;

+import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;

+import org.apache.jackrabbit.core.nodetype.xml.NodeTypeReader;

+import org.apache.jackrabbit.ocm.mapper.Mapper;

+import org.apache.jackrabbit.ocm.mapper.impl.annotation.AnnotationMapperImpl;

+import org.apache.jackrabbit.ocm.nodemanagement.impl.RepositoryUtil;

+import org.apache.jackrabbit.spi.QNodeTypeDefinition;

+import org.ofbiz.base.util.Debug;

+import org.ofbiz.base.util.UtilValidate;

+import org.ofbiz.base.util.UtilXml;

+import org.ofbiz.jcr.loader.JCRFactory;

+import org.ofbiz.jcr.orm.jackrabbit.JackrabbitArticle;

+import org.ofbiz.jcr.orm.jackrabbit.JackrabbitFile;

+import org.ofbiz.jcr.orm.jackrabbit.JackrabbitFolder;

+import org.ofbiz.jcr.orm.jackrabbit.JackrabbitHierarchyNode;

+import org.ofbiz.jcr.orm.jackrabbit.JackrabbitLocalizedContent;

+import org.ofbiz.jcr.orm.jackrabbit.JackrabbitNews;

+import org.ofbiz.jcr.orm.jackrabbit.JackrabbitResource;

+import org.ofbiz.jcr.orm.jackrabbit.JackrabbitUnstructured;

+import org.w3c.dom.Element;

+

+public class JCRFactoryImpl implements JCRFactory {

+

+    public static final String module = JCRFactoryImpl.class.getName();

+

+    private static String CUSTOM_NODE_TYPES = "framework/jcr/config/custom-jackrabbit-nodetypes.xml";

+

+    private static String homeDir = null;

+    private static String jackrabbitConfigFile = null;

+    private static String CREDENTIALS_USERNAME = null;

+    private static char[] CREDENTIALS_PASSWORD = null;

+

+    protected static Repository repository = null;

+    protected Session session = null;

+    protected static Mapper mapper = null;

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see org.ofbiz.jcr.JCRFactory#initialize(org.w3c.dom.Element)

+     */

+    @Override

+    public void initialize(Element configRootElement) throws RepositoryException {

+        Element childElement = UtilXml.firstChildElement(configRootElement, "jcr-credentials");

+        CREDENTIALS_USERNAME = UtilXml.elementAttribute(childElement, "username", null);

+        CREDENTIALS_PASSWORD = UtilXml.elementAttribute(childElement, "password", null).toCharArray();

+

+        jackrabbitConfigFile = UtilXml.childElementAttribute(configRootElement, "config-file-path", "path", "framework/jcr/config/jackrabbit.xml");

+        homeDir = UtilXml.childElementAttribute(configRootElement, "home-dir", "path", "runtime/data/jcr/");

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see org.ofbiz.jcr.JCRFactory#start()

+     */

+    @Override

+    public void start() throws RepositoryException {

+        // Transient repositories closes automatically when the last session is

+        // closed

+        repository = new TransientRepository(jackrabbitConfigFile, homeDir);

+        createSession();

+

+        List<Class> classes = new ArrayList<Class>();

+        // put this in an xml configuration file

+        // should the ocm classes be loaded in during the container startup?

+        classes.add(JackrabbitUnstructured.class);

+        classes.add(JackrabbitHierarchyNode.class);

+        classes.add(JackrabbitNews.class);

+        classes.add(JackrabbitFile.class);

+        classes.add(JackrabbitFolder.class);

+        classes.add(JackrabbitResource.class);

+        classes.add(JackrabbitLocalizedContent.class);

+        classes.add(JackrabbitArticle.class);

+

+        mapper = new AnnotationMapperImpl(classes);

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see org.ofbiz.jcr.JCRFactory#stop(boolean)

+     */

+    @Override

+    public void stop(boolean removeRepositoryOnShutdown) throws RepositoryException {

+        if (session != null && session.isLive()) {

+            session.logout();

+        }

+

+        if (removeRepositoryOnShutdown) {

+            if (UtilValidate.isNotEmpty(homeDir)) {

+                File homeDirFile = new File(homeDir);

+                homeDirFile.deleteOnExit();

+            }

+        }

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see org.ofbiz.jcr.JCRFactory#createSession()

+     */

+    @Override

+    public Session createSession() throws RepositoryException {

+        if (session == null || !session.isLive()) {

+            Credentials credentials = new SimpleCredentials(CREDENTIALS_USERNAME, CREDENTIALS_PASSWORD);

+            try {

+                session = repository.login(credentials);

+                // register NameSpaces

+                RepositoryUtil.setupSession(session);

+                try {

+                    // register the cool new noteTypes

+                    registerNodeTypes(session);

+                } catch (InvalidNodeTypeDefException e) {

+                    Debug.logError(e, module);

+                } catch (IOException e) {

+                    Debug.logError(e, module);

+                }

+

+            } catch (RepositoryException e) {

+                Debug.logError(e, "Could not login to the workspace");

+                throw e;

+            }

+

+        }

+        return session;

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see org.ofbiz.jcr.JCRFactory#getInstance()

+     */

+    @Override

+    public Repository getInstance() {

+        return repository;

+    }

+

+    public static Mapper getMapper() {

+        return mapper;

+    }

+

+    /*

+     * Register some new node types

+     */

+    protected void registerNodeTypes(Session session) throws InvalidNodeTypeDefException, javax.jcr.RepositoryException, IOException {

+        InputStream xml = new FileInputStream(CUSTOM_NODE_TYPES);

+

+        // HINT: throws InvalidNodeTypeDefException, IOException

+        QNodeTypeDefinition[] types = NodeTypeReader.read(xml);

+

+        Workspace workspace = session.getWorkspace();

+        NodeTypeManager ntMgr = workspace.getNodeTypeManager();

+        NodeTypeRegistry ntReg = ((NodeTypeManagerImpl) ntMgr).getNodeTypeRegistry();

+

+        for (int j = 0; j < types.length; j++) {

+            QNodeTypeDefinition def = types[j];

+

+            try {

+                ntReg.getNodeTypeDef(def.getName());

+            } catch (NoSuchNodeTypeException nsne) {

+                // HINT: if not already registered than register custom node

+                // type

+                ntReg.registerNodeType(def);

+            }

+

+        }

+    }

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/orm/OfbizRepositoryMapping.java b/framework/jcr/src/org/ofbiz/jcr/orm/OfbizRepositoryMapping.java
new file mode 100644
index 0000000..de7920a
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/orm/OfbizRepositoryMapping.java
@@ -0,0 +1,28 @@
+package org.ofbiz.jcr.orm;

+

+

+public interface OfbizRepositoryMapping {

+    /**

+     * Return the Node Path.

+     * @return

+     */

+    String getPath();

+

+    /**

+     * Set the Node Path.

+     * @param path

+     */

+    void setPath(String path);

+

+    /**

+     * Return the current Version of the content object.

+     * @return

+     */

+    public String getVersion();

+

+    /**

+     * Set the node version.

+     * @param version

+     */

+    public void setVersion(String version);

+}
\ No newline at end of file
diff --git a/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitArticle.java b/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitArticle.java
new file mode 100644
index 0000000..a990910
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitArticle.java
@@ -0,0 +1,66 @@
+package org.ofbiz.jcr.orm.jackrabbit;

+

+import java.util.Calendar;

+

+import org.apache.jackrabbit.ocm.mapper.impl.annotation.Field;

+import org.apache.jackrabbit.ocm.mapper.impl.annotation.Node;

+

+@Node(extend = JackrabbitLocalizedContent.class)

+public class JackrabbitArticle extends JackrabbitLocalizedContent {

+

+    @Field(id = true)

+    String title = null;

+    @Field

+    String content = null;

+    @Field

+    Calendar pubDate = null;

+

+    /**

+     *

+     * @param nodePath

+     * @param language

+     * @param title

+     * @param content

+     * @param pubDate

+     */

+    public JackrabbitArticle(String nodePath, String language, String title, String content, Calendar pubDate) {

+        super(nodePath, language);

+

+        this.title = title;

+        this.content = content;

+        this.pubDate = pubDate;

+    }

+

+    /**

+     *

+     */

+    public JackrabbitArticle() {

+        super();

+        // create empty instance

+    }

+

+

+    public String getTitle() {

+        return title;

+    }

+

+    public void setTitle(String title) {

+        this.title = title;

+    }

+

+    public String getContent() {

+        return content;

+    }

+

+    public void setContent(String content) {

+        this.content = content;

+    }

+

+    public Calendar getPubDate() {

+        return pubDate;

+    }

+

+    public void setPubDate(Calendar pubDate) {

+        this.pubDate = pubDate;

+    }

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitFile.java b/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitFile.java
new file mode 100644
index 0000000..afbb3c7
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitFile.java
@@ -0,0 +1,34 @@
+package org.ofbiz.jcr.orm.jackrabbit;

+

+import org.apache.jackrabbit.ocm.mapper.impl.annotation.Bean;

+import org.apache.jackrabbit.ocm.mapper.impl.annotation.Node;

+import org.ofbiz.jcr.access.jackrabbit.ConstantsJackrabbit;

+

+@Node(jcrType = "nt:file", extend = JackrabbitHierarchyNode.class)

+public class JackrabbitFile extends JackrabbitHierarchyNode {

+

+    @Bean(jcrName = "jcr:content")

+    private JackrabbitResource resource;

+

+    public JackrabbitResource getResource() {

+        return resource;

+    }

+

+    public void setResource(JackrabbitResource resource) {

+        this.resource = resource;

+    }

+

+    public void setPath(String nodePath) {

+        // check that the path don't end with a /

+        if (nodePath.endsWith(ConstantsJackrabbit.ROOTPATH)) {

+            nodePath = nodePath.substring(0, nodePath.indexOf(ConstantsJackrabbit.NODEPATHDELIMITER));

+        }

+

+        // check that it is a relative path

+        if (nodePath.indexOf(ConstantsJackrabbit.NODEPATHDELIMITER) != -1) {

+            nodePath = nodePath.substring(nodePath.lastIndexOf(ConstantsJackrabbit.NODEPATHDELIMITER) + 1);

+        }

+

+        super.path = nodePath;

+    }

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitFolder.java b/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitFolder.java
new file mode 100644
index 0000000..d57c544
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitFolder.java
@@ -0,0 +1,30 @@
+package org.ofbiz.jcr.orm.jackrabbit;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.jackrabbit.ocm.manager.collectionconverter.impl.NTCollectionConverterImpl;
+import org.apache.jackrabbit.ocm.mapper.impl.annotation.Collection;
+import org.apache.jackrabbit.ocm.mapper.impl.annotation.Node;
+
+@Node(jcrType = "nt:folder", extend = JackrabbitHierarchyNode.class)
+public class JackrabbitFolder extends JackrabbitHierarchyNode {
+    @Collection(autoUpdate = true, jcrSameNameSiblings = false, elementClassName = JackrabbitHierarchyNode.class, collectionConverter = NTCollectionConverterImpl.class)
+    private List<JackrabbitHierarchyNode> children;
+
+    public List<JackrabbitHierarchyNode> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<JackrabbitHierarchyNode> children) {
+        this.children = children;
+    }
+
+    public void addChild(JackrabbitHierarchyNode node) {
+        if (children == null) {
+            children = new ArrayList<JackrabbitHierarchyNode>();
+        }
+        children.add(node);
+    }
+
+}
diff --git a/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitHierarchyNode.java b/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitHierarchyNode.java
new file mode 100644
index 0000000..23454c6
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitHierarchyNode.java
@@ -0,0 +1,45 @@
+package org.ofbiz.jcr.orm.jackrabbit;
+
+import java.util.Calendar;
+
+import org.apache.jackrabbit.ocm.mapper.impl.annotation.Field;
+import org.apache.jackrabbit.ocm.mapper.impl.annotation.Node;
+import org.ofbiz.jcr.orm.OfbizRepositoryMapping;
+import org.ofbiz.jcr.util.jackrabbit.JcrUtilJackrabbit;
+
+@Node(jcrType = "nt:hierarchyNode", jcrMixinTypes="mix:versionable")
+public class JackrabbitHierarchyNode implements OfbizRepositoryMapping {
+    @Field(path = true, id = true, jcrProtected = true)
+    protected String path;
+    private String version;
+    @Field(jcrName = "jcr:created")
+    private Calendar creationDate;
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String nodePath) {
+        // check if the node path is an absolute path
+        this.path = JcrUtilJackrabbit.createAbsoluteNodePath(nodePath);
+    }
+
+    public Calendar getCreationDate() {
+        return creationDate;
+    }
+
+    public void setCreationDate(Calendar creationDate) {
+        this.creationDate = creationDate;
+    }
+
+    @Override
+    public String getVersion() {
+        return version;
+    }
+
+    @Override
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+}
diff --git a/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitLocalizedContent.java b/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitLocalizedContent.java
new file mode 100644
index 0000000..92108b9
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitLocalizedContent.java
@@ -0,0 +1,57 @@
+package org.ofbiz.jcr.orm.jackrabbit;

+

+import java.util.GregorianCalendar;

+

+import org.apache.jackrabbit.ocm.mapper.impl.annotation.Field;

+import org.apache.jackrabbit.ocm.mapper.impl.annotation.Node;

+import org.ofbiz.jcr.access.jackrabbit.ConstantsJackrabbit;

+

+@Node(isAbstract = true, extend = JackrabbitUnstructured.class)

+public abstract class JackrabbitLocalizedContent extends JackrabbitUnstructured {

+

+    @Field

+    private String language;

+

+    public JackrabbitLocalizedContent() {

+        super();

+        this.language = "";

+        super.setLocalized(true);

+        super.setCreationDate(new GregorianCalendar());

+        // create an empty localized object

+    }

+

+    /**

+     *

+     * @param nodePath

+     * @param language

+     */

+    public JackrabbitLocalizedContent(String nodePath, String language) {

+        super(nodePath);

+        this.language = language;

+

+        super.setPath(createLanguagePath(nodePath));

+        // define this node as a localized node

+        super.setLocalized(true);

+    }

+

+    public String getLanguage() {

+        return language;

+    }

+

+    public void setLanguage(String language) {

+        this.language = language;

+    }

+

+    private String createLanguagePath(String contentPath) {

+        // the content path should contain the language information

+        // TODO this have to be a little bit more intelligent in the future

+        if (contentPath.endsWith(ConstantsJackrabbit.NODEPATHDELIMITER)) {

+            contentPath = contentPath + language;

+        } else {

+            contentPath = contentPath + ConstantsJackrabbit.NODEPATHDELIMITER + language;

+        }

+

+        return contentPath;

+    }

+

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitNews.java b/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitNews.java
new file mode 100644
index 0000000..303b5ac
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitNews.java
@@ -0,0 +1,54 @@
+package org.ofbiz.jcr.orm.jackrabbit;

+

+import java.util.Calendar;

+

+import org.apache.jackrabbit.ocm.mapper.impl.annotation.Field;

+import org.apache.jackrabbit.ocm.mapper.impl.annotation.Node;

+

+@Node(extend = JackrabbitLocalizedContent.class)

+public class JackrabbitNews extends JackrabbitLocalizedContent {

+

+    @Field(id = true)

+    String title = null;

+    @Field(jcrType = "Date")

+    Calendar pubDate = null;

+    @Field

+    String content = null;

+

+    public JackrabbitNews() {

+        super();

+        // create an empty object

+    }

+

+    public JackrabbitNews(String nodePath, String language, String title, Calendar pubDate, String content) {

+        super(nodePath, language);

+        this.title = title;

+        this.pubDate = pubDate;

+        this.content = content;

+    }

+

+    public String getTitle() {

+        return title;

+    }

+

+    public void setTitle(String title) {

+        this.title = title;

+    }

+

+    public Calendar getPubDate() {

+        return pubDate;

+    }

+

+    public void setPubDate(Calendar pubDate) {

+        this.pubDate = pubDate;

+    }

+

+    public String getContent() {

+        return content;

+    }

+

+    public void setContent(String content) {

+        this.content = content;

+    }

+

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitResource.java b/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitResource.java
new file mode 100644
index 0000000..77c643d
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitResource.java
@@ -0,0 +1,43 @@
+package org.ofbiz.jcr.orm.jackrabbit;
+
+import java.io.InputStream;
+import java.util.Calendar;
+
+import org.apache.jackrabbit.ocm.mapper.impl.annotation.Field;
+import org.apache.jackrabbit.ocm.mapper.impl.annotation.Node;
+
+@Node(jcrType = "nt:resource")
+public class JackrabbitResource {
+
+    @Field(jcrName = "jcr:mimeType")
+    private String mimeType;
+    @Field(jcrName = "jcr:data")
+    private InputStream data;
+    @Field(jcrName = "jcr:lastModified")
+    private Calendar lastModified;
+
+    public InputStream getData() {
+        return data;
+    }
+
+    public void setData(InputStream data) {
+        this.data = data;
+    }
+
+    public Calendar getLastModified() {
+        return lastModified;
+    }
+
+    public void setLastModified(Calendar lastModified) {
+        this.lastModified = lastModified;
+    }
+
+    public String getMimeType() {
+        return mimeType;
+    }
+
+    public void setMimeType(String mimeType) {
+        this.mimeType = mimeType;
+    }
+
+}
diff --git a/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitUnstructured.java b/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitUnstructured.java
new file mode 100644
index 0000000..e538f0d
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/orm/jackrabbit/JackrabbitUnstructured.java
@@ -0,0 +1,97 @@
+package org.ofbiz.jcr.orm.jackrabbit;

+

+import java.util.Calendar;

+import java.util.GregorianCalendar;

+

+import org.apache.jackrabbit.ocm.mapper.impl.annotation.Field;

+import org.apache.jackrabbit.ocm.mapper.impl.annotation.Node;

+import org.ofbiz.jcr.access.jackrabbit.ConstantsJackrabbit;

+import org.ofbiz.jcr.orm.OfbizRepositoryMapping;

+

+@Node(isAbstract = true, jcrMixinTypes = "mix:versionable")

+public abstract class JackrabbitUnstructured implements OfbizRepositoryMapping {

+

+    protected static String module = JackrabbitUnstructured.class.getName();

+

+    @Field(path = true)

+    private String path;

+    @Field

+    private String version;

+    @Field(jcrName = "jcr:created")

+    private Calendar creationDate;

+    @Field

+    private boolean localized;

+

+    protected JackrabbitUnstructured() {

+        // create an empty object

+    }

+

+    protected JackrabbitUnstructured(String nodePath) {

+        this.setPath(nodePath);

+        this.creationDate = new GregorianCalendar();

+        this.localized = false;

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see org.ofbiz.jcr.orm.OfbizRepositoryMapping#getPath()

+     */

+    @Override

+    public String getPath() {

+        return path;

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see org.ofbiz.jcr.orm.OfbizRepositoryMapping#setPath(java.lang.String)

+     */

+    @Override

+    public void setPath(String nodePath) {

+        // check if the node path is an absolute path

+        if (!nodePath.startsWith(ConstantsJackrabbit.ROOTPATH)) {

+            nodePath = ConstantsJackrabbit.ROOTPATH + nodePath;

+        }

+

+        this.path = nodePath;

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see org.ofbiz.jcr.orm.OfbizRepositoryMapping#getVersion()

+     */

+    @Override

+    public String getVersion() {

+        return version;

+    }

+

+    /*

+     * (non-Javadoc)

+     *

+     * @see

+     * org.ofbiz.jcr.orm.OfbizRepositoryMapping#setVersion(java.lang.String)

+     */

+    @Override

+    public void setVersion(String version) {

+        this.version = version;

+    }

+

+    public Calendar getCreationDate() {

+        return creationDate;

+    }

+

+    public void setCreationDate(Calendar creationDate) {

+        this.creationDate = creationDate;

+    }

+

+    public boolean getLocalized() {

+        return localized;

+    }

+

+    public void setLocalized(boolean isLocalized) {

+        this.localized = isLocalized;

+    }

+

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/services/JackrabbitServices.java b/framework/jcr/src/org/ofbiz/jcr/services/JackrabbitServices.java
new file mode 100644
index 0000000..a69fc40
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/services/JackrabbitServices.java
@@ -0,0 +1,76 @@
+package org.ofbiz.jcr.services;

+

+import java.util.Date;

+import java.util.Map;

+

+import javax.jcr.Node;

+import javax.jcr.RepositoryException;

+import javax.jcr.Session;

+import javax.jcr.UnsupportedRepositoryOperationException;

+import javax.jcr.version.VersionManager;

+

+import org.ofbiz.base.util.Debug;

+import org.ofbiz.entity.GenericValue;

+import org.ofbiz.jcr.access.jackrabbit.JackrabbitRepositoryAccessor;

+import org.ofbiz.jcr.loader.JCRFactoryUtil;

+import org.ofbiz.jcr.orm.jackrabbit.JackrabbitNews;

+import org.ofbiz.service.DispatchContext;

+import org.ofbiz.service.ServiceUtil;

+

+public class JackrabbitServices {

+

+    private static String module = JackrabbitServices.class.getName();

+

+    public static Map<String, Object> determineJackrabbitRepositorySpeed(DispatchContext ctx, Map<String, Object> context) throws UnsupportedRepositoryOperationException, RepositoryException {

+        Map<String, Object> result = ServiceUtil.returnSuccess();

+        GenericValue userLogin = (GenericValue) context.get("userLogin");

+        Integer maxNodes = (Integer) context.get("maxNodes");

+

+        Long start = 0l;

+        Long diff = 0l;

+

+        Session session = JCRFactoryUtil.getSession();

+        VersionManager vm = session.getWorkspace().getVersionManager();

+        start = new Date().getTime();

+        for (int i = 0; i <= maxNodes; i++) {

+            try {

+                // add a node

+                Node n = session.getRootNode().addNode("__Speedtest_Node-" + i);

+                n.addMixin("mix:versionable");

+                n.setProperty("anyProperty", "Blah");

+                session.save();

+                vm.checkin(n.getPath());

+

+                vm.checkout("/__Speedtest_Node-" + i);

+                // remove the node

+                session.removeItem("/__Speedtest_Node-" + i);

+                session.save();

+            } catch (Exception e) {

+                Debug.logError(e, module);

+            }

+        }

+

+        session.logout();

+        diff = (new Date().getTime() - start);

+        result.put("repositoryDirectAccessTime", diff.toString());

+

+        JackrabbitRepositoryAccessor access = new JackrabbitRepositoryAccessor(userLogin);

+        start = new Date().getTime();

+        for (int i = 0; i <= maxNodes; i++) {

+            try {

+                JackrabbitNews news = new JackrabbitNews("/__Speedtest_Node-" + i, "de", "", null, "");

+                access.storeContentObject(news);

+                access.removeContentObject("/__Speedtest_Node-" + i);

+            } catch (Exception e) {

+                Debug.logError(e, module);

+            }

+

+        }

+

+        access.closeAccess();

+        diff = (new Date().getTime() - start);

+        result.put("repositoryOcmAccessTime", diff.toString());

+

+        return result;

+    }

+}

diff --git a/framework/jcr/src/org/ofbiz/jcr/test/JackrabbitTests.java b/framework/jcr/src/org/ofbiz/jcr/test/JackrabbitTests.java
new file mode 100644
index 0000000..88274a1
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/test/JackrabbitTests.java
@@ -0,0 +1,334 @@
+/*

+Licensed to the Apache Software Foundation (ASF) under one

+or more contributor license agreements.  See the NOTICE file

+distributed with this work for additional information

+regarding copyright ownership.  The ASF licenses this file

+to you 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.

+ */

+package org.ofbiz.jcr.test;

+

+import java.io.File;

+import java.io.FileInputStream;

+import java.io.InputStream;

+import java.util.GregorianCalendar;

+import java.util.List;

+import java.util.Map;

+

+import javax.jcr.ItemExistsException;

+import javax.jcr.PathNotFoundException;

+import javax.jcr.RepositoryException;

+import javax.jcr.Session;

+import javax.jcr.query.QueryResult;

+

+import javolution.util.FastMap;

+import net.sf.json.JSONArray;

+

+import org.apache.jackrabbit.ocm.exception.ObjectContentManagerException;

+import org.apache.jackrabbit.ocm.manager.ObjectContentManager;

+import org.apache.jackrabbit.ocm.manager.impl.ObjectContentManagerImpl;

+import org.apache.jackrabbit.ocm.mapper.Mapper;

+import org.ofbiz.base.util.UtilMisc;

+import org.ofbiz.base.util.UtilProperties;

+import org.ofbiz.entity.GenericValue;

+import org.ofbiz.jcr.access.ContentWriter;

+import org.ofbiz.jcr.access.JcrRepositoryAccessor;

+import org.ofbiz.jcr.access.jackrabbit.ContentWriterJackrabbit;

+import org.ofbiz.jcr.access.jackrabbit.JackrabbitRepositoryAccessor;

+import org.ofbiz.jcr.api.JcrDataHelper;

+import org.ofbiz.jcr.api.JcrFileHelper;

+import org.ofbiz.jcr.api.jackrabbit.JackrabbitArticleHelper;

+import org.ofbiz.jcr.api.jackrabbit.JackrabbitFileHelper;

+import org.ofbiz.jcr.loader.JCRFactory;

+import org.ofbiz.jcr.loader.JCRFactoryUtil;

+import org.ofbiz.jcr.loader.jackrabbit.JCRFactoryImpl;

+import org.ofbiz.jcr.orm.jackrabbit.JackrabbitArticle;

+import org.ofbiz.jcr.util.jackrabbit.JcrUtilJackrabbit;

+import org.ofbiz.service.ServiceUtil;

+import org.ofbiz.service.testtools.OFBizTestCase;

+

+public class JackrabbitTests extends OFBizTestCase {

+

+    protected GenericValue userLogin = null;

+

+    public JackrabbitTests(String name) {

+        super(name);

+    }

+

+    @Override

+    protected void setUp() throws Exception {

+        userLogin = delegator.findByPrimaryKey("UserLogin", UtilMisc.toMap("userLoginId", "system"));

+

+    }

+

+    @Override

+    protected void tearDown() throws Exception {

+    }

+

+    public void testRepositoryConstructor() throws Exception {

+        JcrRepositoryAccessor repositoryAccess = new JackrabbitRepositoryAccessor(userLogin);

+        assertNotNull(repositoryAccess);

+    }

+

+    /*

+     * Base Method Tests

+     */

+    public void testFactoryGetMapper() {

+        assertNotNull(JCRFactoryImpl.getMapper());

+        assertTrue(JCRFactoryImpl.getMapper() instanceof Mapper);

+    }

+

+    public void testFactoryUtilGetJcrFactory() {

+        JCRFactory factory = JCRFactoryUtil.getJCRFactory();

+        assertNotNull(factory);

+        assertTrue((factory instanceof JCRFactoryImpl));

+    }

+

+    public void testUtilGetSession() {

+        Session session = JCRFactoryUtil.getSession();

+        assertNotNull(session);

+        assertTrue((session instanceof Session));

+    }

+

+    //

+    // Test JcrJackrabbitUtil

+    //

+

+    public void testCreateAbsoluteAndNormalizedNodePath() {

+        String result = JcrUtilJackrabbit.createAbsoluteNodePath("foo/baa");

+

+        assertEquals("/foo/baa", result);

+    }

+

+    public void testCheckIfNodePathIsAbsoluteAndNormalized() {

+        assertFalse(JcrUtilJackrabbit.checkIfNodePathIsAbsolute("foo/baa"));

+        assertFalse(JcrUtilJackrabbit.checkIfNodePathIsAbsolute("foo/baa/"));

+        assertTrue(JcrUtilJackrabbit.checkIfNodePathIsAbsolute("/foo/baa/"));

+        assertTrue(JcrUtilJackrabbit.checkIfNodePathIsAbsolute("/foo/baa"));

+    }

+

+    public void testListRepositoryNodes() throws Exception {

+        assertNotNull(JcrUtilJackrabbit.getRepositoryNodes(userLogin, null));

+    }

+

+    public void testDefaultLanguage() {

+        assertEquals(UtilProperties.getPropertyValue("general", "locale.properties.fallback"), JcrUtilJackrabbit.determindeTheDefaultLanguage());

+    }

+

+    //

+    // Jackrabbit Accessor tests

+    //

+

+    public void testAccessorConstructor() throws RepositoryException {

+        JcrRepositoryAccessor accessor = new JackrabbitRepositoryAccessor(userLogin);

+

+        assertNotNull(accessor);

+        assertEquals("/", accessor.getSession().getRootNode().getPath());

+

+        accessor.closeAccess();

+    }

+

+    public void testAccessorDataTree() throws RepositoryException {

+        JcrRepositoryAccessor accessor = new JackrabbitRepositoryAccessor(userLogin);

+

+        JSONArray array = accessor.getJsonDataTree();

+        assertEquals(0, array.size()); // should be 0 because there are no

+                                       // entries in the repository yet

+

+        accessor.closeAccess();

+    }

+

+    public void testAccessorFileTree() throws RepositoryException {

+        JcrRepositoryAccessor accessor = new JackrabbitRepositoryAccessor(userLogin);

+

+        JSONArray array = accessor.getJsonFileTree();

+        assertEquals(0, array.size()); // should be 0 because there are no

+                                       // entries in the repository yet

+        accessor.closeAccess();

+    }

+

+    public void testAccessorQuery() throws RepositoryException {

+        JcrRepositoryAccessor accessor = new JackrabbitRepositoryAccessor(userLogin);

+        QueryResult results = accessor.queryForRepositoryData("SELECT * FROM [rep:root]");

+

+        assertNotNull(results);

+        assertEquals(1, results.getNodes().getSize());

+

+        accessor.closeAccess();

+    }

+

+    public void testAccessorNodeExist() throws RepositoryException {

+        JcrRepositoryAccessor accessor = new JackrabbitRepositoryAccessor(userLogin);

+        assertTrue(accessor.checkIfNodeExist("/"));

+        assertFalse(accessor.checkIfNodeExist("/test"));

+

+        accessor.closeAccess();

+    }

+

+    //

+    // Content Writer

+    //

+

+    public void testWriterConsturctor() {

+

+        Session session = JCRFactoryUtil.getSession();

+        ObjectContentManager ocm = new ObjectContentManagerImpl(session, JCRFactoryImpl.getMapper());

+        ContentWriter writer = new ContentWriterJackrabbit(ocm);

+

+        assertNotNull(writer);

+

+        ocm.logout();

+    }

+

+    /*

+     * Functional Integration Tests

+     */

+

+    public void testCrudArticleNode() throws Exception {

+        // Create New Object

+        JcrDataHelper helper = new JackrabbitArticleHelper(userLogin);

+        helper.storeContentInRepository("news/article", "en", "News Of Today", "Hello World", new GregorianCalendar());

+

+        JackrabbitArticle content = helper.readContentFromRepository("news/article");

+        assertEquals("Hello World", content.getContent());

+

+        content.setContent("New World!");

+

+        helper.updateContentInRepository(content);

+

+        JackrabbitArticle updatedContent = helper.readContentFromRepository("news/article");

+        assertEquals("New World!", updatedContent.getContent());

+

+        helper.removeContentObject("news");

+

+        helper.closeContentSession();

+    }

+

+    public void testVersionning() throws Exception {

+        JcrDataHelper helper = new JackrabbitArticleHelper(userLogin);

+        helper.storeContentInRepository("news/versionArticle", "en", "News Of Today", "Hello World", new GregorianCalendar());

+

+        JackrabbitArticle content = helper.readContentFromRepository("news/versionArticle");

+        assertEquals("1.0", content.getVersion());

+

+        content.setTitle("New Title");

+        helper.updateContentInRepository(content);

+

+        content = helper.readContentFromRepository("news/versionArticle");

+        assertEquals("1.1", content.getVersion());

+

+        helper.removeContentObject("news");

+

+        helper.closeContentSession();

+    }

+

+    public void testLanguageDetermination() throws Exception {

+        JcrDataHelper helper = new JackrabbitArticleHelper(userLogin);

+

+        helper.storeContentInRepository("news/tomorrow", "en", "The news for tomorrow.", "Content.", new GregorianCalendar());

+        helper.storeContentInRepository("superhero", "de", "Batman", "The best superhero!", new GregorianCalendar());

+

+        assertEquals("en", helper.readContentFromRepository("/news/tomorrow", "").getLanguage());

+        assertEquals("en", helper.readContentFromRepository("/news/tomorrow/en", "").getLanguage());

+        assertEquals("en", helper.readContentFromRepository("/news/tomorrow", "de").getLanguage());

+        assertEquals("en", helper.readContentFromRepository("/news/tomorrow", "en").getLanguage());

+

+        assertEquals("de", helper.readContentFromRepository("/superhero", "de").getLanguage());

+        assertEquals("de", helper.readContentFromRepository("/superhero", "").getLanguage());

+        assertEquals("de", helper.readContentFromRepository("/superhero", "fr").getLanguage());

+

+        helper.removeContentObject("/superhero");

+        helper.removeContentObject("/news");

+        helper.closeContentSession();

+    }

+

+    public void testLanguageDeterminationExpectedPathNotFoundException() throws ObjectContentManagerException, ItemExistsException {

+        JcrDataHelper helper = new JackrabbitArticleHelper(userLogin);

+        helper.storeContentInRepository("news/tomorrow", "en", "The news for tomorrow.", "Content.", new GregorianCalendar());

+

+        try {

+            helper.readContentFromRepository("/news/tomorrow/fr", "").getLanguage();

+            // if no exception is thrown, the test should fail

+            assertTrue("A PathNotFoundException is thrown as expected", false);

+        } catch (PathNotFoundException pnf) {

+            // check if the right excpetion is thrown (in jUnit 4 this could be replaced by annotations)

+            assertTrue("A PathNotFoundException is catched as expected.", true);

+        }

+

+        helper.removeContentObject("/news");

+        helper.closeContentSession();

+    }

+

+    /*

+     * Test the File upload

+     */

+    public void testCreateRepositoryFileNode() throws Exception {

+        File f = new File("stopofbiz.sh");

+        File f2 = new File("README");

+        assertTrue(f.exists() && f2.exists());

+

+        InputStream file = new FileInputStream(f);

+

+        JcrFileHelper helper = new JackrabbitFileHelper(userLogin);

+        helper.storeContentInRepository(file, f.getName(), "/fileHome");

+

+        assertNotNull(helper.getRepositoryContent("/fileHome/" + f.getName()));

+

+        // add a second file to the same folder

+        file = new FileInputStream(f2);

+

+        helper.storeContentInRepository(file, f2.getName(), "/fileHome");

+        assertNotNull(helper.getRepositoryContent("/fileHome/" + f2.getName()));

+

+        // remove all files in folder

+        helper.removeContentObject("/fileHome");

+

+        helper.closeContentSession();

+    }

+

+    public void testQuery() throws Exception {

+        JcrDataHelper helper = new JackrabbitArticleHelper(userLogin);

+

+        helper.storeContentInRepository("/query", "en", "query", "query test", new GregorianCalendar());

+

+        List<Map<String, String>> queryResult = helper.queryData("SELECT * FROM [nt:unstructured]");

+

+        assertEquals(3, queryResult.size()); // the list should contain 3 result

+                                             // sets

+

+        assertEquals("/", queryResult.get(0).get("path"));

+        assertEquals("/query", queryResult.get(1).get("path"));

+        assertEquals("/query/en", queryResult.get(2).get("path"));

+

+        helper.removeContentObject("query");

+

+        helper.closeContentSession();

+

+    }

+

+    public void testSpeedTestService() throws Exception {

+        Map<String, Object> context = FastMap.newInstance();

+        context.put("maxNodes", new Integer(10));

+        context.put("userLogin", dispatcher.getDelegator().findByPrimaryKey("UserLogin", UtilMisc.toMap("userLoginId", "system")));

+

+        Map<String, Object> serviceResult = this.dispatcher.runSync("determineJackrabbitRepositorySpeed", context);

+

+        if (ServiceUtil.isError(serviceResult)) {

+            assertFalse(true);

+        } else {

+            assertTrue(true);

+        }

+

+    }

+

+}
\ No newline at end of file
diff --git a/framework/jcr/src/org/ofbiz/jcr/util/jackrabbit/JcrUtilJackrabbit.java b/framework/jcr/src/org/ofbiz/jcr/util/jackrabbit/JcrUtilJackrabbit.java
new file mode 100644
index 0000000..a413cb4
--- /dev/null
+++ b/framework/jcr/src/org/ofbiz/jcr/util/jackrabbit/JcrUtilJackrabbit.java
@@ -0,0 +1,128 @@
+package org.ofbiz.jcr.util.jackrabbit;

+

+import java.util.List;

+import java.util.Map;

+

+import javax.jcr.Node;

+import javax.jcr.NodeIterator;

+import javax.jcr.RepositoryException;

+import javax.jcr.Session;

+

+import javolution.util.FastList;

+import javolution.util.FastMap;

+

+import org.ofbiz.base.util.UtilProperties;

+import org.ofbiz.base.util.UtilValidate;

+import org.ofbiz.entity.GenericValue;

+import org.ofbiz.jcr.access.jackrabbit.ConstantsJackrabbit;

+import org.ofbiz.jcr.loader.JCRFactoryUtil;

+

+public class JcrUtilJackrabbit {

+

+    public static final String module = JcrUtilJackrabbit.class.getName();

+

+    /**

+     * A method to list all nodes in the repository. The result List contains

+     * the node path and the node type.

+     *

+     * @param startNodePath

+     * @return

+     * @throws RepositoryException

+     */

+    public static List<Map<String, String>> getRepositoryNodes(GenericValue userLogin, String startNodePath) throws RepositoryException {

+        List<Map<String, String>> returnList = null;

+        Session session = JCRFactoryUtil.getSession();

+

+        try {

+            returnList = getRepositoryNodes(session, startNodePath);

+        } catch (RepositoryException e) {

+            throw new RepositoryException(e);

+        } finally {

+            session.logout();

+        }

+

+        return returnList;

+    }

+

+    /**

+     * Just a dummy method to list all nodes in the repository.

+     *

+     * @param startNodePath

+     * @return

+     * @throws RepositoryException

+     */

+    private static List<Map<String, String>> getRepositoryNodes(Session session, String startNodePath) throws RepositoryException {

+        Node node = null;

+

+        List<Map<String, String>> nodeList = FastList.newInstance();

+        if (UtilValidate.isEmpty(startNodePath)) {

+            node = session.getRootNode();

+        } else {

+            node = session.getNode(startNodePath);

+        }

+

+        NodeIterator nodeIterator = node.getNodes();

+        Map<String, String> nodeEntry = null;

+        while (nodeIterator.hasNext()) {

+            Node n = nodeIterator.nextNode();

+

+            // recursion - get all subnodes and add the results to our nodeList

+            if (n.getNodes().hasNext()) {

+                nodeList.addAll(getRepositoryNodes(session, n.getPath()));

+            }

+

+            nodeEntry = FastMap.newInstance();

+

+            // if the node path is a jcr:system node than ignore this

+            // entry

+            if (n.getPath().startsWith("/jcr:system")) {

+                continue;

+            }

+

+            nodeEntry.put("path", n.getPath());

+

+            nodeEntry.put("primaryNodeType", n.getPrimaryNodeType().getName());

+

+            nodeList.add(nodeEntry);

+        }

+

+        return nodeList;

+    }

+

+    /**

+     * If the node path is not absolute (means starts with <code>/</code>), an

+     * absolute path will be created.

+     *

+     * @param nodePath

+     * @return

+     */

+    public static String createAbsoluteNodePath(String nodePath) {

+        if (UtilValidate.isEmpty(nodePath)) {

+            nodePath = ConstantsJackrabbit.ROOTPATH;

+        } else if (!checkIfNodePathIsAbsolute(nodePath)) {

+            nodePath = ConstantsJackrabbit.ROOTPATH + nodePath;

+        }

+

+        return nodePath;

+    }

+

+    /**

+     * Returns true if the passed node path is an absolute path (starts with a

+     * <code>/<code>).

+     *

+     * @param nodePath

+     * @return

+     */

+    public static boolean checkIfNodePathIsAbsolute(String nodePath) {

+        return nodePath.startsWith(ConstantsJackrabbit.ROOTPATH);

+    }

+

+    /**

+     * Return default language from property file.

+     *

+     * @return

+     */

+    public static String determindeTheDefaultLanguage() {

+        return UtilProperties.getPropertyValue("general", "locale.properties.fallback");

+    }

+}

diff --git a/framework/jcr/testdef/jcrtests.xml b/framework/jcr/testdef/jcrtests.xml
new file mode 100644
index 0000000..2da848c
--- /dev/null
+++ b/framework/jcr/testdef/jcrtests.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>

+<!--

+  Licensed to the Apache Software Foundation (ASF) under one

+  or more contributor license agreements.  See the NOTICE file

+  distributed with this work for additional information

+  regarding copyright ownership.  The ASF licenses this file

+  to you 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.

+  -->

+

+<test-suite suite-name="jcrtests"

+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/test-suite.xsd">

+

+    <!--

+    <test-case case-name="jcr-tests-data-load">

+        <entity-xml action="load" entity-xml-url="component://accounting/testdef/data/AccountingTestsData.xml"/>

+    </test-case>

+    -->

+

+

+    <test-case case-name="jackrabbit-tests">

+        <junit-test-suite class-name="org.ofbiz.jcr.test.JackrabbitTests"/>

+    </test-case>

+

+</test-suite>
\ No newline at end of file
diff --git a/framework/jetty/build.xml b/framework/jetty/build.xml
new file mode 100644
index 0000000..563c3a9
--- /dev/null
+++ b/framework/jetty/build.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<project name="Jetty" default="jar" basedir=".">
+    <import file="../../common.xml"/>
+
+    <!-- ================================================================== -->
+    <!-- Initialization of all property settings                            -->
+    <!-- ================================================================== -->
+
+    <property name="desc" value="Jetty Http/Servlet Container"/>
+    <property name="name" value="ofbiz-jetty"/>
+    <property name="ofbiz.home.dir" value="../.."/>
+
+    <path id="local.class.path">
+        <fileset dir="${lib.dir}" includes="*.jar"/>
+        <fileset dir="../base/lib" includes="*.jar"/>
+        <fileset dir="../base/lib/commons" includes="*.jar"/>
+        <fileset dir="../base/build/lib" includes="*.jar"/>
+        <fileset dir="../entity/lib" includes="*.jar"/>
+        <fileset dir="../entity/build/lib" includes="*.jar"/>
+    </path>
+</project>
diff --git a/framework/jetty/lib/ant-1.8.2.jar b/framework/jetty/lib/ant-1.8.2.jar
new file mode 100644
index 0000000..7f5be4a
--- /dev/null
+++ b/framework/jetty/lib/ant-1.8.2.jar
Binary files differ
diff --git a/framework/jetty/lib/jasper-compiler-5.5.15.jar b/framework/jetty/lib/jasper-compiler-5.5.15.jar
new file mode 100644
index 0000000..667939a
--- /dev/null
+++ b/framework/jetty/lib/jasper-compiler-5.5.15.jar
Binary files differ
diff --git a/framework/jetty/lib/jasper-compiler-jdt-5.5.15.jar b/framework/jetty/lib/jasper-compiler-jdt-5.5.15.jar
new file mode 100644
index 0000000..6e9e1bc
--- /dev/null
+++ b/framework/jetty/lib/jasper-compiler-jdt-5.5.15.jar
Binary files differ
diff --git a/framework/jetty/lib/jasper-runtime-5.5.15.jar b/framework/jetty/lib/jasper-runtime-5.5.15.jar
new file mode 100644
index 0000000..9a0d321
--- /dev/null
+++ b/framework/jetty/lib/jasper-runtime-5.5.15.jar
Binary files differ
diff --git a/framework/jetty/lib/jcl104-over-slf4j-1.3.1.jar b/framework/jetty/lib/jcl104-over-slf4j-1.3.1.jar
new file mode 100644
index 0000000..f3473da
--- /dev/null
+++ b/framework/jetty/lib/jcl104-over-slf4j-1.3.1.jar
Binary files differ
diff --git a/framework/jetty/lib/jetty-6.1.11.jar b/framework/jetty/lib/jetty-6.1.11.jar
new file mode 100644
index 0000000..7dc9e09
--- /dev/null
+++ b/framework/jetty/lib/jetty-6.1.11.jar
Binary files differ
diff --git a/framework/jetty/lib/jetty-ajp-6.1.11.jar b/framework/jetty/lib/jetty-ajp-6.1.11.jar
new file mode 100644
index 0000000..ab3abae
--- /dev/null
+++ b/framework/jetty/lib/jetty-ajp-6.1.11.jar
Binary files differ
diff --git a/framework/jetty/lib/jetty-sslengine-6.1.11.jar b/framework/jetty/lib/jetty-sslengine-6.1.11.jar
new file mode 100644
index 0000000..78d36ab
--- /dev/null
+++ b/framework/jetty/lib/jetty-sslengine-6.1.11.jar
Binary files differ
diff --git a/framework/jetty/lib/jetty-util-6.1.11.jar b/framework/jetty/lib/jetty-util-6.1.11.jar
new file mode 100644
index 0000000..dccbbe6
--- /dev/null
+++ b/framework/jetty/lib/jetty-util-6.1.11.jar
Binary files differ
diff --git a/framework/jetty/lib/xmlParserAPIs-2.6.2.jar b/framework/jetty/lib/xmlParserAPIs-2.6.2.jar
new file mode 100644
index 0000000..2dd8377
--- /dev/null
+++ b/framework/jetty/lib/xmlParserAPIs-2.6.2.jar
Binary files differ
diff --git a/framework/jetty/ofbiz-component.xml b/framework/jetty/ofbiz-component.xml
new file mode 100644
index 0000000..afc1531
--- /dev/null
+++ b/framework/jetty/ofbiz-component.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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.
+-->
+
+<ofbiz-component name="jetty"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/ofbiz-component.xsd">
+    <resource-loader name="main" type="component"/>
+    <classpath type="jar" location="lib/*"/>
+    <classpath type="jar" location="build/lib/*"/>
+</ofbiz-component>
diff --git a/framework/jetty/src/org/ofbiz/jetty/container/JettyContainer.java b/framework/jetty/src/org/ofbiz/jetty/container/JettyContainer.java
new file mode 100644
index 0000000..05c4183
--- /dev/null
+++ b/framework/jetty/src/org/ofbiz/jetty/container/JettyContainer.java
@@ -0,0 +1,423 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ *******************************************************************************/
+package org.ofbiz.jetty.container;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.mortbay.jetty.AbstractConnector;
+import org.mortbay.jetty.NCSARequestLog;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.ajp.Ajp13SocketConnector;
+import org.mortbay.jetty.bio.SocketConnector;
+import org.mortbay.jetty.handler.RequestLogHandler;
+import org.mortbay.jetty.nio.SelectChannelConnector;
+import org.mortbay.jetty.security.SslSelectChannelConnector;
+import org.mortbay.jetty.security.SslSocketConnector;
+import org.mortbay.jetty.servlet.HashSessionManager;
+import org.mortbay.jetty.servlet.SessionHandler;
+import org.mortbay.jetty.webapp.WebAppContext;
+import org.mortbay.thread.BoundedThreadPool;
+import org.ofbiz.base.component.ComponentConfig;
+import org.ofbiz.base.container.Container;
+import org.ofbiz.base.container.ContainerConfig;
+import org.ofbiz.base.container.ContainerException;
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.SSLUtil;
+import org.ofbiz.base.util.UtilValidate;
+
+
+/**
+ * JettyContainer - Container implementation for Jetty 6
+ *
+ */
+public class JettyContainer implements Container {
+
+    public static final String module = JettyContainer.class.getName();
+
+    protected String configFile = null;
+    private Map<String, Server> servers = new HashMap<String, Server>();
+
+    /**
+     * @see org.ofbiz.base.container.Container#init(java.lang.String[],java.lang.String)
+     */
+    public void init(String[] args, String configFile) {
+        this.configFile = configFile;
+    }
+
+    private void initJetty() throws ContainerException {
+
+        // configure JSSE properties
+        SSLUtil.loadJsseProperties();
+
+        // get the container
+        ContainerConfig.Container jc = ContainerConfig.getContainer("jetty-container", configFile);
+
+        // create the servers
+        for (ContainerConfig.Container.Property property : jc.properties.values()) {
+            servers.put(property.name, createServer(property));
+        }
+
+        // load the applications
+        Collection<ComponentConfig> componentConfigs = ComponentConfig.getAllComponents();
+        if (componentConfigs != null) {
+
+            for (Object componentConfig : componentConfigs) {
+
+                ComponentConfig component = (ComponentConfig) componentConfig;
+
+                for (ComponentConfig.WebappInfo webappInfo : component.getWebappInfos()) {
+
+                    List<String> virtualHosts = webappInfo.getVirtualHosts();
+                    Map<String, String> initParameters = webappInfo.getInitParameters();
+
+                    Server server = servers.get(webappInfo.server);
+
+                    if (server == null) {
+                        Debug.logWarning("Server with name [" + webappInfo.server + "] not found; not mounting [" + webappInfo.name + "]", module);
+                    } else {
+
+                        // set the root location (make sure we set the paths correctly)
+                        String location = component.getRootLocation() + webappInfo.location;
+                        location = location.replace('\\', '/');
+                        if (location.endsWith("/")) {
+                            location = location.substring(0, location.lastIndexOf("/"));
+                        }
+
+                        // load the application
+                        String mountPoint = webappInfo.mountPoint;
+                        if (mountPoint.endsWith("/*")) {
+                            mountPoint = mountPoint.substring(0, mountPoint.lastIndexOf("/"));
+                        }
+
+                        WebAppContext context = new WebAppContext(location, mountPoint);
+                        context.setAttribute("_serverId", webappInfo.server);
+                        context.setLogUrlOnStart(true);
+
+                         // set the session manager
+                        HashSessionManager sm = new HashSessionManager();
+                        context.setSessionHandler(new SessionHandler(sm));
+
+                        // set the virtual hosts
+                        if (UtilValidate.isNotEmpty(virtualHosts)) {
+                            context.setVirtualHosts(virtualHosts.toArray(new String[virtualHosts.size()]));
+                        }
+
+                        // set the init parameters
+                        if (UtilValidate.isNotEmpty(initParameters)) {
+                            context.setInitParams(initParameters);
+                        }
+
+                        server.addHandler(context);
+                    }
+                }
+            }
+        }
+    }
+
+    private Server createServer(ContainerConfig.Container.Property serverConfig) throws ContainerException {
+
+        Server server = new Server();
+
+        // configure the connectors / loggers
+        for (ContainerConfig.Container.Property props : serverConfig.properties.values()) {
+
+            if ("send-server-version".equals(props.name)) {
+                if ("false".equalsIgnoreCase(props.value)) {
+                    server.setSendServerVersion(false);
+                }
+            } else if ("connector".equals(props.value)) {
+
+                if ("http".equals(props.getProperty("type").value)) {
+
+                    AbstractConnector connector = new SocketConnector();
+                    setConnectorOptions(connector, props);
+                    server.addConnector(connector);
+
+                } else if ("https".equals(props.getProperty("type").value)) {
+
+                    SslSocketConnector connector = new SslSocketConnector();
+                    setConnectorOptions(connector, props);
+
+                    if (props.getProperty("keystore") != null) {
+                        connector.setKeystore(props.getProperty("keystore").value);
+                    }
+                    if (props.getProperty("password") != null) {
+                        connector.setPassword(props.getProperty("password").value);
+                    }
+                    if (props.getProperty("key-password") != null) {
+                        connector.setKeyPassword(props.getProperty("key-password").value);
+                    }
+                    if (props.getProperty("client-auth") != null) {
+                        if ("need".equals(props.getProperty("client-auth").value)) {
+                            connector.setNeedClientAuth(true);
+                        } else if ("want".equals(props.getProperty("client-auth").value)) {
+                            connector.setWantClientAuth(true);
+                        }
+                    }
+
+                    server.addConnector(connector);
+
+                } else if ("nio-http".equals(props.getProperty("type").value)) {
+
+                    AbstractConnector connector = new SelectChannelConnector();
+                    setConnectorOptions(connector, props);
+                    server.addConnector(connector);
+
+                } else if ("nio-https".equals(props.getProperty("type").value)) {
+
+                    SslSelectChannelConnector connector = new SslSelectChannelConnector();
+                    setConnectorOptions(connector, props);
+
+                    if (props.getProperty("keystore") != null) {
+                        connector.setKeystore(props.getProperty("keystore").value);
+                    }
+                    if (props.getProperty("password") != null) {
+                        connector.setPassword(props.getProperty("password").value);
+                    }
+                    if (props.getProperty("key-password") != null) {
+                        connector.setKeyPassword(props.getProperty("key-password").value);
+                    }
+                    if (props.getProperty("need-client-auth") != null) {
+                        boolean needClientAuth = "true".equalsIgnoreCase(props.getProperty("need-client-auth").value);
+                        connector.setNeedClientAuth(needClientAuth);
+                    }
+
+                    server.addConnector(connector);
+
+                } else if ("ajp13".equals(props.getProperty("type").value)) {
+
+                    AbstractConnector connector = new Ajp13SocketConnector();
+                    setConnectorOptions(connector, props);
+                    server.addConnector(connector);
+                }
+
+            } else if ("request-log".equals(props.value)) {
+
+                RequestLogHandler requestLogHandler = new RequestLogHandler();
+
+                NCSARequestLog requestLog = new NCSARequestLog();
+
+                if (props.getProperty("filename") != null) {
+                    requestLog.setFilename(props.getProperty("filename").value);
+                }
+
+                if (props.getProperty("append") != null) {
+                    requestLog.setAppend("true".equalsIgnoreCase(props.getProperty("append").value));
+                }
+
+                if (props.getProperty("extended") != null) {
+                    requestLog.setExtended("true".equalsIgnoreCase(props.getProperty("extended").value));
+                }
+
+                if (props.getProperty("timezone") != null) {
+                    requestLog.setLogTimeZone(props.getProperty("timezone").value);
+                }
+
+                if (props.getProperty("date-format") != null) {
+                    requestLog.setLogDateFormat(props.getProperty("date-format").value);
+                }
+
+                if (props.getProperty("retain-days") != null) {
+                    int days = 90;
+                    try {
+                        days = Integer.parseInt(props.getProperty("retain-days").value);
+                    } catch (NumberFormatException e) {
+                        days = 90;
+                    }
+                    requestLog.setRetainDays(days);
+                }
+
+                requestLogHandler.setRequestLog(requestLog);
+                server.addHandler(requestLogHandler);
+            }
+        }
+
+        return server;
+    }
+
+    private void setConnectorOptions(AbstractConnector connector, ContainerConfig.Container.Property props) throws ContainerException {
+
+        String systemHost = null;
+        if ("default".equals(props.getProperty("type").value)) {
+            systemHost = System.getProperty(props.name + ".host");
+        }
+        if (props.getProperty("host") != null && systemHost == null) {
+            connector.setHost(props.getProperty("host").value);
+        } else {
+            String host = "0.0.0.0";
+            if (systemHost != null) {
+                host = systemHost;
+            }
+            connector.setHost(host);
+        }
+
+        String systemPort = null;
+        if ("default".equals(props.getProperty("type").value)) {
+            systemPort = System.getProperty(props.name + ".port");
+        }
+        if (props.getProperty("port") != null && systemPort == null) {
+            int value = 8080;
+            try {
+                value = Integer.parseInt(props.getProperty("port").value);
+            } catch (NumberFormatException e) {
+                value = 8080;
+            }
+            if (value == 0) value = 8080;
+
+            connector.setPort(value);
+        } else {
+            int port = 8080;
+            if (systemPort != null) {
+                try {
+                    port = Integer.parseInt(systemPort);
+                } catch (NumberFormatException e) {
+                    port = 8080;
+                }
+            }
+            connector.setPort(port);
+        }
+
+        if (props.getProperty("buffer-size") != null) {
+            int value = 0;
+            try {
+                value = Integer.parseInt(props.getProperty("buffer-size").value);
+            } catch (NumberFormatException e) {
+                value = 0;
+            }
+            if (value > 0) {
+                connector.setResponseBufferSize(value);
+            }
+        }
+
+        if (props.getProperty("linger-time") != null) {
+            int value = 0;
+            try {
+                value = Integer.parseInt(props.getProperty("linger-time").value);
+            } catch (NumberFormatException e) {
+                value = 0;
+            }
+            if (value > 0) {
+                connector.setSoLingerTime(value);
+            }
+        }
+
+        if (props.getProperty("low-resource-max-idle-time") != null) {
+            int value = 0;
+            try {
+                value = Integer.parseInt(props.getProperty("low-resource-max-idle-time").value);
+            } catch (NumberFormatException e) {
+                value = 0;
+            }
+            if (value > 0) {
+                connector.setLowResourceMaxIdleTime(value);
+            }
+        }
+
+
+        BoundedThreadPool threadPool = new BoundedThreadPool();
+
+        if (props.getProperty("min-threads") != null) {
+            int value = 0;
+            try {
+                value = Integer.parseInt(props.getProperty("min-threads").value);
+            } catch (NumberFormatException e) {
+                value = 0;
+            }
+            if (value > 0) {
+                threadPool.setMinThreads(value);
+            }
+        }
+
+        if (props.getProperty("max-threads") != null) {
+            int value = 0;
+            try {
+                value = Integer.parseInt(props.getProperty("max-threads").value);
+            } catch (NumberFormatException e) {
+                value = 0;
+            }
+            if (value > 0) {
+                threadPool.setMaxThreads(value);
+            }
+        }
+
+        if (props.getProperty("max-idle-time") != null) {
+            int value = 0;
+            try {
+                value = Integer.parseInt(props.getProperty("max-idle-time").value);
+            } catch (NumberFormatException e) {
+                value = 0;
+            }
+            if (value > 0) {
+                threadPool.setMaxIdleTimeMs(value);
+            }
+        }
+
+        if (props.getProperty("low-threads") != null) {
+            int value = 0;
+            try {
+                value = Integer.parseInt(props.getProperty("low-threads").value);
+            } catch (NumberFormatException e) {
+                value = 0;
+            }
+            if (value > 0) {
+                threadPool.setLowThreads(value);
+            }
+        }
+
+        connector.setThreadPool(threadPool);
+
+    }
+
+    /**
+     * @see org.ofbiz.base.container.Container#start()
+     */
+    public boolean start() throws ContainerException {
+        // start the server(s)
+        this.initJetty();
+        if (servers != null) {
+            for (Server server : servers.values()) {
+                try {
+                    server.start();
+                } catch (Exception e) {
+                    Debug.logError(e, "Jetty Server Exception", module);
+                    throw new ContainerException(e);
+                }
+            }
+        }
+        return true;
+    }
+
+    /**
+     * @see org.ofbiz.base.container.Container#stop()
+     */
+    public void stop() throws ContainerException {
+        if (servers != null) {
+            for (Server server : servers.values()) {
+                try {
+                    server.stop();
+                } catch (Exception e) {
+                    Debug.logWarning(e, module);
+                }
+            }
+        }
+    }
+}
diff --git a/framework/resources/templates/build.xml b/framework/resources/templates/build.xml
index 3146e2f..7134c0e 100644
--- a/framework/resources/templates/build.xml
+++ b/framework/resources/templates/build.xml
@@ -42,6 +42,10 @@
             <arg value="diff"/>
             <arg value="--depth=files"/>
         </exec>
+        <exec executable="svn" output="patches/root.patch" dir="${ofbiz.home.dir}">
+            <arg value="diff"/>
+            <arg value="--depth=files"/>
+        </exec>
         <exec executable="svn" output="patches/framework.patch" dir="${ofbiz.home.dir}">
             <arg value="diff"/>
             <arg value="framework"/>
diff --git a/framework/testtools/convertSeleniumIDE.bat b/framework/testtools/convertSeleniumIDE.bat
new file mode 100644
index 0000000..5319fff
--- /dev/null
+++ b/framework/testtools/convertSeleniumIDE.bat
@@ -0,0 +1,42 @@
+rem #####################################################################

+rem Licensed to the Apache Software Foundation (ASF) under one

+rem or more contributor license agreements.  See the NOTICE file

+rem distributed with this work for additional information

+rem regarding copyright ownership.  The ASF licenses this file

+rem to you under the Apache License, Version 2.0 (the

+rem "License"); you may not use this file except in compliance

+rem with the License.  You may obtain a copy of the License at

+rem

+rem http://www.apache.org/licenses/LICENSE-2.0

+rem

+rem Unless required by applicable law or agreed to in writing,

+rem software distributed under the License is distributed on an

+rem "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

+rem KIND, either express or implied.  See the License for the

+rem specific language governing permissions and limitations

+rem under the License.

+rem #####################################################################

+

+set OFBIZ_HOME=../..

+set CP=./build/lib/ofbiz-testtools.jar

+set CP=%CP%;./lib/selenium-java-client-driver.jar

+set CP=%CP%;%OFBIZ_HOME%/framework/base/build/lib/ofbiz-base.jar

+set CP=%CP%;%OFBIZ_HOME%/framework/base/lib/httpclient-4.0.jar

+set CP=%CP%;%OFBIZ_HOME%/framework/base/lib/jdom-1.1.jar

+set CP=%CP%;%OFBIZ_HOME%/framework/base/lib/scripting/jython-nooro.jar

+set CP=%CP%;%OFBIZ_HOME%/framework/base/lib/junit.jar

+set CP=%CP%;%OFBIZ_HOME%/framework/base/lib/commons/commons-lang-2.3.jar

+set CP=%CP%;%OFBIZ_HOME%/framework/base/lib/log4j-1.2.15.jar

+

+rem echo %CP%

+

+rem For Example:

+rem convertSeleniumIDE.bat <recorded_script> <converted_script>

+

+rem following commands needs MkTemp for Windows (http://gnuwin32.sourceforge.net/packages/mktemp.htm)

+rem and Sed for Windows (http://gnuwin32.sourceforge.net/packages/sed.htm) to work

+tempFile=`mktemp tempFileXXX.html` 

+sed '2d' %1 > $tempFile

+rem BEware the following command is provided for convenience and remains untestet

+"%JAVA_HOME%/bin/java.exe" -cp %CP% org.ofbiz.testtools.seleniumxml.SeleniumIDEConverter "%tempFile%" %2

+del "%tempFile%"
\ No newline at end of file
diff --git a/framework/testtools/runSeleniumServer.bat b/framework/testtools/runSeleniumServer.bat
new file mode 100644
index 0000000..9372905
--- /dev/null
+++ b/framework/testtools/runSeleniumServer.bat
@@ -0,0 +1,20 @@
+rem #####################################################################

+rem Licensed to the Apache Software Foundation (ASF) under one

+rem or more contributor license agreements.  See the NOTICE file

+rem distributed with this work for additional information

+rem regarding copyright ownership.  The ASF licenses this file

+rem to you under the Apache License, Version 2.0 (the

+rem "License"); you may not use this file except in compliance

+rem with the License.  You may obtain a copy of the License at

+rem

+rem http://www.apache.org/licenses/LICENSE-2.0

+rem

+rem Unless required by applicable law or agreed to in writing,

+rem software distributed under the License is distributed on an

+rem "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

+rem KIND, either express or implied.  See the License for the

+rem specific language governing permissions and limitations

+rem under the License.

+rem #####################################################################

+

+java -jar ../../framework/testtools/lib/selenium-server.jar -firefoxProfileTemplate ./config/firefox_profile -timeout 240

diff --git a/framework/testtools/runSeleniumXml.bat b/framework/testtools/runSeleniumXml.bat
new file mode 100644
index 0000000..2778d2a
--- /dev/null
+++ b/framework/testtools/runSeleniumXml.bat
@@ -0,0 +1,35 @@
+rem #####################################################################

+rem Licensed to the Apache Software Foundation (ASF) under one

+rem or more contributor license agreements.  See the NOTICE file

+rem distributed with this work for additional information

+rem regarding copyright ownership.  The ASF licenses this file

+rem to you under the Apache License, Version 2.0 (the

+rem "License"); you may not use this file except in compliance

+rem with the License.  You may obtain a copy of the License at

+rem

+rem http://www.apache.org/licenses/LICENSE-2.0

+rem

+rem Unless required by applicable law or agreed to in writing,

+rem software distributed under the License is distributed on an

+rem "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

+rem KIND, either express or implied.  See the License for the

+rem specific language governing permissions and limitations

+rem under the License.

+rem #####################################################################

+

+rem set JAVA_HOME=%JDK_15%

+set OFBIZ_HOME=../..

+set CP=./build/lib/ofbiz-testtools.jar

+set CP=%CP%;./lib/selenium-java-client-driver.jar

+set CP=%CP%;%OFBIZ_HOME%/framework/base/lib/httpclient-4.0.jar

+set CP=%CP%;%OFBIZ_HOME%/framework/base/lib/jdom-1.1.jar

+set CP=%CP%;%OFBIZ_HOME%/framework/base/lib/scripting/jython-nooro.jar

+set CP=%CP%;%OFBIZ_HOME%/framework/base/lib/junit.jar

+set CP=%CP%;%OFBIZ_HOME%/framework/base/lib/commons/commons-lang-2.3.jar

+set CP=%CP%;%OFBIZ_HOME%/framework/base/lib/log4j-1.2.15.jar

+set CP=%CP%;%OFBIZ_HOME%/framework/base/lib/javolution-5.2.3.jar

+set CP=%CP%;%OFBIZ_HOME%/framework/base/build/lib/ofbiz-base.jar

+

+echo %CP%

+

+"%JAVA_HOME%/bin/java.exe" -Dselenium.config=./config/seleniumXml.properties -cp %CP% org.ofbiz.testtools.seleniumxml.SeleniumXml %1

diff --git a/startofbiz.bat b/startofbiz.bat
new file mode 100644
index 0000000..10c300f
--- /dev/null
+++ b/startofbiz.bat
@@ -0,0 +1,58 @@
+echo off

+rem #####################################################################

+rem Licensed to the Apache Software Foundation (ASF) under one

+rem or more contributor license agreements.  See the NOTICE file

+rem distributed with this work for additional information

+rem regarding copyright ownership.  The ASF licenses this file

+rem to you under the Apache License, Version 2.0 (the

+rem "License"); you may not use this file except in compliance

+rem with the License.  You may obtain a copy of the License at

+rem

+rem http://www.apache.org/licenses/LICENSE-2.0

+rem

+rem Unless required by applicable law or agreed to in writing,

+rem software distributed under the License is distributed on an

+rem "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

+rem KIND, either express or implied.  See the License for the

+rem specific language governing permissions and limitations

+rem under the License.

+rem #####################################################################

+

+rem ### Console log file

+rem set OFBIZ_LOG=runtime\logs\console.log

+

+rem ### Delete the last log

+rem del %OFBIZ_LOG%

+

+rem ###VM args block ####################################################

+rem set MEMIF=-Xms128M -Xmx512M -XX:MaxPermSize=512m

+rem # RMI settings

+rem set DEBUG=-Dsun.rmi.server.exceptionTrace=true

+rem # Automatic IP address for Windows

+rem ipconfig | find "IP." | find /v "::" | find /v "0.0.0.0" > tmp.tmp

+rem for /f "tokens=2* delims=:" %%a in (tmp.tmp)  do for %%b IN (%%a) do set IPADDR=%%b

+rem del tmp.tmp

+rem set RMIIF=-Djava.rmi.server.hostname=%IPADDR%

+rem # Not needed anymore, for history

+rem set MISC=-Duser.language=en

+rem set VMARGS=%MEMIF% %MISC% %DEBUG% %RMIIF%

+rem ####################################################################

+

+rem ### Worldpay Config

+rem set VMARGS=-Xbootclasspath/p:applications\accounting\lib\cryptix.jar %VMARGS%

+

+

+rem ### Different ways of launching OFBiz ##############################

+rem ### start ofbiz with previous set VMARGS

+rem "%JAVA_HOME%\bin\java" %VMARGS% -jar ofbiz.jar > %OFBIZ_LOG%

+

+rem ### This one is for more of a debugging mode

+rem "%JAVA_HOME%\bin\java" -Xms128M -Xmx512M -XX:MaxPermSize=512m -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -jar ofbiz.jar > runtime\logs\console.log

+

+rem ### Simple easy to read line

+echo on

+"%JAVA_HOME%\bin\java" -Xms128M -Xmx512M -XX:MaxPermSize=512m -jar ofbiz.jar

+echo off

+rem ### If you would prefer the console output to be logged rather than displayed switch out the above line for this one

+rem "%JAVA_HOME%\bin\java" -Xms128M -Xmx512M -XX:MaxPermSize=512m -jar ofbiz.jar > runtime\logs\console.log

+