diff --git a/.bowerrc b/.bowerrc new file mode 100644 index 000000000..c9c8962b0 --- /dev/null +++ b/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory": "src/main/webapp/vendors" +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..8d67bc7a5 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# top-most EditorConfig file +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space + +[*.{java,xml}] +indent_size = 4 +trim_trailing_whitespace = true diff --git a/.gitignore b/.gitignore index 576ae30b7..6dec04c57 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,5 @@ target/* .idea *.iml /target -generated/ +generated/ diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 000000000..c6feb8bb6 Binary files /dev/null and b/.mvn/wrapper/maven-wrapper.jar differ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 000000000..25cc8af3c --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.3/apache-maven-3.3.3-bin.zip diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..c0f28cfa4 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,2 @@ +language: java +jdk: oraclejdk8 diff --git a/bower.json b/bower.json new file mode 100644 index 000000000..1d7ce55eb --- /dev/null +++ b/bower.json @@ -0,0 +1,8 @@ +{ + "name": "spring-petclinic", + "dependencies": { + "bootstrap": "3.3.6", + "jquery": "~2.0.3", + "jquery-ui": "~1.10.3" + } +} diff --git a/mvnw b/mvnw new file mode 100755 index 000000000..fc7efd17d --- /dev/null +++ b/mvnw @@ -0,0 +1,234 @@ +#!/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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # + # Look for the Apple JDKs first to preserve the existing behaviour, and then look + # for the new JDKs provided by Oracle. + # + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then + # + # Oracle JDKs + # + export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then + # + # Apple JDKs + # + export JAVA_HOME=`/usr/libexec/java_home` + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + 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 + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Migwn, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + local basedir=$(pwd) + local wdir=$(pwd) + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + wdir=$(cd "$wdir/.."; pwd) + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)} +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CMD_LINE_ARGS + diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 000000000..0d49a2de0 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,145 @@ +@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 ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +set MAVEN_CMD_LINE_ARGS=%MAVEN_CONFIG% %* + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" + +set WRAPPER_JAR=""%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS% +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/pom.xml b/pom.xml index 50f5b5258..110c56cb5 100644 --- a/pom.xml +++ b/pom.xml @@ -1,392 +1,459 @@ - - 4.0.0 - org.springframework.samples - spring-petclinic - 1.0.0-SNAPSHOT + + 4.0.0 + org.springframework.samples + spring-petclinic + 4.2.5-SNAPSHOT - petclinic - war + petclinic + war - + - - 1.7 - UTF-8 - UTF-8 + + 1.7 + UTF-8 + UTF-8 - - 1.1.3.RELEASE - 1.1.0.RELEASE + + 2.0.5.RELEASE + 1.1.0.RELEASE - - 7.0.59 + + 7.0.59 - - 2.1.0 - - - 1.3 - 1.1.1 - 3.2.0.GA + + 2.2.0 + + 1.3 + 1.1.1 + 3.2.0.GA - - 2.3.0 - 1.10.3 - 2.0.3-1 - 1.0.1 + + 5.1.36 - 2.7 + + 1.1.1 + 1.1.0 - + 2.7 - - - - - io.spring.platform - platform-bom - ${spring-io-platform.version} - pom - import - - - + - - - org.jadira.usertype - usertype.core - ${jadira-usertype-core.version} - - - org.apache.tomcat - tomcat-servlet-api - ${tomcat.version} - provided + + + + + io.spring.platform + platform-bom + ${spring-io-platform.version} + pom + import + + + + + + + org.jadira.usertype + usertype.core + ${jadira-usertype-core.version} + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + javax.servlet.jsp + javax.servlet.jsp-api + provided + + + org.apache.tomcat + tomcat-jasper-el + ${tomcat.version} + provided - - javax.servlet.jsp - javax.servlet.jsp-api - provided - - - org.apache.tomcat - tomcat-jasper-el - ${tomcat.version} - provided - - javax.servlet.jsp.jstl - javax.servlet.jsp.jstl-api + javax.servlet.jsp.jstl + javax.servlet.jsp.jstl-api - - org.apache.taglibs - taglibs-standard-jstlel - - - + + org.apache.taglibs + taglibs-standard-jstlel + + + com.jayway.jsonpath json-path test - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-data-jpa - + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-data-jpa + - - org.springframework.data - spring-data-jdbc-core - ${spring-data-jdbc.version} - - - org.springframework - * - - - - + + org.springframework.data + spring-data-jdbc-core + ${spring-data-jdbc.version} + + + org.springframework + * + + + + - - org.springframework - spring-jdbc - - - org.springframework - spring-webmvc - - - - org.springframework - spring-context-support - - - org.springframework - spring-oxm - + + org.springframework + spring-jdbc + + + org.springframework + spring-webmvc + + + + org.springframework + spring-context-support + + + org.springframework + spring-oxm + - - org.aspectj - aspectjrt - - - org.aspectj - aspectjweaver - runtime - - - - - org.apache.tomcat - tomcat-jdbc - + + org.apache.tomcat + tomcat-jdbc + - - - org.slf4j - slf4j-api - - - ch.qos.logback - logback-classic - runtime - - - - - joda-time - joda-time - - - joda-time - joda-time-hibernate - ${jodatime-hibernate.version} - - - joda-time - joda-time-jsptags - ${jodatime-jsptags.version} - + + + org.slf4j + slf4j-api + + + ch.qos.logback + logback-classic + runtime + - - - org.hsqldb - hsqldb - runtime - + + + joda-time + joda-time + + + joda-time + joda-time-hibernate + ${jodatime-hibernate.version} + + + joda-time + joda-time-jsptags + ${jodatime-jsptags.version} + - - - - - org.hibernate - hibernate-entitymanager - - - org.hibernate - hibernate-validator - - - - org.hibernate - hibernate-ehcache - - - net.sf.ehcache - ehcache-core - - - commons-logging - commons-logging - - - - - - org.webjars - bootstrap - ${webjars-bootstrap.version} - - - org.webjars - jquery-ui - ${webjars-jquery-ui.version} - - - org.webjars - jquery - ${webjars-jquery.version} - - - - - org.springframework - spring-test - test - - - junit - junit - test - - - org.assertj - assertj-core - ${assertj.version} - test - + + + org.hsqldb + hsqldb + runtime + - - - com.github.dandelion - datatables-jsp - ${dandelion.version} - - - com.github.dandelion - datatables-export-itext - ${dandelion.version} - - + + - - - install - - - - ${project.basedir}/src/test/java - - - ${project.basedir}/src/test/resources - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.0 - - - - - true - ${java.version} - ${java.version} - true - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.13 - - - **/*Tests.java - - - - - org.apache.maven.plugins - maven-war-plugin - 2.3 - - petclinic - - - - org.apache.maven.plugins - maven-eclipse-plugin - 2.9 - - true - true - 2.0 - - **/*.* - - - - org.springframework.ide.eclipse.core.springbuilder - - - org.eclipse.m2e.core.maven2Builder - - - - org.eclipse.jdt.core.javanature - org.springframework.ide.eclipse.core.springnature - org.eclipse.m2e.core.maven2Nature - - - - - org.apache.maven.plugins - maven-assembly-plugin - 2.4 - - - jar-with-dependencies - - - - - org.apache.tomcat.maven - tomcat7-maven-plugin - 2.2 - - tomcat-development-server - 9966 - /petclinic - - - - org.codehaus.mojo - cobertura-maven-plugin - ${cobertura.version} - - - - - - - clean - check - - - - - - - - - - - - org.codehaus.mojo - cobertura-maven-plugin - ${cobertura.version} - - - html - - - - - - + + + org.hibernate + hibernate-entitymanager + + + org.hibernate + hibernate-validator + - demopetclinic + + org.hibernate + hibernate-ehcache + + + net.sf.ehcache + ehcache + + + commons-logging + commons-logging + + + + + + + org.springframework + spring-test + test + + + junit + junit + test + + + org.assertj + assertj-core + ${assertj.version} + test + + + org.mockito + mockito-core + test + + + org.hamcrest + hamcrest-all + test + + + + + com.github.dandelion + dandelion-jsp + ${dandelion.version} + + + com.github.dandelion + datatables-jsp + ${dandelion.datatables.version} + + + com.github.dandelion + datatables-export-itext + ${dandelion.datatables.version} + + + + com.googlecode.json-simple + json-simple + + + + + + install + + + + ${project.basedir}/src/test/java + + + ${project.basedir}/src/test/resources + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.0 + + + + + true + ${java.version} + ${java.version} + true + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.13 + + + **/*Tests.java + + + + + org.apache.maven.plugins + maven-war-plugin + 2.3 + + petclinic + + + + org.apache.maven.plugins + maven-eclipse-plugin + 2.9 + + true + true + 2.0 + + **/*.* + + + + org.springframework.ide.eclipse.core.springbuilder + + + org.eclipse.m2e.core.maven2Builder + + + + org.eclipse.jdt.core.javanature + org.springframework.ide.eclipse.core.springnature + org.eclipse.m2e.core.maven2Nature + + + + + org.apache.maven.plugins + maven-assembly-plugin + 2.4 + + + jar-with-dependencies + + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.2 + + tomcat-development-server + 9966 + /petclinic + + + + org.codehaus.mojo + cobertura-maven-plugin + ${cobertura.version} + + + + + + + clean + check + + + + + + + + + + + + org.codehaus.mojo + cobertura-maven-plugin + ${cobertura.version} + + + html + + + + + + + + + bower-install + + + + org.codehaus.mojo + exec-maven-plugin + 1.4.0 + + + generate-sources + + exec + + + + + bower + + install + + ${basedir} + + + + + + + less-install + + + + org.lesscss + lesscss-maven-plugin + 1.7.0.1.1 + + ${project.basedir}/src/main/webapp/resources/less + ${project.basedir}/src/main/webapp/resources/css + true + + petclinic.less + + + + + + compile + + + + + + + + + + demopetclinic diff --git a/readme.md b/readme.md index df9d65d3f..5cf6aeef4 100644 --- a/readme.md +++ b/readme.md @@ -1,5 +1,4 @@ -# Spring PetClinic Sample Application - +# Spring PetClinic Sample Application [![Build Status](https://travis-ci.org/spring-projects/spring-petclinic.png?branch=master)](https://travis-ci.org/spring-projects/spring-petclinic/) ## Understanding the Spring Petclinic application with a few diagrams See the presentation here @@ -7,7 +6,8 @@ ## Running petclinic locally ``` git clone https://github.com/spring-projects/spring-petclinic.git - mvn tomcat7:run + cd spring-petclinic + ./mvnw tomcat7:run ``` You can then access petclinic here: http://localhost:9966/petclinic/ @@ -15,6 +15,19 @@ You can then access petclinic here: http://localhost:9966/petclinic/ ## In case you find a bug/suggested improvement for Spring Petclinic Our issue tracker is available here: https://github.com/spring-projects/spring-petclinic/issues + +## Database configuration + +In its default configuration, Petclinic uses an in-memory database (HSQLDB) which +gets populated at startup with data. A similar setup is provided for MySql in case a persistent database configuration is needed. +Note that whenever the database type is changed, the data-access.properties file needs to be updated and the mysql-connector-java artifact from the pom.xml needs to be uncommented. + +You may start a MySql database with docker: + +``` +docker run -e MYSQL_ROOT_PASSWORD=petclinic -e MYSQL_DATABASE=petclinic -p 3306:3306 mysql:5.7.8 +``` + ## Working with Petclinic in Eclipse/STS ### prerequisites @@ -43,12 +56,12 @@ File -> Import -> Maven -> Existing Maven project - + - + @@ -56,11 +69,11 @@ File -> Import -> Maven -> Existing Maven project - + - + @@ -69,11 +82,13 @@ File -> Import -> Maven -> Existing Maven project createOrUpdateOwnerForm.jsp - + + bower-install maven profile declaration inside pom.xml
+ JavaScript libraries are defined by the manifest file bower.json
+ Bower configuration using JSON
+ Resource mapping in Spring configuration
+ sample usage in JSP @@ -104,21 +119,21 @@ File -> Import -> Maven -> Existing Maven project @@ -126,21 +141,19 @@ File -> Import -> Maven -> Existing Maven project
XML ConfigurationJava Config
XML ConfigurationJava Config branch - This javaconfig branch uses Java Configuration. In case you'd like to use the XML configuration instead, there the master branch is available here. XML remains the default configuration for Spring Petclinic. + Petclinic uses XML configuration by default. In case you'd like to use Java Config instead, there is a Java Config branch available here. Thanks to Antoine Rey for his contribution.
Spring MVC - XML integrationMvcViewConfig.javamvc-view-config.xml
Spring MVC - ContentNegotiatingViewResolverMvcViewConfig.javamvc-view-config.xml
JSP custom tags
webjarsBower - webjars declaration inside pom.xml
- Resource mapping in Spring configuration
- sample usage in JSP
Transactions - BusinessConfig.java + business-config.xml ClinicServiceImpl.java
Cache - ToolsConfig.java + tools-config.xml ClinicServiceImpl.java
Bean Profiles - JdbcConfig.java + business-config.xml ClinicServiceJdbcTests.java web.xml
JdbcTemplate - JdbcConfig.java + business-config.xml jdbc folder
JPA - SharedJpaConfig.java - JpaConfig.java + business-config.xml jpa folder
Spring Data JPA - SharedJpaConfig.java - SpringDataJpaConfig.java + business-config.xml springdatajpa folder
@@ -149,6 +162,11 @@ File -> Import -> Maven -> Existing Maven project OthersFiles + + Spring Boot branch + + See here + Gradle branch @@ -193,5 +211,12 @@ Here is a list of them: +# Contributing + +The [issue tracker](https://github.com/spring-projects/spring-petclinic/issues) is the preferred channel for bug reports, features requests and submitting pull requests. + +For pull requests, editor preferences are available in the [editor config](https://github.com/spring-projects/spring-petclinic/blob/master/.editorconfig) for easy use in common text editors. Read more and download plugins at . + + diff --git a/src/main/java/org/springframework/samples/petclinic/model/BaseEntity.java b/src/main/java/org/springframework/samples/petclinic/model/BaseEntity.java index 8dfbfe90b..14603c1ff 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/BaseEntity.java +++ b/src/main/java/org/springframework/samples/petclinic/model/BaseEntity.java @@ -32,17 +32,16 @@ public class BaseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) protected Integer id; + public Integer getId() { + return id; + } public void setId(Integer id) { this.id = id; } - public Integer getId() { - return id; - } - public boolean isNew() { - return (this.id == null); + return this.id == null; } } diff --git a/src/main/java/org/springframework/samples/petclinic/model/NamedEntity.java b/src/main/java/org/springframework/samples/petclinic/model/NamedEntity.java index cb36a6267..d66c97ae7 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/NamedEntity.java +++ b/src/main/java/org/springframework/samples/petclinic/model/NamedEntity.java @@ -32,15 +32,14 @@ public class NamedEntity extends BaseEntity { @Column(name = "name") private String name; + public String getName() { + return this.name; + } public void setName(String name) { this.name = name; } - public String getName() { - return this.name; - } - @Override public String toString() { return this.getName(); diff --git a/src/main/java/org/springframework/samples/petclinic/model/Owner.java b/src/main/java/org/springframework/samples/petclinic/model/Owner.java index ca7c97ec2..d0158d907 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/Owner.java +++ b/src/main/java/org/springframework/samples/petclinic/model/Owner.java @@ -85,10 +85,6 @@ public class Owner extends Person { this.telephone = telephone; } - protected void setPetsInternal(Set pets) { - this.pets = pets; - } - protected Set getPetsInternal() { if (this.pets == null) { this.pets = new HashSet<>(); @@ -96,6 +92,10 @@ public class Owner extends Person { return this.pets; } + protected void setPetsInternal(Set pets) { + this.pets = pets; + } + public List getPets() { List sortedPets = new ArrayList<>(getPetsInternal()); PropertyComparator.sort(sortedPets, new MutableSortDefinition("name", true, true)); @@ -141,13 +141,13 @@ public class Owner extends Person { public String toString() { return new ToStringCreator(this) - .append("id", this.getId()) - .append("new", this.isNew()) - .append("lastName", this.getLastName()) - .append("firstName", this.getFirstName()) - .append("address", this.address) - .append("city", this.city) - .append("telephone", this.telephone) - .toString(); + .append("id", this.getId()) + .append("new", this.isNew()) + .append("lastName", this.getLastName()) + .append("firstName", this.getFirstName()) + .append("address", this.address) + .append("city", this.city) + .append("telephone", this.telephone) + .toString(); } } diff --git a/src/main/java/org/springframework/samples/petclinic/model/Pet.java b/src/main/java/org/springframework/samples/petclinic/model/Pet.java index 536fe07e6..970cdcb76 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/Pet.java +++ b/src/main/java/org/springframework/samples/petclinic/model/Pet.java @@ -32,6 +32,7 @@ import javax.persistence.Table; import org.hibernate.annotations.Type; import org.joda.time.DateTime; +import org.joda.time.LocalDate; import org.springframework.beans.support.MutableSortDefinition; import org.springframework.beans.support.PropertyComparator; import org.springframework.format.annotation.DateTimeFormat; @@ -48,9 +49,9 @@ import org.springframework.format.annotation.DateTimeFormat; public class Pet extends NamedEntity { @Column(name = "birth_date") - @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime") + @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDate") @DateTimeFormat(pattern = "yyyy/MM/dd") - private DateTime birthDate; + private LocalDate birthDate; @ManyToOne @JoinColumn(name = "type_id") @@ -63,33 +64,28 @@ public class Pet extends NamedEntity { @OneToMany(cascade = CascadeType.ALL, mappedBy = "pet", fetch = FetchType.EAGER) private Set visits; - - public void setBirthDate(DateTime birthDate) { - this.birthDate = birthDate; - } - - public DateTime getBirthDate() { + public LocalDate getBirthDate() { return this.birthDate; } - public void setType(PetType type) { - this.type = type; + public void setBirthDate(LocalDate birthDate) { + this.birthDate = birthDate; } public PetType getType() { return this.type; } - protected void setOwner(Owner owner) { - this.owner = owner; + public void setType(PetType type) { + this.type = type; } public Owner getOwner() { return this.owner; } - protected void setVisitsInternal(Set visits) { - this.visits = visits; + protected void setOwner(Owner owner) { + this.owner = owner; } protected Set getVisitsInternal() { @@ -99,6 +95,10 @@ public class Pet extends NamedEntity { return this.visits; } + protected void setVisitsInternal(Set visits) { + this.visits = visits; + } + public List getVisits() { List sortedVisits = new ArrayList<>(getVisitsInternal()); PropertyComparator.sort(sortedVisits, new MutableSortDefinition("date", false, false)); diff --git a/src/main/java/org/springframework/samples/petclinic/model/PetType.java b/src/main/java/org/springframework/samples/petclinic/model/PetType.java index 99adf7591..f60a5cd27 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/PetType.java +++ b/src/main/java/org/springframework/samples/petclinic/model/PetType.java @@ -20,7 +20,7 @@ import javax.persistence.Table; /** * @author Juergen Hoeller - * Can be Cat, Dog, Hamster... + * Can be Cat, Dog, Hamster... */ @Entity @Table(name = "types") diff --git a/src/main/java/org/springframework/samples/petclinic/model/Vet.java b/src/main/java/org/springframework/samples/petclinic/model/Vet.java index 61c518786..d93e14c46 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/Vet.java +++ b/src/main/java/org/springframework/samples/petclinic/model/Vet.java @@ -46,14 +46,9 @@ public class Vet extends Person { @ManyToMany(fetch = FetchType.EAGER) @JoinTable(name = "vet_specialties", joinColumns = @JoinColumn(name = "vet_id"), - inverseJoinColumns = @JoinColumn(name = "specialty_id")) + inverseJoinColumns = @JoinColumn(name = "specialty_id")) private Set specialties; - - protected void setSpecialtiesInternal(Set specialties) { - this.specialties = specialties; - } - protected Set getSpecialtiesInternal() { if (this.specialties == null) { this.specialties = new HashSet<>(); @@ -61,6 +56,10 @@ public class Vet extends Person { return this.specialties; } + protected void setSpecialtiesInternal(Set specialties) { + this.specialties = specialties; + } + @XmlElement public List getSpecialties() { List sortedSpecs = new ArrayList<>(getSpecialtiesInternal()); diff --git a/src/main/java/org/springframework/samples/petclinic/model/Vets.java b/src/main/java/org/springframework/samples/petclinic/model/Vets.java index aaf96b685..a6f05c606 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/Vets.java +++ b/src/main/java/org/springframework/samples/petclinic/model/Vets.java @@ -1,4 +1,3 @@ -/* /* * Copyright 2002-2013 the original author or authors. * diff --git a/src/main/java/org/springframework/samples/petclinic/model/Visit.java b/src/main/java/org/springframework/samples/petclinic/model/Visit.java index ea03bde74..023a8dcef 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/Visit.java +++ b/src/main/java/org/springframework/samples/petclinic/model/Visit.java @@ -23,7 +23,7 @@ import javax.persistence.Table; import org.hibernate.annotations.Type; import org.hibernate.validator.constraints.NotEmpty; -import org.joda.time.DateTime; +import org.joda.time.LocalDate; import org.springframework.format.annotation.DateTimeFormat; /** @@ -39,9 +39,9 @@ public class Visit extends BaseEntity { * Holds value of property date. */ @Column(name = "visit_date") - @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime") + @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDate") @DateTimeFormat(pattern = "yyyy/MM/dd") - private DateTime date; + private LocalDate date; /** * Holds value of property description. @@ -62,7 +62,7 @@ public class Visit extends BaseEntity { * Creates a new instance of Visit for the current date */ public Visit() { - this.date = new DateTime(); + this.date = new LocalDate(); } @@ -71,7 +71,7 @@ public class Visit extends BaseEntity { * * @return Value of property date. */ - public DateTime getDate() { + public LocalDate getDate() { return this.date; } @@ -80,7 +80,7 @@ public class Visit extends BaseEntity { * * @param date New value of property date. */ - public void setDate(DateTime date) { + public void setDate(LocalDate date) { this.date = date; } diff --git a/src/main/java/org/springframework/samples/petclinic/model/package-info.java b/src/main/java/org/springframework/samples/petclinic/model/package-info.java index 2723dc9ab..2730958db 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/package-info.java +++ b/src/main/java/org/springframework/samples/petclinic/model/package-info.java @@ -1,8 +1,5 @@ - /** - * * The classes in this package represent PetClinic's business layer. - * */ package org.springframework.samples.petclinic.model; diff --git a/src/main/java/org/springframework/samples/petclinic/repository/OwnerRepository.java b/src/main/java/org/springframework/samples/petclinic/repository/OwnerRepository.java index 131833706..a0869d1e3 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/OwnerRepository.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/OwnerRepository.java @@ -1,18 +1,3 @@ -/* - * Copyright 2002-2013 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ /* * Copyright 2002-2013 the original author or authors. * @@ -53,7 +38,7 @@ public interface OwnerRepository { * * @param lastName Value to search for * @return a Collection of matching Owners (or an empty Collection if none - * found) + * found) */ Collection findByLastName(String lastName) throws DataAccessException; @@ -62,8 +47,7 @@ public interface OwnerRepository { * * @param id the id to search for * @return the Owner if found - * @throws org.springframework.dao.DataRetrievalFailureException - * if not found + * @throws org.springframework.dao.DataRetrievalFailureException if not found */ Owner findById(int id) throws DataAccessException; diff --git a/src/main/java/org/springframework/samples/petclinic/repository/PetRepository.java b/src/main/java/org/springframework/samples/petclinic/repository/PetRepository.java index 693b2e5e9..1770e8555 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/PetRepository.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/PetRepository.java @@ -45,8 +45,7 @@ public interface PetRepository { * * @param id the id to search for * @return the Pet if found - * @throws org.springframework.dao.DataRetrievalFailureException - * if not found + * @throws org.springframework.dao.DataRetrievalFailureException if not found */ Pet findById(int id) throws DataAccessException; diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcOwnerRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcOwnerRepositoryImpl.java index 0a471b4d8..45de1aee0 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcOwnerRepositoryImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcOwnerRepositoryImpl.java @@ -35,6 +35,7 @@ import org.springframework.samples.petclinic.model.Pet; import org.springframework.samples.petclinic.model.PetType; import org.springframework.samples.petclinic.model.Visit; import org.springframework.samples.petclinic.repository.OwnerRepository; +import org.springframework.samples.petclinic.util.EntityUtils; import org.springframework.stereotype.Repository; /** @@ -58,8 +59,8 @@ public class JdbcOwnerRepositoryImpl implements OwnerRepository { public JdbcOwnerRepositoryImpl(DataSource dataSource, NamedParameterJdbcTemplate namedParameterJdbcTemplate) { this.insertOwner = new SimpleJdbcInsert(dataSource) - .withTableName("owners") - .usingGeneratedKeyColumns("id"); + .withTableName("owners") + .usingGeneratedKeyColumns("id"); this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource); @@ -76,9 +77,9 @@ public class JdbcOwnerRepositoryImpl implements OwnerRepository { Map params = new HashMap<>(); params.put("lastName", lastName + "%"); List owners = this.namedParameterJdbcTemplate.query( - "SELECT id, first_name, last_name, address, city, telephone FROM owners WHERE last_name like :lastName", - params, - BeanPropertyRowMapper.newInstance(Owner.class) + "SELECT id, first_name, last_name, address, city, telephone FROM owners WHERE last_name like :lastName", + params, + BeanPropertyRowMapper.newInstance(Owner.class) ); loadOwnersPetsAndVisits(owners); return owners; @@ -95,9 +96,9 @@ public class JdbcOwnerRepositoryImpl implements OwnerRepository { Map params = new HashMap<>(); params.put("id", id); owner = this.namedParameterJdbcTemplate.queryForObject( - "SELECT id, first_name, last_name, address, city, telephone FROM owners WHERE id= :id", - params, - BeanPropertyRowMapper.newInstance(Owner.class) + "SELECT id, first_name, last_name, address, city, telephone FROM owners WHERE id= :id", + params, + BeanPropertyRowMapper.newInstance(Owner.class) ); } catch (EmptyResultDataAccessException ex) { throw new ObjectRetrievalFailureException(Owner.class, id); @@ -110,11 +111,13 @@ public class JdbcOwnerRepositoryImpl implements OwnerRepository { Map params = new HashMap<>(); params.put("id", owner.getId()); final List pets = this.namedParameterJdbcTemplate.query( - "SELECT pets.id, name, birth_date, type_id, owner_id, visits.id as visit_id, visit_date, description, pet_id FROM pets LEFT OUTER JOIN visits ON pets.id = pet_id WHERE owner_id=:id", - params, - new JdbcPetVisitExtractor() + "SELECT pets.id, name, birth_date, type_id, owner_id, visits.id as visit_id, visit_date, description, pet_id FROM pets LEFT OUTER JOIN visits ON pets.id = pet_id WHERE owner_id=:id", + params, + new JdbcPetVisitExtractor() ); + Collection petTypes = getPetTypes(); for (JdbcPet pet : pets) { + pet.setType(EntityUtils.getById(petTypes, PetType.class, pet.getTypeId())); owner.addPet(pet); } } @@ -127,16 +130,16 @@ public class JdbcOwnerRepositoryImpl implements OwnerRepository { owner.setId(newKey.intValue()); } else { this.namedParameterJdbcTemplate.update( - "UPDATE owners SET first_name=:firstName, last_name=:lastName, address=:address, " + - "city=:city, telephone=:telephone WHERE id=:id", - parameterSource); + "UPDATE owners SET first_name=:firstName, last_name=:lastName, address=:address, " + + "city=:city, telephone=:telephone WHERE id=:id", + parameterSource); } } public Collection getPetTypes() throws DataAccessException { return this.namedParameterJdbcTemplate.query( - "SELECT id, name FROM types ORDER BY name", new HashMap(), - BeanPropertyRowMapper.newInstance(PetType.class)); + "SELECT id, name FROM types ORDER BY name", new HashMap(), + BeanPropertyRowMapper.newInstance(PetType.class)); } /** diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPet.java b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPet.java index 39ba53b83..4c266b931 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPet.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPet.java @@ -29,21 +29,20 @@ class JdbcPet extends Pet { private int ownerId; - - public void setTypeId(int typeId) { - this.typeId = typeId; - } - public int getTypeId() { return this.typeId; } - public void setOwnerId(int ownerId) { - this.ownerId = ownerId; + public void setTypeId(int typeId) { + this.typeId = typeId; } public int getOwnerId() { return this.ownerId; } + public void setOwnerId(int ownerId) { + this.ownerId = ownerId; + } + } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetRepositoryImpl.java index e3c02fc93..74cbc06b5 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetRepositoryImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetRepositoryImpl.java @@ -64,8 +64,8 @@ public class JdbcPetRepositoryImpl implements PetRepository { this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource); this.insertPet = new SimpleJdbcInsert(dataSource) - .withTableName("pets") - .usingGeneratedKeyColumns("id"); + .withTableName("pets") + .usingGeneratedKeyColumns("id"); this.ownerRepository = ownerRepository; this.visitRepository = visitRepository; @@ -75,46 +75,36 @@ public class JdbcPetRepositoryImpl implements PetRepository { public List findPetTypes() throws DataAccessException { Map params = new HashMap<>(); return this.namedParameterJdbcTemplate.query( - "SELECT id, name FROM types ORDER BY name", - params, - BeanPropertyRowMapper.newInstance(PetType.class)); + "SELECT id, name FROM types ORDER BY name", + params, + BeanPropertyRowMapper.newInstance(PetType.class)); } @Override public Pet findById(int id) throws DataAccessException { - JdbcPet pet; + Integer ownerId; try { Map params = new HashMap<>(); params.put("id", id); - pet = this.namedParameterJdbcTemplate.queryForObject( - "SELECT id, name, birth_date, type_id, owner_id FROM pets WHERE id=:id", - params, - new JdbcPetRowMapper()); + ownerId = this.namedParameterJdbcTemplate.queryForObject("SELECT owner_id FROM pets WHERE id=:id", params, Integer.class); } catch (EmptyResultDataAccessException ex) { throw new ObjectRetrievalFailureException(Pet.class, id); } - Owner owner = this.ownerRepository.findById(pet.getOwnerId()); - owner.addPet(pet); - pet.setType(EntityUtils.getById(findPetTypes(), PetType.class, pet.getTypeId())); - - List visits = this.visitRepository.findByPetId(pet.getId()); - for (Visit visit : visits) { - pet.addVisit(visit); - } - return pet; + Owner owner = this.ownerRepository.findById(ownerId); + return EntityUtils.getById(owner.getPets(), Pet.class, id); } @Override public void save(Pet pet) throws DataAccessException { if (pet.isNew()) { Number newKey = this.insertPet.executeAndReturnKey( - createPetParameterSource(pet)); + createPetParameterSource(pet)); pet.setId(newKey.intValue()); } else { this.namedParameterJdbcTemplate.update( - "UPDATE pets SET name=:name, birth_date=:birth_date, type_id=:type_id, " + - "owner_id=:owner_id WHERE id=:id", - createPetParameterSource(pet)); + "UPDATE pets SET name=:name, birth_date=:birth_date, type_id=:type_id, " + + "owner_id=:owner_id WHERE id=:id", + createPetParameterSource(pet)); } } @@ -123,11 +113,11 @@ public class JdbcPetRepositoryImpl implements PetRepository { */ private MapSqlParameterSource createPetParameterSource(Pet pet) { return new MapSqlParameterSource() - .addValue("id", pet.getId()) - .addValue("name", pet.getName()) - .addValue("birth_date", pet.getBirthDate().toDate()) - .addValue("type_id", pet.getType().getId()) - .addValue("owner_id", pet.getOwner().getId()); + .addValue("id", pet.getId()) + .addValue("name", pet.getName()) + .addValue("birth_date", pet.getBirthDate().toDate()) + .addValue("type_id", pet.getType().getId()) + .addValue("owner_id", pet.getOwner().getId()); } } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetRowMapper.java b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetRowMapper.java index ad00a7163..6420df163 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetRowMapper.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetRowMapper.java @@ -20,6 +20,7 @@ import java.sql.SQLException; import java.util.Date; import org.joda.time.DateTime; +import org.joda.time.LocalDate; import org.springframework.jdbc.core.RowMapper; /** @@ -34,7 +35,7 @@ class JdbcPetRowMapper implements RowMapper { pet.setId(rs.getInt("pets.id")); pet.setName(rs.getString("name")); Date birthDate = rs.getDate("birth_date"); - pet.setBirthDate(new DateTime(birthDate)); + pet.setBirthDate(new LocalDate(birthDate)); pet.setTypeId(rs.getInt("type_id")); pet.setOwnerId(rs.getInt("owner_id")); return pet; diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetVisitExtractor.java b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetVisitExtractor.java index c40786d93..6a4ba62c3 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetVisitExtractor.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetVisitExtractor.java @@ -27,7 +27,7 @@ import java.sql.SQLException; * {@link OneToManyResultSetExtractor} of Spring Data Core JDBC Extensions. */ public class JdbcPetVisitExtractor extends - OneToManyResultSetExtractor { + OneToManyResultSetExtractor { public JdbcPetVisitExtractor() { super(new JdbcPetRowMapper(), new JdbcVisitRowMapper()); @@ -51,4 +51,4 @@ public class JdbcPetVisitExtractor extends protected void addChild(JdbcPet root, Visit child) { root.addVisit(child); } -} \ No newline at end of file +} diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVetRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVetRepositoryImpl.java index 79db917f9..0231275c1 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVetRepositoryImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVetRepositoryImpl.java @@ -60,25 +60,25 @@ public class JdbcVetRepositoryImpl implements VetRepository { List vets = new ArrayList<>(); // Retrieve the list of all vets. vets.addAll(this.jdbcTemplate.query( - "SELECT id, first_name, last_name FROM vets ORDER BY last_name,first_name", - BeanPropertyRowMapper.newInstance(Vet.class))); + "SELECT id, first_name, last_name FROM vets ORDER BY last_name,first_name", + BeanPropertyRowMapper.newInstance(Vet.class))); // Retrieve the list of all possible specialties. final List specialties = this.jdbcTemplate.query( - "SELECT id, name FROM specialties", - BeanPropertyRowMapper.newInstance(Specialty.class)); + "SELECT id, name FROM specialties", + BeanPropertyRowMapper.newInstance(Specialty.class)); // Build each vet's list of specialties. for (Vet vet : vets) { final List vetSpecialtiesIds = this.jdbcTemplate.query( - "SELECT specialty_id FROM vet_specialties WHERE vet_id=?", - new BeanPropertyRowMapper() { - @Override - public Integer mapRow(ResultSet rs, int row) throws SQLException { - return rs.getInt(1); - } - }, - vet.getId()); + "SELECT specialty_id FROM vet_specialties WHERE vet_id=?", + new BeanPropertyRowMapper() { + @Override + public Integer mapRow(ResultSet rs, int row) throws SQLException { + return rs.getInt(1); + } + }, + vet.getId()); for (int specialtyId : vetSpecialtiesIds) { Specialty specialty = EntityUtils.getById(specialties, Specialty.class, specialtyId); vet.addSpecialty(specialty); diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVisitRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVisitRepositoryImpl.java index a923b7652..ecae18d99 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVisitRepositoryImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVisitRepositoryImpl.java @@ -19,13 +19,17 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.core.simple.SimpleJdbcInsert; import org.springframework.samples.petclinic.model.Visit; import org.springframework.samples.petclinic.repository.VisitRepository; import org.springframework.stereotype.Repository; import javax.sql.DataSource; + +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * A simple JDBC-based implementation of the {@link VisitRepository} interface. @@ -41,17 +45,17 @@ import java.util.List; @Repository public class JdbcVisitRepositoryImpl implements VisitRepository { - private JdbcTemplate jdbcTemplate; + private NamedParameterJdbcTemplate jdbcTemplate; private SimpleJdbcInsert insertVisit; @Autowired public JdbcVisitRepositoryImpl(DataSource dataSource) { - this.jdbcTemplate = new JdbcTemplate(dataSource); + this.jdbcTemplate = new NamedParameterJdbcTemplate(dataSource); this.insertVisit = new SimpleJdbcInsert(dataSource) - .withTableName("visits") - .usingGeneratedKeyColumns("id"); + .withTableName("visits") + .usingGeneratedKeyColumns("id"); } @@ -59,7 +63,7 @@ public class JdbcVisitRepositoryImpl implements VisitRepository { public void save(Visit visit) throws DataAccessException { if (visit.isNew()) { Number newKey = this.insertVisit.executeAndReturnKey( - createVisitParameterSource(visit)); + createVisitParameterSource(visit)); visit.setId(newKey.intValue()); } else { throw new UnsupportedOperationException("Visit update not supported"); @@ -72,17 +76,30 @@ public class JdbcVisitRepositoryImpl implements VisitRepository { */ private MapSqlParameterSource createVisitParameterSource(Visit visit) { return new MapSqlParameterSource() - .addValue("id", visit.getId()) - .addValue("visit_date", visit.getDate().toDate()) - .addValue("description", visit.getDescription()) - .addValue("pet_id", visit.getPet().getId()); + .addValue("id", visit.getId()) + .addValue("visit_date", visit.getDate().toDate()) + .addValue("description", visit.getDescription()) + .addValue("pet_id", visit.getPet().getId()); } @Override public List findByPetId(Integer petId) { - return this.jdbcTemplate.query( - "SELECT id as visit_id, visit_date, description FROM visits WHERE pet_id=?", - new JdbcVisitRowMapper(), petId); + Map params = new HashMap<>(); + params.put("id", petId); + JdbcPet pet = this.jdbcTemplate.queryForObject( + "SELECT id, name, birth_date, type_id, owner_id FROM pets WHERE id=:id", + params, + new JdbcPetRowMapper()); + + List visits = this.jdbcTemplate.query( + "SELECT id as visit_id, visit_date, description FROM visits WHERE pet_id=:id", + params, new JdbcVisitRowMapper()); + + for (Visit visit: visits) { + visit.setPet(pet); + } + + return visits; } } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVisitRowMapper.java b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVisitRowMapper.java index 94069042b..edc4527a3 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVisitRowMapper.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVisitRowMapper.java @@ -16,7 +16,7 @@ package org.springframework.samples.petclinic.repository.jdbc; -import org.joda.time.DateTime; +import org.joda.time.LocalDate; import org.springframework.jdbc.core.RowMapper; import org.springframework.samples.petclinic.model.Visit; @@ -35,7 +35,7 @@ class JdbcVisitRowMapper implements RowMapper { Visit visit = new Visit(); visit.setId(rs.getInt("visit_id")); Date visitDate = rs.getDate("visit_date"); - visit.setDate(new DateTime(visitDate)); + visit.setDate(new LocalDate(visitDate)); visit.setDescription(rs.getString("description")); return visit; } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/package-info.java b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/package-info.java index edd0bf855..376da279f 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/package-info.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/package-info.java @@ -1,9 +1,6 @@ - /** - * * The classes in this package represent the JDBC implementation * of PetClinic's persistence layer. - * */ package org.springframework.samples.petclinic.repository.jdbc; diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaOwnerRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaOwnerRepositoryImpl.java index c7398df5b..3972dd349 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaOwnerRepositoryImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaOwnerRepositoryImpl.java @@ -43,7 +43,7 @@ public class JpaOwnerRepositoryImpl implements OwnerRepository { /** - * Important: in the current version of this method, we load Owners with all their Pets and Visits while + * Important: in the current version of this method, we load Owners with all their Pets and Visits while * we do not need Visits at all and we only need one property from the Pet objects (the 'name' property). * There are some ways to improve it such as: * - creating a Ligtweight class (example here: https://community.jboss.org/wiki/LightweightClass) @@ -70,12 +70,11 @@ public class JpaOwnerRepositoryImpl implements OwnerRepository { @Override public void save(Owner owner) { - if (owner.getId() == null) { - this.em.persist(owner); - } - else { - this.em.merge(owner); - } + if (owner.getId() == null) { + this.em.persist(owner); + } else { + this.em.merge(owner); + } } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaPetRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaPetRepositoryImpl.java index 84d564da4..227140d96 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaPetRepositoryImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaPetRepositoryImpl.java @@ -53,12 +53,11 @@ public class JpaPetRepositoryImpl implements PetRepository { @Override public void save(Pet pet) { - if (pet.getId() == null) { - this.em.persist(pet); - } - else { - this.em.merge(pet); - } + if (pet.getId() == null) { + this.em.persist(pet); + } else { + this.em.merge(pet); + } } } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaVisitRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaVisitRepositoryImpl.java index 3415def96..16a9b3536 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaVisitRepositoryImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaVisitRepositoryImpl.java @@ -45,19 +45,18 @@ public class JpaVisitRepositoryImpl implements VisitRepository { @Override public void save(Visit visit) { - if (visit.getId() == null) { - this.em.persist(visit); - } - else { - this.em.merge(visit); - } + if (visit.getId() == null) { + this.em.persist(visit); + } else { + this.em.merge(visit); + } } @Override @SuppressWarnings("unchecked") public List findByPetId(Integer petId) { - Query query = this.em.createQuery("SELECT visit FROM Visit v where v.pets.id= :id"); + Query query = this.em.createQuery("SELECT v FROM Visit v where v.pet.id= :id"); query.setParameter("id", petId); return query.getResultList(); } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jpa/package-info.java b/src/main/java/org/springframework/samples/petclinic/repository/jpa/package-info.java index 13c8552ed..087dc15b6 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jpa/package-info.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jpa/package-info.java @@ -1,9 +1,6 @@ - /** - * * The classes in this package represent the JPA implementation * of PetClinic's persistence layer. - * */ package org.springframework.samples.petclinic.repository.jpa; diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataOwnerRepository.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataOwnerRepository.java index ca1f709f6..24c573eb7 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataOwnerRepository.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataOwnerRepository.java @@ -30,12 +30,12 @@ import org.springframework.samples.petclinic.repository.OwnerRepository; * @since 15.1.2013 */ public interface SpringDataOwnerRepository extends OwnerRepository, Repository { - - @Override - @Query("SELECT DISTINCT owner FROM Owner owner left join fetch owner.pets WHERE owner.lastName LIKE :lastName%") - public Collection findByLastName(@Param("lastName") String lastName); - - @Override - @Query("SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.id =:id") - public Owner findById(@Param("id") int id); + + @Override + @Query("SELECT DISTINCT owner FROM Owner owner left join fetch owner.pets WHERE owner.lastName LIKE :lastName%") + public Collection findByLastName(@Param("lastName") String lastName); + + @Override + @Query("SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.id =:id") + public Owner findById(@Param("id") int id); } diff --git a/src/main/java/org/springframework/samples/petclinic/service/ClinicService.java b/src/main/java/org/springframework/samples/petclinic/service/ClinicService.java index 936582129..44b5ed97d 100644 --- a/src/main/java/org/springframework/samples/petclinic/service/ClinicService.java +++ b/src/main/java/org/springframework/samples/petclinic/service/ClinicService.java @@ -48,4 +48,6 @@ public interface ClinicService { Collection findOwnerByLastName(String lastName) throws DataAccessException; + Collection findVisitsByPetId(int petId); + } diff --git a/src/main/java/org/springframework/samples/petclinic/service/ClinicServiceImpl.java b/src/main/java/org/springframework/samples/petclinic/service/ClinicServiceImpl.java index 0d7ff4d0c..4c2360e66 100644 --- a/src/main/java/org/springframework/samples/petclinic/service/ClinicServiceImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/service/ClinicServiceImpl.java @@ -105,5 +105,10 @@ public class ClinicServiceImpl implements ClinicService { return vetRepository.findAll(); } + @Override + public Collection findVisitsByPetId(int petId) { + return visitRepository.findByPetId(petId); + } + } diff --git a/src/main/java/org/springframework/samples/petclinic/util/CallMonitoringAspect.java b/src/main/java/org/springframework/samples/petclinic/util/CallMonitoringAspect.java index 3c699842f..fddf17dfa 100644 --- a/src/main/java/org/springframework/samples/petclinic/util/CallMonitoringAspect.java +++ b/src/main/java/org/springframework/samples/petclinic/util/CallMonitoringAspect.java @@ -26,6 +26,8 @@ import org.springframework.util.StopWatch; /** * Simple aspect that monitors call count and call invocation time. It uses JMX annotations and therefore can be * monitored using any JMX console such as the jConsole + *

+ * This is only useful if you use JPA or JDBC. Spring-data-jpa doesn't have any correctly annotated classes to join on * * @author Rob Harrop * @author Juergen Hoeller @@ -42,17 +44,16 @@ public class CallMonitoringAspect { private long accumulatedCallTime = 0; - - @ManagedAttribute - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - @ManagedAttribute public boolean isEnabled() { return enabled; } + @ManagedAttribute + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + @ManagedOperation public void reset() { this.callCount = 0; @@ -66,10 +67,10 @@ public class CallMonitoringAspect { @ManagedAttribute public long getCallTime() { - if (this.callCount > 0) - return this.accumulatedCallTime / this.callCount; - else - return 0; + if (this.callCount > 0) + return this.accumulatedCallTime / this.callCount; + else + return 0; } diff --git a/src/main/java/org/springframework/samples/petclinic/util/EntityUtils.java b/src/main/java/org/springframework/samples/petclinic/util/EntityUtils.java index 41486a5a7..eee390694 100644 --- a/src/main/java/org/springframework/samples/petclinic/util/EntityUtils.java +++ b/src/main/java/org/springframework/samples/petclinic/util/EntityUtils.java @@ -39,11 +39,10 @@ public abstract class EntityUtils { * @param entityClass the entity class to look up * @param entityId the entity id to look up * @return the found entity - * @throws ObjectRetrievalFailureException - * if the entity was not found + * @throws ObjectRetrievalFailureException if the entity was not found */ public static T getById(Collection entities, Class entityClass, int entityId) - throws ObjectRetrievalFailureException { + throws ObjectRetrievalFailureException { for (T entity : entities) { if (entity.getId() == entityId && entityClass.isInstance(entity)) { return entity; diff --git a/src/main/java/org/springframework/samples/petclinic/web/CrashController.java b/src/main/java/org/springframework/samples/petclinic/web/CrashController.java index e413f3f3b..29c55c1c0 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/CrashController.java +++ b/src/main/java/org/springframework/samples/petclinic/web/CrashController.java @@ -33,7 +33,7 @@ public class CrashController { @RequestMapping(value = "/oups", method = RequestMethod.GET) public String triggerException() { throw new RuntimeException("Expected: controller used to showcase what " + - "happens when an exception is thrown"); + "happens when an exception is thrown"); } diff --git a/src/main/java/org/springframework/samples/petclinic/web/OwnerController.java b/src/main/java/org/springframework/samples/petclinic/web/OwnerController.java index ecbbce559..dfc8d0b74 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/OwnerController.java +++ b/src/main/java/org/springframework/samples/petclinic/web/OwnerController.java @@ -31,8 +31,6 @@ import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.SessionAttributes; -import org.springframework.web.bind.support.SessionStatus; import org.springframework.web.servlet.ModelAndView; /** @@ -42,9 +40,9 @@ import org.springframework.web.servlet.ModelAndView; * @author Michael Isvy */ @Controller -@SessionAttributes(types = Owner.class) public class OwnerController { + private static final String VIEWS_OWNER_CREATE_OR_UPDATE_FORM = "owners/createOrUpdateOwnerForm"; private final ClinicService clinicService; @@ -62,16 +60,15 @@ public class OwnerController { public String initCreationForm(Map model) { Owner owner = new Owner(); model.put("owner", owner); - return "owners/createOrUpdateOwnerForm"; + return VIEWS_OWNER_CREATE_OR_UPDATE_FORM; } @RequestMapping(value = "/owners/new", method = RequestMethod.POST) - public String processCreationForm(@Valid Owner owner, BindingResult result, SessionStatus status) { + public String processCreationForm(@Valid Owner owner, BindingResult result) { if (result.hasErrors()) { - return "owners/createOrUpdateOwnerForm"; + return VIEWS_OWNER_CREATE_OR_UPDATE_FORM; } else { this.clinicService.saveOwner(owner); - status.setComplete(); return "redirect:/owners/" + owner.getId(); } } @@ -96,33 +93,31 @@ public class OwnerController { // no owners found result.rejectValue("lastName", "notFound", "not found"); return "owners/findOwners"; - } - else if (results.size() == 1) { - // 1 owner found - owner = results.iterator().next(); - return "redirect:/owners/" + owner.getId(); - } - else { + } else if (results.size() == 1) { + // 1 owner found + owner = results.iterator().next(); + return "redirect:/owners/" + owner.getId(); + } else { // multiple owners found model.put("selections", results); return "owners/ownersList"; } } - + @RequestMapping(value = "/owners/{ownerId}/edit", method = RequestMethod.GET) public String initUpdateOwnerForm(@PathVariable("ownerId") int ownerId, Model model) { Owner owner = this.clinicService.findOwnerById(ownerId); model.addAttribute(owner); - return "owners/createOrUpdateOwnerForm"; + return VIEWS_OWNER_CREATE_OR_UPDATE_FORM; } - @RequestMapping(value = "/owners/{ownerId}/edit", method = RequestMethod.PUT) - public String processUpdateOwnerForm(@Valid Owner owner, BindingResult result, SessionStatus status) { + @RequestMapping(value = "/owners/{ownerId}/edit", method = RequestMethod.POST) + public String processUpdateOwnerForm(@Valid Owner owner, BindingResult result, @PathVariable("ownerId") int ownerId) { if (result.hasErrors()) { - return "owners/createOrUpdateOwnerForm"; + return VIEWS_OWNER_CREATE_OR_UPDATE_FORM; } else { + owner.setId(ownerId); this.clinicService.saveOwner(owner); - status.setComplete(); return "redirect:/owners/{ownerId}"; } } diff --git a/src/main/java/org/springframework/samples/petclinic/web/PetController.java b/src/main/java/org/springframework/samples/petclinic/web/PetController.java index bf823023e..6e2a59b9f 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/PetController.java +++ b/src/main/java/org/springframework/samples/petclinic/web/PetController.java @@ -15,39 +15,34 @@ */ package org.springframework.samples.petclinic.web; -import java.util.Collection; -import java.util.Map; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.samples.petclinic.model.Owner; import org.springframework.samples.petclinic.model.Pet; import org.springframework.samples.petclinic.model.PetType; import org.springframework.samples.petclinic.service.ClinicService; import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.util.StringUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.WebDataBinder; -import org.springframework.web.bind.annotation.InitBinder; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.SessionAttributes; -import org.springframework.web.bind.support.SessionStatus; +import org.springframework.web.bind.annotation.*; import javax.validation.Valid; +import java.util.Collection; + /** * @author Juergen Hoeller * @author Ken Krebs * @author Arjen Poutsma */ @Controller -@SessionAttributes("pet") +@RequestMapping("/owners/{ownerId}") public class PetController { + private static final String VIEWS_PETS_CREATE_OR_UPDATE_FORM = "pets/createOrUpdatePetForm"; private final ClinicService clinicService; - @Autowired public PetController(ClinicService clinicService) { this.clinicService = clinicService; @@ -58,46 +53,59 @@ public class PetController { return this.clinicService.findPetTypes(); } - @InitBinder - public void initBinder(WebDataBinder dataBinder) { + @ModelAttribute("owner") + public Owner findOwner(@PathVariable("ownerId") int ownerId) { + return this.clinicService.findOwnerById(ownerId); + } + + @InitBinder("owner") + public void initOwnerBinder(WebDataBinder dataBinder) { dataBinder.setDisallowedFields("id"); + } + + @InitBinder("pet") + public void initPetBinder(WebDataBinder dataBinder) { dataBinder.setValidator(new PetValidator()); } - @RequestMapping(value = "/owners/{ownerId}/pets/new", method = RequestMethod.GET) - public String initCreationForm(@PathVariable("ownerId") int ownerId, Map model) { - Owner owner = this.clinicService.findOwnerById(ownerId); + @RequestMapping(value = "/pets/new", method = RequestMethod.GET) + public String initCreationForm(Owner owner, ModelMap model) { Pet pet = new Pet(); owner.addPet(pet); model.put("pet", pet); - return "pets/createOrUpdatePetForm"; + return VIEWS_PETS_CREATE_OR_UPDATE_FORM; } - @RequestMapping(value = "/owners/{ownerId}/pets/new", method = RequestMethod.POST) - public String processCreationForm(@Valid Pet pet, BindingResult result, SessionStatus status) { + @RequestMapping(value = "/pets/new", method = RequestMethod.POST) + public String processCreationForm(Owner owner, @Valid Pet pet, BindingResult result, ModelMap model) { + if (StringUtils.hasLength(pet.getName()) && pet.isNew() && owner.getPet(pet.getName(), true) != null){ + result.rejectValue("name", "duplicate", "already exists"); + } if (result.hasErrors()) { - return "pets/createOrUpdatePetForm"; + model.put("pet", pet); + return VIEWS_PETS_CREATE_OR_UPDATE_FORM; } else { + owner.addPet(pet); this.clinicService.savePet(pet); - status.setComplete(); return "redirect:/owners/{ownerId}"; } } - @RequestMapping(value = "/owners/*/pets/{petId}/edit", method = RequestMethod.GET) - public String initUpdateForm(@PathVariable("petId") int petId, Map model) { + @RequestMapping(value = "/pets/{petId}/edit", method = RequestMethod.GET) + public String initUpdateForm(@PathVariable("petId") int petId, ModelMap model) { Pet pet = this.clinicService.findPetById(petId); model.put("pet", pet); - return "pets/createOrUpdatePetForm"; + return VIEWS_PETS_CREATE_OR_UPDATE_FORM; } - @RequestMapping(value = "/owners/{ownerId}/pets/{petId}/edit", method = {RequestMethod.PUT, RequestMethod.POST}) - public String processUpdateForm(@Valid Pet pet, BindingResult result, SessionStatus status) { + @RequestMapping(value = "/pets/{petId}/edit", method = RequestMethod.POST) + public String processUpdateForm(@Valid Pet pet, BindingResult result, Owner owner, ModelMap model) { if (result.hasErrors()) { - return "pets/createOrUpdatePetForm"; + model.put("pet", pet); + return VIEWS_PETS_CREATE_OR_UPDATE_FORM; } else { + owner.addPet(pet); this.clinicService.savePet(pet); - status.setComplete(); return "redirect:/owners/{ownerId}"; } } diff --git a/src/main/java/org/springframework/samples/petclinic/web/PetValidator.java b/src/main/java/org/springframework/samples/petclinic/web/PetValidator.java index 0621c98ab..3c04793b9 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/PetValidator.java +++ b/src/main/java/org/springframework/samples/petclinic/web/PetValidator.java @@ -31,25 +31,25 @@ import org.springframework.validation.Validator; */ public class PetValidator implements Validator { + private static final String REQUIRED = "required"; + @Override public void validate(Object obj, Errors errors) { Pet pet = (Pet) obj; String name = pet.getName(); // name validation if (!StringUtils.hasLength(name)) { - errors.rejectValue("name", "required", "required"); - } else if (pet.isNew() && pet.getOwner().getPet(name, true) != null) { - errors.rejectValue("name", "duplicate", "already exists"); + errors.rejectValue("name", REQUIRED, REQUIRED); } - + // type validation if (pet.isNew() && pet.getType() == null) { - errors.rejectValue("type", "required", "required"); + errors.rejectValue("type", REQUIRED, REQUIRED); } - + // birth date validation - if (pet.getBirthDate()==null) { - errors.rejectValue("birthDate", "required", "required"); + if (pet.getBirthDate() == null) { + errors.rejectValue("birthDate", REQUIRED, REQUIRED); } } @@ -58,7 +58,7 @@ public class PetValidator implements Validator { */ @Override public boolean supports(Class clazz) { - return Pet.class.equals(clazz); + return Pet.class.isAssignableFrom(clazz); } diff --git a/src/main/java/org/springframework/samples/petclinic/web/VetController.java b/src/main/java/org/springframework/samples/petclinic/web/VetController.java index ebbb8d6e2..45e650ff1 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/VetController.java +++ b/src/main/java/org/springframework/samples/petclinic/web/VetController.java @@ -41,19 +41,21 @@ public class VetController { this.clinicService = clinicService; } - @RequestMapping(value={"/vets.xml","/vets.html"}) + @RequestMapping(value = { "/vets.html"}) public String showVetList(Map model) { - // Here we are returning an object of type 'Vets' rather than a collection of Vet objects + // Here we are returning an object of type 'Vets' rather than a collection of Vet objects // so it is simpler for Object-Xml mapping Vets vets = new Vets(); vets.getVetList().addAll(this.clinicService.findVets()); model.put("vets", vets); return "vets/vetList"; } - - @RequestMapping("/vets.json") - public @ResponseBody Vets showResourcesVetList() { - // Here we are returning an object of type 'Vets' rather than a collection of Vet objects + + @RequestMapping(value = { "/vets.json", "/vets.xml"}) + public + @ResponseBody + Vets showResourcesVetList() { + // Here we are returning an object of type 'Vets' rather than a collection of Vet objects // so it is simpler for JSon/Object mapping Vets vets = new Vets(); vets.getVetList().addAll(this.clinicService.findVets()); diff --git a/src/main/java/org/springframework/samples/petclinic/web/VisitController.java b/src/main/java/org/springframework/samples/petclinic/web/VisitController.java index f3f6f3ffb..144eba2d9 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/VisitController.java +++ b/src/main/java/org/springframework/samples/petclinic/web/VisitController.java @@ -53,13 +53,14 @@ public class VisitController { public void setAllowedFields(WebDataBinder dataBinder) { dataBinder.setDisallowedFields("id"); } - + /** - * Called before each and every @RequestMapping annotated method. - * 2 goals: - * - Make sure we always have fresh data - * - Since we do not use the session scope, make sure that Pet object always has an id - * (Even though id is not part of the form fields) + * Called before each and every @RequestMapping annotated method. + * 2 goals: + * - Make sure we always have fresh data + * - Since we do not use the session scope, make sure that Pet object always has an id + * (Even though id is not part of the form fields) + * * @param petId * @return Pet */ @@ -67,17 +68,17 @@ public class VisitController { public Visit loadPetWithVisit(@PathVariable("petId") int petId) { Pet pet = this.clinicService.findPetById(petId); Visit visit = new Visit(); - pet.addVisit(visit); + pet.addVisit(visit); return visit; } - // Spring MVC calls method loadPetWithVisit(...) before initNewVisitForm is called + // Spring MVC calls method loadPetWithVisit(...) before initNewVisitForm is called @RequestMapping(value = "/owners/*/pets/{petId}/visits/new", method = RequestMethod.GET) public String initNewVisitForm(@PathVariable("petId") int petId, Map model) { return "pets/createOrUpdateVisitForm"; } - // Spring MVC calls method loadPetWithVisit(...) before processNewVisitForm is called + // Spring MVC calls method loadPetWithVisit(...) before processNewVisitForm is called @RequestMapping(value = "/owners/{ownerId}/pets/{petId}/visits/new", method = RequestMethod.POST) public String processNewVisitForm(@Valid Visit visit, BindingResult result) { if (result.hasErrors()) { diff --git a/src/main/java/org/springframework/samples/petclinic/web/package-info.java b/src/main/java/org/springframework/samples/petclinic/web/package-info.java index c909ccf7f..ca189f19a 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/package-info.java +++ b/src/main/java/org/springframework/samples/petclinic/web/package-info.java @@ -1,8 +1,5 @@ - /** - * * The classes in this package represent PetClinic's web presentation layer. - * */ package org.springframework.samples.petclinic.web; diff --git a/src/main/java/overview.html b/src/main/java/overview.html deleted file mode 100644 index df4f4d6b7..000000000 --- a/src/main/java/overview.html +++ /dev/null @@ -1,7 +0,0 @@ - - -

- The Spring Data Binding framework, an internal library used by Spring Web Flow. -

- - \ No newline at end of file diff --git a/src/main/java/test.html b/src/main/java/test.html deleted file mode 100644 index 9a7a99675..000000000 --- a/src/main/java/test.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - -

Organisation

- -

Speakers

- - - - - - - - - -
- Sergiu Bodiu -

Sergiu Bodiu

-

Java Consultant at Bank of America

- Seasoned consultant experienced in large-scale e-commerce projects, passionate about providing innovative technology solutions to solve complex business problems, have extensive knowledge and experience delivering enterprise wide applications. He is skilled in software design, data modeling, stakeholder management, IT strategic planning, technical know-how and security. Able to design, implement, test and maintain software product components with strong focus on design elegance and software reuse. -
- Sergiu Bodiu -

Sergiu Bodiu

-

Java Consultant at Bank of America

- Seasoned consultant experienced in large-scale e-commerce projects, passionate about providing innovative technology solutions to solve complex business problems, have extensive knowledge and experience delivering enterprise wide applications. He is skilled in software design, data modeling, stakeholder management, IT strategic planning, technical know-how and security. Able to design, implement, test and maintain software product components with strong focus on design elegance and software reuse. -
diff --git a/src/main/resources/db/hsqldb/initDB.sql b/src/main/resources/db/hsqldb/initDB.sql index a16c42dec..f3c6947b7 100644 --- a/src/main/resources/db/hsqldb/initDB.sql +++ b/src/main/resources/db/hsqldb/initDB.sql @@ -36,7 +36,7 @@ CREATE INDEX types_name ON types (name); CREATE TABLE owners ( id INTEGER IDENTITY PRIMARY KEY, first_name VARCHAR(30), - last_name VARCHAR(30), + last_name VARCHAR_IGNORECASE(30), address VARCHAR(255), city VARCHAR(80), telephone VARCHAR(20) diff --git a/src/main/resources/db/mysql/initDB.sql b/src/main/resources/db/mysql/initDB.sql index b90d1843a..6a9825983 100644 --- a/src/main/resources/db/mysql/initDB.sql +++ b/src/main/resources/db/mysql/initDB.sql @@ -1,4 +1,9 @@ CREATE DATABASE IF NOT EXISTS petclinic; + +ALTER DATABASE petclinic + DEFAULT CHARACTER SET utf8 + DEFAULT COLLATE utf8_general_ci; + GRANT ALL PRIVILEGES ON petclinic.* TO pc@localhost IDENTIFIED BY 'pc'; USE petclinic; @@ -57,4 +62,4 @@ CREATE TABLE IF NOT EXISTS visits ( visit_date DATE, description VARCHAR(255), FOREIGN KEY (pet_id) REFERENCES pets(id) -) engine=InnoDB; \ No newline at end of file +) engine=InnoDB; diff --git a/src/main/resources/db/mysql/petclinic_db_setup_mysql.txt b/src/main/resources/db/mysql/petclinic_db_setup_mysql.txt index 765711ea9..251562ebc 100644 --- a/src/main/resources/db/mysql/petclinic_db_setup_mysql.txt +++ b/src/main/resources/db/mysql/petclinic_db_setup_mysql.txt @@ -16,7 +16,7 @@ the db/mysql directory. Alternatively, uncomment the mysql-connector from the Petclinic pom. -3) Create the PetClinic database and user by executing the "db/mysql/createDB.txt" +3) Create the PetClinic database and user by executing the "db/mysql/initDB.sql" script. 4) Open "src/main/resources/spring/data-access.properties"; comment out all properties in the diff --git a/src/main/resources/db_readme.txt b/src/main/resources/db_readme.txt deleted file mode 100644 index 68e3f245c..000000000 --- a/src/main/resources/db_readme.txt +++ /dev/null @@ -1,13 +0,0 @@ -================================================================================ -=== Spring PetClinic sample application - Database Configuration === -================================================================================ - -@author Costin Leau - --------------------------------------------------------------------------------- - -In its default configuration, Petclinic uses an in-memory database (HSQLDB) which -gets populated at startup with data. A similar setup is provided for Mysql in case -a persistent database configuration is needed. -Note that whenever the database type is changed, the data-access.properties file needs to -be updated. diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 830ef37de..54bfd5f2d 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -6,19 +6,16 @@ true - - - - + %-5level %logger{0} - %msg%n - + - + diff --git a/src/main/webapp/WEB-INF/jsp/exception.jsp b/src/main/webapp/WEB-INF/jsp/exception.jsp index 876fb04a3..d030d595d 100644 --- a/src/main/webapp/WEB-INF/jsp/exception.jsp +++ b/src/main/webapp/WEB-INF/jsp/exception.jsp @@ -1,14 +1,9 @@ - - +<%@ page session="false" trimDirectiveWhitespaces="true" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="petclinic" tagdir="/WEB-INF/tags" %> - - + - -
- @@ -16,16 +11,4 @@

${exception.message}

- - - - - -
- - - +
diff --git a/src/main/webapp/WEB-INF/jsp/fragments/bodyHeader.jsp b/src/main/webapp/WEB-INF/jsp/fragments/bodyHeader.jsp deleted file mode 100644 index 207a5b727..000000000 --- a/src/main/webapp/WEB-INF/jsp/fragments/bodyHeader.jsp +++ /dev/null @@ -1,22 +0,0 @@ -<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> -<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> - - - - - - diff --git a/src/main/webapp/WEB-INF/jsp/fragments/footer.jsp b/src/main/webapp/WEB-INF/jsp/fragments/footer.jsp deleted file mode 100644 index c9992c782..000000000 --- a/src/main/webapp/WEB-INF/jsp/fragments/footer.jsp +++ /dev/null @@ -1,11 +0,0 @@ -<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> - - - - - - - - - diff --git a/src/main/webapp/WEB-INF/jsp/fragments/staticFiles.jsp b/src/main/webapp/WEB-INF/jsp/fragments/staticFiles.jsp deleted file mode 100644 index f1eea21e6..000000000 --- a/src/main/webapp/WEB-INF/jsp/fragments/staticFiles.jsp +++ /dev/null @@ -1,33 +0,0 @@ -<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> - - - - - - PetClinic :: a Spring Framework demonstration - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/webapp/WEB-INF/jsp/owners/createOrUpdateOwnerForm.jsp b/src/main/webapp/WEB-INF/jsp/owners/createOrUpdateOwnerForm.jsp index 0479f0bde..d7e9e1ab9 100644 --- a/src/main/webapp/WEB-INF/jsp/owners/createOrUpdateOwnerForm.jsp +++ b/src/main/webapp/WEB-INF/jsp/owners/createOrUpdateOwnerForm.jsp @@ -1,5 +1,4 @@ - - +<%@ page session="false" trimDirectiveWhitespaces="true" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> @@ -7,42 +6,29 @@ <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="petclinic" tagdir="/WEB-INF/tags" %> - - - - - - -
- - - - - - +

New Owner

- - - - - - - -
- - - - - - - - + +
+ + + + + +
+
+
+ + + + + + + + +
-
- - - - +
diff --git a/src/main/webapp/WEB-INF/jsp/owners/findOwners.jsp b/src/main/webapp/WEB-INF/jsp/owners/findOwners.jsp index 91d2ebabc..f9a3e54a2 100644 --- a/src/main/webapp/WEB-INF/jsp/owners/findOwners.jsp +++ b/src/main/webapp/WEB-INF/jsp/owners/findOwners.jsp @@ -1,41 +1,34 @@ - - +<%@ page session="false" trimDirectiveWhitespaces="true" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="petclinic" tagdir="/WEB-INF/tags" %> - - - - - -
- +

Find Owners

-
+
- - - + +
+ + +
-
- +
+
+
+
-
+
+
- Add Owner - - - -
- - - + Add Owner + diff --git a/src/main/webapp/WEB-INF/jsp/owners/ownerDetails.jsp b/src/main/webapp/WEB-INF/jsp/owners/ownerDetails.jsp index 4ace4ba23..7ca50f673 100644 --- a/src/main/webapp/WEB-INF/jsp/owners/ownerDetails.jsp +++ b/src/main/webapp/WEB-INF/jsp/owners/ownerDetails.jsp @@ -1,22 +1,17 @@ - - +<%@ page session="false" trimDirectiveWhitespaces="true" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="joda" uri="http://www.joda.org/joda/time/tags" %> +<%@ taglib prefix="petclinic" tagdir="/WEB-INF/tags" %> - - - - - -
- +

Owner Information

- + +
@@ -33,26 +28,28 @@ - - - -
Name Telephone
- - - - Edit Owner - - - - Add New Pet
+ + + + Edit Owner + + + + + Add New Pet + +
+
+

Pets and Visits

- - +
+ + - - - + +
+
Name
@@ -77,31 +74,26 @@
- - - - - Edit Pet - - - - - - Add Visit + + + + + Edit Pet
+ + + + + Add Visit +
- -
- + + -
- - - - + diff --git a/src/main/webapp/WEB-INF/jsp/owners/ownersList.jsp b/src/main/webapp/WEB-INF/jsp/owners/ownersList.jsp index 5e8eaaaaa..2f862488f 100644 --- a/src/main/webapp/WEB-INF/jsp/owners/ownersList.jsp +++ b/src/main/webapp/WEB-INF/jsp/owners/ownersList.jsp @@ -1,21 +1,15 @@ - - +<%@ page session="false" trimDirectiveWhitespaces="true" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <%@ taglib prefix="datatables" uri="http://github.com/dandelion/datatables" %> +<%@ taglib prefix="petclinic" tagdir="/WEB-INF/tags" %> - - - - - -
- +

Owners

- - @@ -34,12 +28,6 @@ - + - - - -
- - - + diff --git a/src/main/webapp/WEB-INF/jsp/pets/createOrUpdatePetForm.jsp b/src/main/webapp/WEB-INF/jsp/pets/createOrUpdatePetForm.jsp index c41f02ddf..8a0b34a30 100644 --- a/src/main/webapp/WEB-INF/jsp/pets/createOrUpdatePetForm.jsp +++ b/src/main/webapp/WEB-INF/jsp/pets/createOrUpdatePetForm.jsp @@ -1,64 +1,51 @@ - - +<%@ page session="false" trimDirectiveWhitespaces="true" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="petclinic" tagdir="/WEB-INF/tags" %> - - - - - - - -
- - - - - - - - - - -

- New - Pet -

- - -
- - - -
- - -
- -
-
- - - - - - - - -
-
- - - -
- - - + + + + + +

+ New Pet +

+ + +
+
+ +
+ +
+
+ + +
+ +
+
+
+
+ + + + + + + + +
+
+
+ + +
+
diff --git a/src/main/webapp/WEB-INF/jsp/pets/createOrUpdateVisitForm.jsp b/src/main/webapp/WEB-INF/jsp/pets/createOrUpdateVisitForm.jsp index 501a0d48e..df70223c0 100644 --- a/src/main/webapp/WEB-INF/jsp/pets/createOrUpdateVisitForm.jsp +++ b/src/main/webapp/WEB-INF/jsp/pets/createOrUpdateVisitForm.jsp @@ -1,5 +1,4 @@ - - +<%@ page session="false" trimDirectiveWhitespaces="true" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> @@ -8,69 +7,65 @@ <%@ taglib prefix="petclinic" tagdir="/WEB-INF/tags" %> - + + + + + +

New Visit

- + Pet + + + + + + + + + + + + + + + +
NameBirth DateTypeOwner
+ +
+ + +
- - -
- -

New Visit

+
+
+ + +
+
+ - Pet - - - - - - - - - - - - - - - -
NameBirth DateTypeOwner
+
+ Previous Visits + + + + + + + + + + + + + +
DateDescription
+ - - - - - -
- - -
-
- -
- Previous Visits - - - - - - - - - - - - - -
DateDescription
- -
- - - - +
diff --git a/src/main/webapp/WEB-INF/jsp/vets/vetList.jsp b/src/main/webapp/WEB-INF/jsp/vets/vetList.jsp index 040679c28..d8e48e853 100644 --- a/src/main/webapp/WEB-INF/jsp/vets/vetList.jsp +++ b/src/main/webapp/WEB-INF/jsp/vets/vetList.jsp @@ -1,24 +1,17 @@ - - +<%@ page session="false" trimDirectiveWhitespaces="true" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="datatables" uri="http://github.com/dandelion/datatables" %> +<%@ taglib prefix="petclinic" tagdir="/WEB-INF/tags" %> - - - - - - -
- - +

Veterinarians

- + - + @@ -27,20 +20,15 @@ none - +
">View as XML - ">View as JSon + ">View as JSON
- - -
- - - + diff --git a/src/main/webapp/WEB-INF/jsp/welcome.jsp b/src/main/webapp/WEB-INF/jsp/welcome.jsp index f33b84e55..b801ec67d 100644 --- a/src/main/webapp/WEB-INF/jsp/welcome.jsp +++ b/src/main/webapp/WEB-INF/jsp/welcome.jsp @@ -1,23 +1,14 @@ - - +<%@ page session="false" trimDirectiveWhitespaces="true" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="petclinic" tagdir="/WEB-INF/tags" %> - - - - - - -
- +

- - - - - -
- - - +
+
+ + +
+
+ diff --git a/src/main/webapp/WEB-INF/tags/bodyHeader.tag b/src/main/webapp/WEB-INF/tags/bodyHeader.tag new file mode 100644 index 000000000..cd14d874c --- /dev/null +++ b/src/main/webapp/WEB-INF/tags/bodyHeader.tag @@ -0,0 +1,7 @@ +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> +<%@ taglib prefix="petclinic" tagdir="/WEB-INF/tags" %> + +<%@ attribute name="menuName" required="true" rtexprvalue="true" + description="Name of the active menu: home, owners, vets or error" %> + + diff --git a/src/main/webapp/WEB-INF/tags/footer.tag b/src/main/webapp/WEB-INF/tags/footer.tag new file mode 100644 index 000000000..6029efb58 --- /dev/null +++ b/src/main/webapp/WEB-INF/tags/footer.tag @@ -0,0 +1,18 @@ +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> + +<%-- Placed at the end of the document so the pages load faster --%> + + + +<%-- jquery-ui.js file is really big so we only load what we need instead of loading everything --%> + + + + + + + +<%-- Bootstrap --%> + + + diff --git a/src/main/webapp/WEB-INF/tags/htmlHeader.tag b/src/main/webapp/WEB-INF/tags/htmlHeader.tag new file mode 100644 index 000000000..a51e56dac --- /dev/null +++ b/src/main/webapp/WEB-INF/tags/htmlHeader.tag @@ -0,0 +1,37 @@ +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> + +<%-- +PetClinic :: a Spring Framework demonstration +--%> + + + + + + + <%-- The above 4 meta tags *must* come first in the head; any other head content must come *after* these tags --%> + + + + + PetClinic :: a Spring Framework demonstration + + <%-- CSS generated from LESS --%> + + + + + <%-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries --%> + + + + + + + + + + diff --git a/src/main/webapp/WEB-INF/tags/inputField.tag b/src/main/webapp/WEB-INF/tags/inputField.tag index 796dc91c0..0db10f39d 100644 --- a/src/main/webapp/WEB-INF/tags/inputField.tag +++ b/src/main/webapp/WEB-INF/tags/inputField.tag @@ -7,13 +7,20 @@ description="Label appears in red color if input is considered as invalid after submission" %> - + +
- + -
- - ${status.errorMessage} +
+ + + + + + + ${status.errorMessage} +
- \ No newline at end of file + diff --git a/src/main/webapp/WEB-INF/tags/layout.tag b/src/main/webapp/WEB-INF/tags/layout.tag new file mode 100644 index 000000000..870c735b2 --- /dev/null +++ b/src/main/webapp/WEB-INF/tags/layout.tag @@ -0,0 +1,27 @@ +<%@ tag trimDirectiveWhitespaces="true" %> +<%@ taglib prefix="petclinic" tagdir="/WEB-INF/tags" %> + +<%@ attribute name="pageName" required="true" %> +<%@ attribute name="customScript" required="false" fragment="true"%> + + + + + + + + +
+
+ + + + +
+
+ + + + + + diff --git a/src/main/webapp/WEB-INF/tags/menu.tag b/src/main/webapp/WEB-INF/tags/menu.tag new file mode 100644 index 000000000..f7e8652b2 --- /dev/null +++ b/src/main/webapp/WEB-INF/tags/menu.tag @@ -0,0 +1,45 @@ +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="petclinic" tagdir="/WEB-INF/tags" %> +<%@ attribute name="name" required="true" rtexprvalue="true" + description="Name of the active menu: home, owners, vets or error" %> + + diff --git a/src/main/webapp/WEB-INF/tags/menuItem.tag b/src/main/webapp/WEB-INF/tags/menuItem.tag new file mode 100644 index 000000000..8c14dbbc5 --- /dev/null +++ b/src/main/webapp/WEB-INF/tags/menuItem.tag @@ -0,0 +1,13 @@ +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + +<%@ attribute name="active" required="true" rtexprvalue="true" %> +<%@ attribute name="url" required="true" rtexprvalue="true" %> +<%@ attribute name="title" required="false" rtexprvalue="true" %> + +
  • + " + title="${fn:escapeXml(title)}"> + + +
  • diff --git a/src/main/webapp/WEB-INF/tags/pivotal.tag b/src/main/webapp/WEB-INF/tags/pivotal.tag new file mode 100644 index 000000000..8ee35fb1f --- /dev/null +++ b/src/main/webapp/WEB-INF/tags/pivotal.tag @@ -0,0 +1,10 @@ +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> + +
    +
    +
    +
    +
    " + alt="Sponsored by Pivotal"/>
    +
    +
    diff --git a/src/main/webapp/WEB-INF/tags/selectField.tag b/src/main/webapp/WEB-INF/tags/selectField.tag index f93256ac8..21fad89c3 100644 --- a/src/main/webapp/WEB-INF/tags/selectField.tag +++ b/src/main/webapp/WEB-INF/tags/selectField.tag @@ -11,13 +11,20 @@ description="Size of Select" %> - + +
    - + -
    - - ${status.errorMessage} +
    + + + + + + + ${status.errorMessage} +
    - \ No newline at end of file + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 9215aa2c5..27602966a 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -1,31 +1,33 @@ - Spring PetClinic Spring PetClinic sample application - + + spring.profiles.active jpa - - + + - - + + + + + - encodingFilter - org.springframework.web.filter.CharacterEncodingFilter - - encoding - UTF-8 - - - forceEncoding - true - - - - - encodingFilter - /* - - + encodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + forceEncoding + true + + + + + encodingFilter + /* + + dandelionFilter @@ -107,32 +109,19 @@ /* - + - httpMethodFilter - org.springframework.web.filter.HiddenHttpMethodFilter - - - - httpMethodFilter - petclinic - - - - datatables com.github.dandelion.datatables.core.web.filter.DatatablesFilter - - + + datatables /* - - + + - \ No newline at end of file + diff --git a/src/main/webapp/resources/css/petclinic.css b/src/main/webapp/resources/css/petclinic.css index 76a8ef83d..b8278d2c3 100644 --- a/src/main/webapp/resources/css/petclinic.css +++ b/src/main/webapp/resources/css/petclinic.css @@ -1,20 +1,5 @@ -.container { - padding-top: 10px; - width: 700px; -} - -.form-horizontal { - width: 100%; -} - -input[type="text"] { - height: 25px; -} - -.navbar .nav > li > a { - color: #000000; -} - -.form-horizontal .control-label { - text-align: left; -} +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../../vendors/bootstrap/dist/fonts/glyphicons-halflings-regular.eot');src:url('../../vendors/bootstrap/dist/fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../../vendors/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../../vendors/bootstrap/dist/fonts/glyphicons-halflings-regular.woff') format('woff'),url('../../vendors/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../../vendors/bootstrap/dist/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#34302d;background-color:#f1f1f1}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#5fa134;text-decoration:none}a:hover,a:focus{color:#5fa134;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:0}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#f1f1f1;border:1px solid #ddd;border-radius:0;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover,a.text-primary:focus{color:#286090}.text-success{color:#3c763d}a.text-success:hover,a.text-success:focus{color:#2b542c}.text-info{color:#31708f}a.text-info:hover,a.text-info:focus{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover,a.text-warning:focus{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover,a.text-danger:focus{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover,a.bg-primary:focus{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:0}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:0;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:0}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #34302d}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #34302d}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #34302d}.table .table{background-color:#f1f1f1}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #34302d}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #34302d}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #34302d}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:34px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:0}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:0}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:0}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:0}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#786f68}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#f1f1f1;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#f1f1f1;background-color:#34302d;border-color:#6db33f}.btn-default:focus,.btn-default.focus{color:#f1f1f1;background-color:#191715;border-color:#34551e}.btn-default:hover{color:#f1f1f1;background-color:#191715;border-color:#51862f}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#f1f1f1;background-color:#191715;border-color:#51862f}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#f1f1f1;background-color:#060505;border-color:#34551e}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus{background-color:#34302d;border-color:#6db33f}.btn-default .badge{color:#34302d;background-color:#f1f1f1}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#fff;background-color:#398439;border-color:#255625}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#5fa134;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#5fa134;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:0}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:0}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:0}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:0;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#337ab7}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:0}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:0}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:0}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:0}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:0}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#5fa134}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #34302d}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:0 0 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #34302d}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#f1f1f1;background-color:#34302d;border:1px solid #34302d;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:0 0 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#f1f1f1}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:0}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:0 0 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#f1f1f1}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:0}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:0}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#f1f1f1}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#d8d8d8;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#f1f1f1}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#f1f1f1;background-color:#6db33f}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#f1f1f1;background-color:#6db33f}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:transparent}.navbar-default .navbar-toggle .icon-bar{background-color:#f1f1f1}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#6db33f;color:#f1f1f1}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#f1f1f1}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#f1f1f1;background-color:#6db33f}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#f1f1f1;background-color:#6db33f}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#f1f1f1}.navbar-default .navbar-link:hover{color:#f1f1f1}.navbar-default .btn-link{color:#f1f1f1}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#f1f1f1}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:0}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:0}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#5fa134;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:0;border-top-left-radius:0}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:2;color:#5fa134;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:3;color:#fff;background-color:#34302d;border-color:#6db33f;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#5fa134;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:0;padding-left:15px;padding-right:15px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#f1f1f1;border:1px solid #ddd;border-radius:0;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#5fa134}.thumbnail .caption{padding:9px;color:#34302d}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:0}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:0;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eee;color:#777;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:-1;border-top-left-radius:-1}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:-1;border-top-left-radius:-1}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:-1;border-top-left-radius:-1}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:-1;border-top-right-radius:-1}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:-1}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:-1}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:-1;border-bottom-right-radius:-1}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:-1}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:-1}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #34302d}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:0}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:0}.well-sm{padding:9px;border-radius:0}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:0}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:14px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:0;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:-1 -1 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform 0.6s ease-in-out;-moz-transition:-moz-transform 0.6s ease-in-out;-o-transition:-o-transform 0.6s ease-in-out;transition:transform 0.6s ease-in-out;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;-moz-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);background-color:rgba(0,0,0,0)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-header:before,.modal-header:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-header:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}@font-face{font-family:'varela_roundregular';src:url('../fonts/varela_round-webfont.eot');src:url('../fonts/varela_round-webfont.eot?#iefix') format('embedded-opentype'),url('../fonts/varela_round-webfont.woff') format('woff'),url('../fonts/varela_round-webfont.ttf') format('truetype'),url('../fonts/varela_round-webfont.svg#varela_roundregular') format('svg');font-weight:normal;font-style:normal}@font-face{font-family:'montserratregular';src:url('../fonts/montserrat-webfont.eot');src:url('../fonts/montserrat-webfont.eot?#iefix') format('embedded-opentype'),url('../fonts/montserrat-webfont.woff') format('woff'),url('../fonts/montserrat-webfont.ttf') format('truetype'),url('../fonts/montserrat-webfont.svg#montserratregular') format('svg');font-weight:normal;font-style:normal}body,h1,h2,h3,p,input{margin:0;font-weight:400;font-family:"varela_roundregular",sans-serif;color:#34302d}h1{font-size:24px;line-height:30px;font-family:"montserratregular",sans-serif}h2{font-size:18px;font-weight:700;line-height:24px;margin-bottom:10px;font-family:"montserratregular",sans-serif}h3{font-size:16px;line-height:24px;margin-bottom:10px;font-weight:700}strong{font-weight:700;font-family:"montserratregular",sans-serif}.navbar{border-top:4px solid #6db33f;background-color:#34302d;margin-bottom:0;border-bottom:0;border-left:0;border-right:0}.navbar a.navbar-brand{background:url("../images/spring-logo-dataflow.png") -1px -1px no-repeat;margin:12px 0 6px;width:229px;height:46px;display:inline-block;text-decoration:none;padding:0}.navbar a.navbar-brand span{display:block;width:229px;height:46px;background:url("../images/spring-logo-dataflow.png") -1px -48px no-repeat;opacity:0;-moz-transition:opacity .12s ease-in-out;-webkit-transition:opacity .12s ease-in-out;-o-transition:opacity .12s ease-in-out}.navbar a:hover.navbar-brand span{opacity:1}.navbar li>a,.navbar-text{font-family:"montserratregular",sans-serif;text-shadow:none;font-size:14px;padding:28px 20px;transition:all .15s;-webkit-transition:all .15s;-moz-transition:all .15s;-o-transition:all .15s;-ms-transition:all .15s}.navbar li>a{text-transform:uppercase}.navbar .navbar-text{margin-top:0;margin-bottom:0}.navbar li:hover>a{color:#eee;background-color:#6db33f}.navbar-toggle{border-width:0}.navbar-toggle .icon-bar+.icon-bar{margin-top:3px}.navbar-toggle .icon-bar{width:19px;height:3px}.table>thead>tr>th{background-color:#3c3834;color:#f1f1f1}.table-filter{background-color:#34302d;padding:9px 12px}.nav>li>a{color:#838789}.btn-default{border-width:2px;transition:border .15s;-webkit-transition:border .15s;-moz-transition:border .15s;-o-transition:border .15s;-ms-transition:border .15s}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-color:#34302d;border-color:#34302d}.container .text-muted{margin:20px 0}code{font-size:80%}.xd-container{margin-top:40px;margin-bottom:100px;padding-left:5px;padding-right:5px}h1{margin-bottom:15px}.index-page--subtitle{font-size:16px;line-height:24px;margin:0 0 30px}.form-horizontal button.btn-inverse{margin-left:32px}#job-params-modal .modal-dialog{width:90%;margin-left:auto;margin-right:auto}[ng-cloak].splash{display:block !important}[ng-cloak]{display:none}.splash{background:#6db33f;color:#34302d;display:none}.error-page{margin-top:100px;text-align:center}.error-page .error-title{font-size:24px;line-height:24px;margin:30px 0 0}table td{vertical-align:middle}table td .progress{margin-bottom:0}table td.action-column{width:1px}.help-block{color:#b6afaa}.xd-containers{font-size:15px}.cluster-view>table td{vertical-align:top}.cluster-view .label,.cluster-view .column-block{display:block}.cluster-view .input-group-addon{width:0}.cluster-view{margin-bottom:0}.deployment-status-deployed{background-color:#5cb85c}.deployment-status-deployed[href]:hover,.deployment-status-deployed[href]:focus{background-color:#449d44}.deployment-status-incomplete{background-color:#f0ad4e}.deployment-status-incomplete[href]:hover,.deployment-status-incomplete[href]:focus{background-color:#ec971f}.deployment-status-failed{background-color:#d9534f}.deployment-status-failed[href]:hover,.deployment-status-failed[href]:focus{background-color:#c9302c}.deployment-status-deploying{background-color:#5bc0de}.deployment-status-deploying[href]:hover,.deployment-status-deploying[href]:focus{background-color:#31b0d5}.container-details-table th{background-color:#3c3834;color:#f1f1f1}.status-help-content-table td{color:#34302d}.alert-success{background-color:rgba(223,240,216,0.7);border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:rgba(217,237,247,0.7);border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:rgba(252,248,227,0.7);border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:rgba(242,222,222,0.7);border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}.myspinner{animation-name:spinner;animation-duration:2s;animation-iteration-count:infinite;animation-timing-function:linear;-webkit-transform-origin:49% 50%;-webkit-animation-name:spinner;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear}@keyframes "spinner"{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}@-webkit-keyframes "spinner"{from{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}hr{border-top:1px dotted #34302d}@media (max-width:768px){.navbar-toggle{position:absolute;z-index:9999;left:0;top:0}.navbar a.navbar-brand{display:block;margin:0 auto 0 auto;width:148px;height:50px;float:none;background:url("../images/spring-logo-dataflow-mobile.png") 0 center no-repeat}.homepage-billboard .homepage-subtitle{font-size:21px;line-height:21px}.navbar a.navbar-brand span{display:none}.navbar{border-top-width:0}.xd-container{margin-top:20px;margin-bottom:30px}.index-page--subtitle{margin-top:10px;margin-bottom:30px}} diff --git a/src/main/webapp/resources/fonts/montserrat-webfont.eot b/src/main/webapp/resources/fonts/montserrat-webfont.eot new file mode 100644 index 000000000..0caea9169 Binary files /dev/null and b/src/main/webapp/resources/fonts/montserrat-webfont.eot differ diff --git a/src/main/webapp/resources/fonts/montserrat-webfont.svg b/src/main/webapp/resources/fonts/montserrat-webfont.svg new file mode 100644 index 000000000..7bd96bdfd --- /dev/null +++ b/src/main/webapp/resources/fonts/montserrat-webfont.svg @@ -0,0 +1,1283 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/resources/fonts/montserrat-webfont.ttf b/src/main/webapp/resources/fonts/montserrat-webfont.ttf new file mode 100644 index 000000000..9953fe62e Binary files /dev/null and b/src/main/webapp/resources/fonts/montserrat-webfont.ttf differ diff --git a/src/main/webapp/resources/fonts/montserrat-webfont.woff b/src/main/webapp/resources/fonts/montserrat-webfont.woff new file mode 100644 index 000000000..eb49333f7 Binary files /dev/null and b/src/main/webapp/resources/fonts/montserrat-webfont.woff differ diff --git a/src/main/webapp/resources/fonts/varela_round-webfont.eot b/src/main/webapp/resources/fonts/varela_round-webfont.eot new file mode 100644 index 000000000..dfee0c26e Binary files /dev/null and b/src/main/webapp/resources/fonts/varela_round-webfont.eot differ diff --git a/src/main/webapp/resources/fonts/varela_round-webfont.svg b/src/main/webapp/resources/fonts/varela_round-webfont.svg new file mode 100644 index 000000000..3280e2c43 --- /dev/null +++ b/src/main/webapp/resources/fonts/varela_round-webfont.svg @@ -0,0 +1,7875 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/resources/fonts/varela_round-webfont.ttf b/src/main/webapp/resources/fonts/varela_round-webfont.ttf new file mode 100644 index 000000000..3ca066693 Binary files /dev/null and b/src/main/webapp/resources/fonts/varela_round-webfont.ttf differ diff --git a/src/main/webapp/resources/fonts/varela_round-webfont.woff b/src/main/webapp/resources/fonts/varela_round-webfont.woff new file mode 100644 index 000000000..77ba16614 Binary files /dev/null and b/src/main/webapp/resources/fonts/varela_round-webfont.woff differ diff --git a/src/main/webapp/resources/images/banner-graphic.png b/src/main/webapp/resources/images/banner-graphic.png deleted file mode 100644 index e6d01d588..000000000 Binary files a/src/main/webapp/resources/images/banner-graphic.png and /dev/null differ diff --git a/src/main/webapp/resources/images/bullet-arrow.png b/src/main/webapp/resources/images/bullet-arrow.png deleted file mode 100644 index 5909c25b3..000000000 Binary files a/src/main/webapp/resources/images/bullet-arrow.png and /dev/null differ diff --git a/src/main/webapp/resources/images/favicon.png b/src/main/webapp/resources/images/favicon.png new file mode 100644 index 000000000..1c649a3cd Binary files /dev/null and b/src/main/webapp/resources/images/favicon.png differ diff --git a/src/main/webapp/resources/images/pets.png b/src/main/webapp/resources/images/pets.png index 0fe63c282..bb5cf3a34 100644 Binary files a/src/main/webapp/resources/images/pets.png and b/src/main/webapp/resources/images/pets.png differ diff --git a/src/main/webapp/resources/images/platform-bg.png b/src/main/webapp/resources/images/platform-bg.png new file mode 100644 index 000000000..512185839 Binary files /dev/null and b/src/main/webapp/resources/images/platform-bg.png differ diff --git a/src/main/webapp/resources/images/spring-logo-dataflow-mobile.png b/src/main/webapp/resources/images/spring-logo-dataflow-mobile.png new file mode 100644 index 000000000..45d24a6f3 Binary files /dev/null and b/src/main/webapp/resources/images/spring-logo-dataflow-mobile.png differ diff --git a/src/main/webapp/resources/images/spring-logo-dataflow.png b/src/main/webapp/resources/images/spring-logo-dataflow.png new file mode 100644 index 000000000..ff7cdbb40 Binary files /dev/null and b/src/main/webapp/resources/images/spring-logo-dataflow.png differ diff --git a/src/main/webapp/resources/images/springsource-logo.png b/src/main/webapp/resources/images/springsource-logo.png deleted file mode 100644 index e170f8abf..000000000 Binary files a/src/main/webapp/resources/images/springsource-logo.png and /dev/null differ diff --git a/src/main/webapp/resources/images/submit-bg.png b/src/main/webapp/resources/images/submit-bg.png deleted file mode 100644 index 10a94371b..000000000 Binary files a/src/main/webapp/resources/images/submit-bg.png and /dev/null differ diff --git a/src/main/webapp/resources/less/header.less b/src/main/webapp/resources/less/header.less new file mode 100644 index 000000000..7cb1a7888 --- /dev/null +++ b/src/main/webapp/resources/less/header.less @@ -0,0 +1,73 @@ +.navbar { + border-top: 4px solid #6db33f; + background-color: #34302d; + margin-bottom: 0px; + border-bottom: 0; + border-left: 0; + border-right: 0; +} + +.navbar a.navbar-brand { + background: url("../images/spring-logo-dataflow.png") -1px -1px no-repeat; + margin: 12px 0 6px; + width: 229px; + height: 46px; + display: inline-block; + text-decoration: none; + padding: 0; +} + +.navbar a.navbar-brand span { + display: block; + width: 229px; + height: 46px; + background: url("../images/spring-logo-dataflow.png") -1px -48px no-repeat; + opacity: 0; + -moz-transition: opacity 0.12s ease-in-out; + -webkit-transition: opacity 0.12s ease-in-out; + -o-transition: opacity 0.12s ease-in-out; +} + +.navbar a:hover.navbar-brand span { + opacity: 1; +} + +.navbar li > a, .navbar-text { + font-family: "montserratregular", sans-serif; + text-shadow: none; + font-size: 14px; + +/* line-height: 14px; */ + padding: 28px 20px; + transition: all 0.15s; + -webkit-transition: all 0.15s; + -moz-transition: all 0.15s; + -o-transition: all 0.15s; + -ms-transition: all 0.15s; +} + +.navbar li > a { + text-transform: uppercase; +} + +.navbar .navbar-text { + margin-top: 0; + margin-bottom: 0; +} +.navbar li:hover > a { + color: #eeeeee; + background-color: #6db33f; +} + +.navbar-toggle { + border-width: 0; + + .icon-bar + .icon-bar { + margin-top: 3px; + } + .icon-bar { + width: 19px; + height: 3px; + } + +} diff --git a/src/main/webapp/resources/less/petclinic.less b/src/main/webapp/resources/less/petclinic.less new file mode 100644 index 000000000..f939bab58 --- /dev/null +++ b/src/main/webapp/resources/less/petclinic.less @@ -0,0 +1,252 @@ +/* + * Copyright 2016 the original author or authors. + * + * 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 "../../vendors/bootstrap/less/bootstrap.less"; + +@spring-green: #6db33f; +@spring-dark-green: #5fa134; +@spring-brown: #34302D; +@spring-grey: #838789; +@spring-light-grey: #f1f1f1; + +@body-bg: @spring-light-grey; +@text-color: @spring-brown; +@link-color: @spring-dark-green; +@link-hover-color: @spring-dark-green; + +@navbar-default-link-color: @spring-light-grey; +@navbar-default-link-active-color: @spring-light-grey; +@navbar-default-link-hover-color: @spring-light-grey; +@navbar-default-link-hover-bg: @spring-green; +@navbar-default-toggle-icon-bar-bg: @spring-light-grey; +@navbar-default-toggle-hover-bg: transparent; +@navbar-default-link-active-bg: @spring-green; + +@border-radius-base: 0; +@border-radius-large: 0; +@border-radius-small: 0; + +@btn-default-color: @spring-light-grey; +@btn-default-bg: @spring-brown; +@btn-default-border: @spring-green; + +@icon-font-path: "../../vendors/bootstrap/dist/fonts/"; + +@nav-tabs-active-link-hover-color: @spring-light-grey; +@nav-tabs-active-link-hover-bg: @spring-brown; +@nav-tabs-active-link-hover-border-color: @spring-brown; +@nav-tabs-border-color: @spring-brown; + +@pagination-active-bg: @spring-brown; +@pagination-active-border: @spring-green; +@table-border-color: @spring-brown; + +@import "typography.less"; +@import "header.less"; + +.table > thead > tr > th { + background-color: lighten(@spring-brown, 3%); + color: @spring-light-grey; +} + +.table-filter { + background-color: @spring-brown; + padding: 9px 12px; +} + +.nav > li > a { + color: @spring-grey; +} + +.btn-default { + border-width: 2px; + transition: border 0.15s; + -webkit-transition: border 0.15s; + -moz-transition: border 0.15s; + -o-transition: border 0.15s; + -ms-transition: border 0.15s; + + &:hover, + &:focus, + &:active, + &.active, + .open .dropdown-toggle& { + background-color: @spring-brown; + border-color: @spring-brown; + } +} + + +.container .text-muted { + margin: 20px 0; +} + +code { + font-size: 80%; +} + +.xd-container { + margin-top: 40px; + margin-bottom: 100px; + padding-left: 5px; + padding-right: 5px; +} + +h1 { + margin-bottom: 15px +} + +.index-page--subtitle { + font-size: 16px; + line-height: 24px; + margin: 0 0 30px; +} + +.form-horizontal button.btn-inverse { + margin-left: 32px; +} + +#job-params-modal .modal-dialog { + width: 90%; + margin-left:auto; + margin-right:auto; +} + +[ng-cloak].splash { + display: block !important; +} +[ng-cloak] { + display: none; +} + +.splash { + background: @spring-green; + color: @spring-brown; + display: none; +} + +.error-page { + margin-top: 100px; + text-align: center; +} + +.error-page .error-title { + font-size: 24px; + line-height: 24px; + margin: 30px 0 0; +} + +table td { + vertical-align: middle; +} + +table td .progress { + margin-bottom: 0; +} + +table td.action-column { + width: 1px; +} + +.help-block { + color: lighten(@text-color, 50%); // lighten the text some for contrast +} + +.xd-containers { + font-size: 15px; +} + +.cluster-view > table td { + vertical-align: top; +} + +.cluster-view .label, .cluster-view .column-block { + display: block; +} + +.cluster-view .input-group-addon { + width: 0%; +} + +.cluster-view { + margin-bottom: 0; +} + +.deployment-status-deployed { + .label-success; +} + +.deployment-status-incomplete { + .label-warning; +} + +.deployment-status-failed { + .label-danger; +} + +.deployment-status-deploying { + .label-info +} +.deployment-status-na { +} + +.container-details-table th { + background-color: lighten(@spring-brown, 3%); + color: @spring-light-grey; +} + +.status-help-content-table td { + color: @spring-brown; +} + +.alert-success { + .alert-variant(fade(@alert-success-bg, 70%); @alert-success-border; @alert-success-text); +} +.alert-info { + .alert-variant(fade(@alert-info-bg, 70%); @alert-info-border; @alert-info-text); +} +.alert-warning { + .alert-variant(fade(@alert-warning-bg, 70%); @alert-warning-border; @alert-warning-text); +} +.alert-danger { + .alert-variant(fade(@alert-danger-bg, 70%); @alert-danger-border; @alert-danger-text); +} + +.myspinner { + animation-name: spinner; + animation-duration: 2s; + animation-iteration-count: infinite; + animation-timing-function: linear; + + -webkit-transform-origin: 49% 50%; + -webkit-animation-name: spinner; + -webkit-animation-duration: 2s; + -webkit-animation-iteration-count: infinite; + -webkit-animation-timing-function: linear; +} + +@keyframes "spinner" { + from { transform: rotate( 0deg ); } + to { transform: rotate( 360deg ); } +} + +@-webkit-keyframes "spinner" { + from { -webkit-transform: rotate( 0deg ); } + to { -webkit-transform: rotate( 360deg ); } +} + +hr { + border-top: 1px dotted @spring-brown; +} + +@import "responsive.less"; diff --git a/src/main/webapp/resources/less/responsive.less b/src/main/webapp/resources/less/responsive.less new file mode 100644 index 000000000..8f3b21545 --- /dev/null +++ b/src/main/webapp/resources/less/responsive.less @@ -0,0 +1,41 @@ +@media (max-width: 768px) { + .navbar-toggle { + position:absolute; + z-index: 9999; + left:0px; + top:0px; + } + + .navbar a.navbar-brand { + display: block; + margin: 0 auto 0 auto; + width: 148px; + height: 50px; + float: none; + background: url("../images/spring-logo-dataflow-mobile.png") 0 center no-repeat; + } + + .homepage-billboard .homepage-subtitle { + font-size: 21px; + line-height: 21px; + } + + .navbar a.navbar-brand span { + display: none; + } + + .navbar { + border-top-width: 0; + } + + .xd-container { + margin-top: 20px; + margin-bottom: 30px; + } + + .index-page--subtitle { + margin-top: 10px; + margin-bottom: 30px; + } + +} diff --git a/src/main/webapp/resources/less/typography.less b/src/main/webapp/resources/less/typography.less new file mode 100644 index 000000000..8b8436e13 --- /dev/null +++ b/src/main/webapp/resources/less/typography.less @@ -0,0 +1,60 @@ +@font-face { + font-family: 'varela_roundregular'; + + src: url('../fonts/varela_round-webfont.eot'); + src: url('../fonts/varela_round-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/varela_round-webfont.woff') format('woff'), + url('../fonts/varela_round-webfont.ttf') format('truetype'), + url('../fonts/varela_round-webfont.svg#varela_roundregular') format('svg'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'montserratregular'; + src: url('../fonts/montserrat-webfont.eot'); + src: url('../fonts/montserrat-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/montserrat-webfont.woff') format('woff'), + url('../fonts/montserrat-webfont.ttf') format('truetype'), + url('../fonts/montserrat-webfont.svg#montserratregular') format('svg'); + font-weight: normal; + font-style: normal; +} + +body, h1, h2, h3, p, input { + margin: 0; + font-weight: 400; + font-family: "varela_roundregular", sans-serif; + color: #34302d; +} + +h1 { + font-size: 24px; + line-height: 30px; + font-family: "montserratregular", sans-serif; +} + +h2 { + font-size: 18px; + font-weight: 700; + line-height: 24px; + margin-bottom: 10px; + font-family: "montserratregular", sans-serif; +} + +h3 { + font-size: 16px; + line-height: 24px; + margin-bottom: 10px; + font-weight: 700; +} + +p { + //font-size: 15px; + //line-height: 24px; +} + +strong { + font-weight: 700; + font-family: "montserratregular", sans-serif; +} diff --git a/src/main/webapp/vendors/bootstrap/dist/fonts/glyphicons-halflings-regular.eot b/src/main/webapp/vendors/bootstrap/dist/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 000000000..b93a4953f Binary files /dev/null and b/src/main/webapp/vendors/bootstrap/dist/fonts/glyphicons-halflings-regular.eot differ diff --git a/src/main/webapp/vendors/bootstrap/dist/fonts/glyphicons-halflings-regular.svg b/src/main/webapp/vendors/bootstrap/dist/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 000000000..94fb5490a --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/dist/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/vendors/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf b/src/main/webapp/vendors/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 000000000..1413fc609 Binary files /dev/null and b/src/main/webapp/vendors/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf differ diff --git a/src/main/webapp/vendors/bootstrap/dist/fonts/glyphicons-halflings-regular.woff b/src/main/webapp/vendors/bootstrap/dist/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 000000000..9e612858f Binary files /dev/null and b/src/main/webapp/vendors/bootstrap/dist/fonts/glyphicons-halflings-regular.woff differ diff --git a/src/main/webapp/vendors/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 b/src/main/webapp/vendors/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 000000000..64539b54c Binary files /dev/null and b/src/main/webapp/vendors/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 differ diff --git a/src/main/webapp/vendors/bootstrap/dist/js/bootstrap.js b/src/main/webapp/vendors/bootstrap/dist/js/bootstrap.js new file mode 100644 index 000000000..01fbbcbaa --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/dist/js/bootstrap.js @@ -0,0 +1,2363 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under the MIT license + */ + +if (typeof jQuery === 'undefined') { + throw new Error('Bootstrap\'s JavaScript requires jQuery') +} + ++function ($) { + 'use strict'; + var version = $.fn.jquery.split(' ')[0].split('.') + if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 2)) { + throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3') + } +}(jQuery); + +/* ======================================================================== + * Bootstrap: transition.js v3.3.6 + * http://getbootstrap.com/javascript/#transitions + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) + // ============================================================ + + function transitionEnd() { + var el = document.createElement('bootstrap') + + var transEndEventNames = { + WebkitTransition : 'webkitTransitionEnd', + MozTransition : 'transitionend', + OTransition : 'oTransitionEnd otransitionend', + transition : 'transitionend' + } + + for (var name in transEndEventNames) { + if (el.style[name] !== undefined) { + return { end: transEndEventNames[name] } + } + } + + return false // explicit for ie8 ( ._.) + } + + // http://blog.alexmaccaw.com/css-transitions + $.fn.emulateTransitionEnd = function (duration) { + var called = false + var $el = this + $(this).one('bsTransitionEnd', function () { called = true }) + var callback = function () { if (!called) $($el).trigger($.support.transition.end) } + setTimeout(callback, duration) + return this + } + + $(function () { + $.support.transition = transitionEnd() + + if (!$.support.transition) return + + $.event.special.bsTransitionEnd = { + bindType: $.support.transition.end, + delegateType: $.support.transition.end, + handle: function (e) { + if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) + } + } + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: alert.js v3.3.6 + * http://getbootstrap.com/javascript/#alerts + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // ALERT CLASS DEFINITION + // ====================== + + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.VERSION = '3.3.6' + + Alert.TRANSITION_DURATION = 150 + + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = $(selector) + + if (e) e.preventDefault() + + if (!$parent.length) { + $parent = $this.closest('.alert') + } + + $parent.trigger(e = $.Event('close.bs.alert')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + // detach from parent, fire event then clean up data + $parent.detach().trigger('closed.bs.alert').remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent + .one('bsTransitionEnd', removeElement) + .emulateTransitionEnd(Alert.TRANSITION_DURATION) : + removeElement() + } + + + // ALERT PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') + + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.alert + + $.fn.alert = Plugin + $.fn.alert.Constructor = Alert + + + // ALERT NO CONFLICT + // ================= + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + // ALERT DATA-API + // ============== + + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: button.js v3.3.6 + * http://getbootstrap.com/javascript/#buttons + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + this.isLoading = false + } + + Button.VERSION = '3.3.6' + + Button.DEFAULTS = { + loadingText: 'loading...' + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() + + state += 'Text' + + if (data.resetText == null) $el.data('resetText', $el[val]()) + + // push to event loop to allow forms to submit + setTimeout($.proxy(function () { + $el[val](data[state] == null ? this.options[state] : data[state]) + + if (state == 'loadingText') { + this.isLoading = true + $el.addClass(d).attr(d, d) + } else if (this.isLoading) { + this.isLoading = false + $el.removeClass(d).removeAttr(d) + } + }, this), 0) + } + + Button.prototype.toggle = function () { + var changed = true + var $parent = this.$element.closest('[data-toggle="buttons"]') + + if ($parent.length) { + var $input = this.$element.find('input') + if ($input.prop('type') == 'radio') { + if ($input.prop('checked')) changed = false + $parent.find('.active').removeClass('active') + this.$element.addClass('active') + } else if ($input.prop('type') == 'checkbox') { + if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false + this.$element.toggleClass('active') + } + $input.prop('checked', this.$element.hasClass('active')) + if (changed) $input.trigger('change') + } else { + this.$element.attr('aria-pressed', !this.$element.hasClass('active')) + this.$element.toggleClass('active') + } + } + + + // BUTTON PLUGIN DEFINITION + // ======================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.button', (data = new Button(this, options))) + + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + var old = $.fn.button + + $.fn.button = Plugin + $.fn.button.Constructor = Button + + + // BUTTON NO CONFLICT + // ================== + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + // BUTTON DATA-API + // =============== + + $(document) + .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + Plugin.call($btn, 'toggle') + if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault() + }) + .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { + $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: carousel.js v3.3.6 + * http://getbootstrap.com/javascript/#carousel + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CAROUSEL CLASS DEFINITION + // ========================= + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = null + this.sliding = null + this.interval = null + this.$active = null + this.$items = null + + this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) + + this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element + .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) + .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) + } + + Carousel.VERSION = '3.3.6' + + Carousel.TRANSITION_DURATION = 600 + + Carousel.DEFAULTS = { + interval: 5000, + pause: 'hover', + wrap: true, + keyboard: true + } + + Carousel.prototype.keydown = function (e) { + if (/input|textarea/i.test(e.target.tagName)) return + switch (e.which) { + case 37: this.prev(); break + case 39: this.next(); break + default: return + } + + e.preventDefault() + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getItemIndex = function (item) { + this.$items = item.parent().children('.item') + return this.$items.index(item || this.$active) + } + + Carousel.prototype.getItemForDirection = function (direction, active) { + var activeIndex = this.getItemIndex(active) + var willWrap = (direction == 'prev' && activeIndex === 0) + || (direction == 'next' && activeIndex == (this.$items.length - 1)) + if (willWrap && !this.options.wrap) return active + var delta = direction == 'prev' ? -1 : 1 + var itemIndex = (activeIndex + delta) % this.$items.length + return this.$items.eq(itemIndex) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || this.getItemForDirection(type, $active) + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var that = this + + if ($next.hasClass('active')) return (this.sliding = false) + + var relatedTarget = $next[0] + var slideEvent = $.Event('slide.bs.carousel', { + relatedTarget: relatedTarget, + direction: direction + }) + this.$element.trigger(slideEvent) + if (slideEvent.isDefaultPrevented()) return + + this.sliding = true + + isCycling && this.pause() + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) + $nextIndicator && $nextIndicator.addClass('active') + } + + var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" + if ($.support.transition && this.$element.hasClass('slide')) { + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one('bsTransitionEnd', function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { + that.$element.trigger(slidEvent) + }, 0) + }) + .emulateTransitionEnd(Carousel.TRANSITION_DURATION) + } else { + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger(slidEvent) + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + var old = $.fn.carousel + + $.fn.carousel = Plugin + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + var clickHandler = function (e) { + var href + var $this = $(this) + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 + if (!$target.hasClass('carousel')) return + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + Plugin.call($target, options) + + if (slideIndex) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + } + + $(document) + .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) + .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + Plugin.call($carousel, $carousel.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: collapse.js v3.3.6 + * http://getbootstrap.com/javascript/#collapse + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + + '[data-toggle="collapse"][data-target="#' + element.id + '"]') + this.transitioning = null + + if (this.options.parent) { + this.$parent = this.getParent() + } else { + this.addAriaAndCollapsedClass(this.$element, this.$trigger) + } + + if (this.options.toggle) this.toggle() + } + + Collapse.VERSION = '3.3.6' + + Collapse.TRANSITION_DURATION = 350 + + Collapse.DEFAULTS = { + toggle: true + } + + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return + + var activesData + var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') + + if (actives && actives.length) { + activesData = actives.data('bs.collapse') + if (activesData && activesData.transitioning) return + } + + var startEvent = $.Event('show.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + if (actives && actives.length) { + Plugin.call(actives, 'hide') + activesData || actives.data('bs.collapse', null) + } + + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + .addClass('collapsing')[dimension](0) + .attr('aria-expanded', true) + + this.$trigger + .removeClass('collapsed') + .attr('aria-expanded', true) + + this.transitioning = 1 + + var complete = function () { + this.$element + .removeClass('collapsing') + .addClass('collapse in')[dimension]('') + this.transitioning = 0 + this.$element + .trigger('shown.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + var scrollSize = $.camelCase(['scroll', dimension].join('-')) + + this.$element + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) + } + + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return + + var startEvent = $.Event('hide.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var dimension = this.dimension() + + this.$element[dimension](this.$element[dimension]())[0].offsetHeight + + this.$element + .addClass('collapsing') + .removeClass('collapse in') + .attr('aria-expanded', false) + + this.$trigger + .addClass('collapsed') + .attr('aria-expanded', false) + + this.transitioning = 1 + + var complete = function () { + this.transitioning = 0 + this.$element + .removeClass('collapsing') + .addClass('collapse') + .trigger('hidden.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + this.$element + [dimension](0) + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION) + } + + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + Collapse.prototype.getParent = function () { + return $(this.options.parent) + .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') + .each($.proxy(function (i, element) { + var $element = $(element) + this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) + }, this)) + .end() + } + + Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { + var isOpen = $element.hasClass('in') + + $element.attr('aria-expanded', isOpen) + $trigger + .toggleClass('collapsed', !isOpen) + .attr('aria-expanded', isOpen) + } + + function getTargetFromTrigger($trigger) { + var href + var target = $trigger.attr('data-target') + || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 + + return $(target) + } + + + // COLLAPSE PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.collapse + + $.fn.collapse = Plugin + $.fn.collapse.Constructor = Collapse + + + // COLLAPSE NO CONFLICT + // ==================== + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + // COLLAPSE DATA-API + // ================= + + $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { + var $this = $(this) + + if (!$this.attr('data-target')) e.preventDefault() + + var $target = getTargetFromTrigger($this) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $this.data() + + Plugin.call($target, option) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: dropdown.js v3.3.6 + * http://getbootstrap.com/javascript/#dropdowns + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle="dropdown"]' + var Dropdown = function (element) { + $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.VERSION = '3.3.6' + + function getParent($this) { + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = selector && $(selector) + + return $parent && $parent.length ? $parent : $this.parent() + } + + function clearMenus(e) { + if (e && e.which === 3) return + $(backdrop).remove() + $(toggle).each(function () { + var $this = $(this) + var $parent = getParent($this) + var relatedTarget = { relatedTarget: this } + + if (!$parent.hasClass('open')) return + + if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return + + $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this.attr('aria-expanded', 'false') + $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget)) + }) + } + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we use a backdrop because click events don't delegate + $(document.createElement('div')) + .addClass('dropdown-backdrop') + .insertAfter($(this)) + .on('click', clearMenus) + } + + var relatedTarget = { relatedTarget: this } + $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this + .trigger('focus') + .attr('aria-expanded', 'true') + + $parent + .toggleClass('open') + .trigger($.Event('shown.bs.dropdown', relatedTarget)) + } + + return false + } + + Dropdown.prototype.keydown = function (e) { + if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return + + var $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + if (!isActive && e.which != 27 || isActive && e.which == 27) { + if (e.which == 27) $parent.find(toggle).trigger('focus') + return $this.trigger('click') + } + + var desc = ' li:not(.disabled):visible a' + var $items = $parent.find('.dropdown-menu' + desc) + + if (!$items.length) return + + var index = $items.index(e.target) + + if (e.which == 38 && index > 0) index-- // up + if (e.which == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items.eq(index).trigger('focus') + } + + + // DROPDOWN PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.dropdown') + + if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.dropdown + + $.fn.dropdown = Plugin + $.fn.dropdown.Constructor = Dropdown + + + // DROPDOWN NO CONFLICT + // ==================== + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + // APPLY TO STANDARD DROPDOWN ELEMENTS + // =================================== + + $(document) + .on('click.bs.dropdown.data-api', clearMenus) + .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) + .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: modal.js v3.3.6 + * http://getbootstrap.com/javascript/#modals + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // MODAL CLASS DEFINITION + // ====================== + + var Modal = function (element, options) { + this.options = options + this.$body = $(document.body) + this.$element = $(element) + this.$dialog = this.$element.find('.modal-dialog') + this.$backdrop = null + this.isShown = null + this.originalBodyPad = null + this.scrollbarWidth = 0 + this.ignoreBackdropClick = false + + if (this.options.remote) { + this.$element + .find('.modal-content') + .load(this.options.remote, $.proxy(function () { + this.$element.trigger('loaded.bs.modal') + }, this)) + } + } + + Modal.VERSION = '3.3.6' + + Modal.TRANSITION_DURATION = 300 + Modal.BACKDROP_TRANSITION_DURATION = 150 + + Modal.DEFAULTS = { + backdrop: true, + keyboard: true, + show: true + } + + Modal.prototype.toggle = function (_relatedTarget) { + return this.isShown ? this.hide() : this.show(_relatedTarget) + } + + Modal.prototype.show = function (_relatedTarget) { + var that = this + var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.checkScrollbar() + this.setScrollbar() + this.$body.addClass('modal-open') + + this.escape() + this.resize() + + this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) + + this.$dialog.on('mousedown.dismiss.bs.modal', function () { + that.$element.one('mouseup.dismiss.bs.modal', function (e) { + if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true + }) + }) + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(that.$body) // don't move modals dom position + } + + that.$element + .show() + .scrollTop(0) + + that.adjustDialog() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element.addClass('in') + + that.enforceFocus() + + var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) + + transition ? + that.$dialog // wait for modal to slide in + .one('bsTransitionEnd', function () { + that.$element.trigger('focus').trigger(e) + }) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + that.$element.trigger('focus').trigger(e) + }) + } + + Modal.prototype.hide = function (e) { + if (e) e.preventDefault() + + e = $.Event('hide.bs.modal') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + this.resize() + + $(document).off('focusin.bs.modal') + + this.$element + .removeClass('in') + .off('click.dismiss.bs.modal') + .off('mouseup.dismiss.bs.modal') + + this.$dialog.off('mousedown.dismiss.bs.modal') + + $.support.transition && this.$element.hasClass('fade') ? + this.$element + .one('bsTransitionEnd', $.proxy(this.hideModal, this)) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + this.hideModal() + } + + Modal.prototype.enforceFocus = function () { + $(document) + .off('focusin.bs.modal') // guard against infinite focus loop + .on('focusin.bs.modal', $.proxy(function (e) { + if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { + this.$element.trigger('focus') + } + }, this)) + } + + Modal.prototype.escape = function () { + if (this.isShown && this.options.keyboard) { + this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { + e.which == 27 && this.hide() + }, this)) + } else if (!this.isShown) { + this.$element.off('keydown.dismiss.bs.modal') + } + } + + Modal.prototype.resize = function () { + if (this.isShown) { + $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) + } else { + $(window).off('resize.bs.modal') + } + } + + Modal.prototype.hideModal = function () { + var that = this + this.$element.hide() + this.backdrop(function () { + that.$body.removeClass('modal-open') + that.resetAdjustments() + that.resetScrollbar() + that.$element.trigger('hidden.bs.modal') + }) + } + + Modal.prototype.removeBackdrop = function () { + this.$backdrop && this.$backdrop.remove() + this.$backdrop = null + } + + Modal.prototype.backdrop = function (callback) { + var that = this + var animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $(document.createElement('div')) + .addClass('modal-backdrop ' + animate) + .appendTo(this.$body) + + this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { + if (this.ignoreBackdropClick) { + this.ignoreBackdropClick = false + return + } + if (e.target !== e.currentTarget) return + this.options.backdrop == 'static' + ? this.$element[0].focus() + : this.hide() + }, this)) + + if (doAnimate) this.$backdrop[0].offsetWidth // force reflow + + this.$backdrop.addClass('in') + + if (!callback) return + + doAnimate ? + this.$backdrop + .one('bsTransitionEnd', callback) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callback() + + } else if (!this.isShown && this.$backdrop) { + this.$backdrop.removeClass('in') + + var callbackRemove = function () { + that.removeBackdrop() + callback && callback() + } + $.support.transition && this.$element.hasClass('fade') ? + this.$backdrop + .one('bsTransitionEnd', callbackRemove) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callbackRemove() + + } else if (callback) { + callback() + } + } + + // these following methods are used to handle overflowing modals + + Modal.prototype.handleUpdate = function () { + this.adjustDialog() + } + + Modal.prototype.adjustDialog = function () { + var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight + + this.$element.css({ + paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', + paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' + }) + } + + Modal.prototype.resetAdjustments = function () { + this.$element.css({ + paddingLeft: '', + paddingRight: '' + }) + } + + Modal.prototype.checkScrollbar = function () { + var fullWindowWidth = window.innerWidth + if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 + var documentElementRect = document.documentElement.getBoundingClientRect() + fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) + } + this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth + this.scrollbarWidth = this.measureScrollbar() + } + + Modal.prototype.setScrollbar = function () { + var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) + this.originalBodyPad = document.body.style.paddingRight || '' + if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) + } + + Modal.prototype.resetScrollbar = function () { + this.$body.css('padding-right', this.originalBodyPad) + } + + Modal.prototype.measureScrollbar = function () { // thx walsh + var scrollDiv = document.createElement('div') + scrollDiv.className = 'modal-scrollbar-measure' + this.$body.append(scrollDiv) + var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth + this.$body[0].removeChild(scrollDiv) + return scrollbarWidth + } + + + // MODAL PLUGIN DEFINITION + // ======================= + + function Plugin(option, _relatedTarget) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.modal') + var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data) $this.data('bs.modal', (data = new Modal(this, options))) + if (typeof option == 'string') data[option](_relatedTarget) + else if (options.show) data.show(_relatedTarget) + }) + } + + var old = $.fn.modal + + $.fn.modal = Plugin + $.fn.modal.Constructor = Modal + + + // MODAL NO CONFLICT + // ================= + + $.fn.modal.noConflict = function () { + $.fn.modal = old + return this + } + + + // MODAL DATA-API + // ============== + + $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { + var $this = $(this) + var href = $this.attr('href') + var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 + var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) + + if ($this.is('a')) e.preventDefault() + + $target.one('show.bs.modal', function (showEvent) { + if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown + $target.one('hidden.bs.modal', function () { + $this.is(':visible') && $this.trigger('focus') + }) + }) + Plugin.call($target, option, this) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tooltip.js v3.3.6 + * http://getbootstrap.com/javascript/#tooltip + * Inspired by the original jQuery.tipsy by Jason Frame + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TOOLTIP PUBLIC CLASS DEFINITION + // =============================== + + var Tooltip = function (element, options) { + this.type = null + this.options = null + this.enabled = null + this.timeout = null + this.hoverState = null + this.$element = null + this.inState = null + + this.init('tooltip', element, options) + } + + Tooltip.VERSION = '3.3.6' + + Tooltip.TRANSITION_DURATION = 150 + + Tooltip.DEFAULTS = { + animation: true, + placement: 'top', + selector: false, + template: '', + trigger: 'hover focus', + title: '', + delay: 0, + html: false, + container: false, + viewport: { + selector: 'body', + padding: 0 + } + } + + Tooltip.prototype.init = function (type, element, options) { + this.enabled = true + this.type = type + this.$element = $(element) + this.options = this.getOptions(options) + this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) + this.inState = { click: false, hover: false, focus: false } + + if (this.$element[0] instanceof document.constructor && !this.options.selector) { + throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') + } + + var triggers = this.options.trigger.split(' ') + + for (var i = triggers.length; i--;) { + var trigger = triggers[i] + + if (trigger == 'click') { + this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) + } else if (trigger != 'manual') { + var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' + var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' + + this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) + this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) + } + } + + this.options.selector ? + (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : + this.fixTitle() + } + + Tooltip.prototype.getDefaults = function () { + return Tooltip.DEFAULTS + } + + Tooltip.prototype.getOptions = function (options) { + options = $.extend({}, this.getDefaults(), this.$element.data(), options) + + if (options.delay && typeof options.delay == 'number') { + options.delay = { + show: options.delay, + hide: options.delay + } + } + + return options + } + + Tooltip.prototype.getDelegateOptions = function () { + var options = {} + var defaults = this.getDefaults() + + this._options && $.each(this._options, function (key, value) { + if (defaults[key] != value) options[key] = value + }) + + return options + } + + Tooltip.prototype.enter = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true + } + + if (self.tip().hasClass('in') || self.hoverState == 'in') { + self.hoverState = 'in' + return + } + + clearTimeout(self.timeout) + + self.hoverState = 'in' + + if (!self.options.delay || !self.options.delay.show) return self.show() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'in') self.show() + }, self.options.delay.show) + } + + Tooltip.prototype.isInStateTrue = function () { + for (var key in this.inState) { + if (this.inState[key]) return true + } + + return false + } + + Tooltip.prototype.leave = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false + } + + if (self.isInStateTrue()) return + + clearTimeout(self.timeout) + + self.hoverState = 'out' + + if (!self.options.delay || !self.options.delay.hide) return self.hide() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'out') self.hide() + }, self.options.delay.hide) + } + + Tooltip.prototype.show = function () { + var e = $.Event('show.bs.' + this.type) + + if (this.hasContent() && this.enabled) { + this.$element.trigger(e) + + var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) + if (e.isDefaultPrevented() || !inDom) return + var that = this + + var $tip = this.tip() + + var tipId = this.getUID(this.type) + + this.setContent() + $tip.attr('id', tipId) + this.$element.attr('aria-describedby', tipId) + + if (this.options.animation) $tip.addClass('fade') + + var placement = typeof this.options.placement == 'function' ? + this.options.placement.call(this, $tip[0], this.$element[0]) : + this.options.placement + + var autoToken = /\s?auto?\s?/i + var autoPlace = autoToken.test(placement) + if (autoPlace) placement = placement.replace(autoToken, '') || 'top' + + $tip + .detach() + .css({ top: 0, left: 0, display: 'block' }) + .addClass(placement) + .data('bs.' + this.type, this) + + this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) + this.$element.trigger('inserted.bs.' + this.type) + + var pos = this.getPosition() + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (autoPlace) { + var orgPlacement = placement + var viewportDim = this.getPosition(this.$viewport) + + placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : + placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : + placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : + placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : + placement + + $tip + .removeClass(orgPlacement) + .addClass(placement) + } + + var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) + + this.applyPlacement(calculatedOffset, placement) + + var complete = function () { + var prevHoverState = that.hoverState + that.$element.trigger('shown.bs.' + that.type) + that.hoverState = null + + if (prevHoverState == 'out') that.leave(that) + } + + $.support.transition && this.$tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + } + } + + Tooltip.prototype.applyPlacement = function (offset, placement) { + var $tip = this.tip() + var width = $tip[0].offsetWidth + var height = $tip[0].offsetHeight + + // manually read margins because getBoundingClientRect includes difference + var marginTop = parseInt($tip.css('margin-top'), 10) + var marginLeft = parseInt($tip.css('margin-left'), 10) + + // we must check for NaN for ie 8/9 + if (isNaN(marginTop)) marginTop = 0 + if (isNaN(marginLeft)) marginLeft = 0 + + offset.top += marginTop + offset.left += marginLeft + + // $.fn.offset doesn't round pixel values + // so we use setOffset directly with our own function B-0 + $.offset.setOffset($tip[0], $.extend({ + using: function (props) { + $tip.css({ + top: Math.round(props.top), + left: Math.round(props.left) + }) + } + }, offset), 0) + + $tip.addClass('in') + + // check to see if placing tip in new offset caused the tip to resize itself + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (placement == 'top' && actualHeight != height) { + offset.top = offset.top + height - actualHeight + } + + var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) + + if (delta.left) offset.left += delta.left + else offset.top += delta.top + + var isVertical = /top|bottom/.test(placement) + var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight + var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' + + $tip.offset(offset) + this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) + } + + Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { + this.arrow() + .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') + .css(isVertical ? 'top' : 'left', '') + } + + Tooltip.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + + $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) + $tip.removeClass('fade in top bottom left right') + } + + Tooltip.prototype.hide = function (callback) { + var that = this + var $tip = $(this.$tip) + var e = $.Event('hide.bs.' + this.type) + + function complete() { + if (that.hoverState != 'in') $tip.detach() + that.$element + .removeAttr('aria-describedby') + .trigger('hidden.bs.' + that.type) + callback && callback() + } + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + $tip.removeClass('in') + + $.support.transition && $tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + + this.hoverState = null + + return this + } + + Tooltip.prototype.fixTitle = function () { + var $e = this.$element + if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { + $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') + } + } + + Tooltip.prototype.hasContent = function () { + return this.getTitle() + } + + Tooltip.prototype.getPosition = function ($element) { + $element = $element || this.$element + + var el = $element[0] + var isBody = el.tagName == 'BODY' + + var elRect = el.getBoundingClientRect() + if (elRect.width == null) { + // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 + elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) + } + var elOffset = isBody ? { top: 0, left: 0 } : $element.offset() + var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } + var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null + + return $.extend({}, elRect, scroll, outerDims, elOffset) + } + + Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { + return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : + /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } + + } + + Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { + var delta = { top: 0, left: 0 } + if (!this.$viewport) return delta + + var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 + var viewportDimensions = this.getPosition(this.$viewport) + + if (/right|left/.test(placement)) { + var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll + var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight + if (topEdgeOffset < viewportDimensions.top) { // top overflow + delta.top = viewportDimensions.top - topEdgeOffset + } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow + delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset + } + } else { + var leftEdgeOffset = pos.left - viewportPadding + var rightEdgeOffset = pos.left + viewportPadding + actualWidth + if (leftEdgeOffset < viewportDimensions.left) { // left overflow + delta.left = viewportDimensions.left - leftEdgeOffset + } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow + delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset + } + } + + return delta + } + + Tooltip.prototype.getTitle = function () { + var title + var $e = this.$element + var o = this.options + + title = $e.attr('data-original-title') + || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) + + return title + } + + Tooltip.prototype.getUID = function (prefix) { + do prefix += ~~(Math.random() * 1000000) + while (document.getElementById(prefix)) + return prefix + } + + Tooltip.prototype.tip = function () { + if (!this.$tip) { + this.$tip = $(this.options.template) + if (this.$tip.length != 1) { + throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') + } + } + return this.$tip + } + + Tooltip.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) + } + + Tooltip.prototype.enable = function () { + this.enabled = true + } + + Tooltip.prototype.disable = function () { + this.enabled = false + } + + Tooltip.prototype.toggleEnabled = function () { + this.enabled = !this.enabled + } + + Tooltip.prototype.toggle = function (e) { + var self = this + if (e) { + self = $(e.currentTarget).data('bs.' + this.type) + if (!self) { + self = new this.constructor(e.currentTarget, this.getDelegateOptions()) + $(e.currentTarget).data('bs.' + this.type, self) + } + } + + if (e) { + self.inState.click = !self.inState.click + if (self.isInStateTrue()) self.enter(self) + else self.leave(self) + } else { + self.tip().hasClass('in') ? self.leave(self) : self.enter(self) + } + } + + Tooltip.prototype.destroy = function () { + var that = this + clearTimeout(this.timeout) + this.hide(function () { + that.$element.off('.' + that.type).removeData('bs.' + that.type) + if (that.$tip) { + that.$tip.detach() + } + that.$tip = null + that.$arrow = null + that.$viewport = null + }) + } + + + // TOOLTIP PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tooltip') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tooltip + + $.fn.tooltip = Plugin + $.fn.tooltip.Constructor = Tooltip + + + // TOOLTIP NO CONFLICT + // =================== + + $.fn.tooltip.noConflict = function () { + $.fn.tooltip = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: popover.js v3.3.6 + * http://getbootstrap.com/javascript/#popovers + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // POPOVER PUBLIC CLASS DEFINITION + // =============================== + + var Popover = function (element, options) { + this.init('popover', element, options) + } + + if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') + + Popover.VERSION = '3.3.6' + + Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { + placement: 'right', + trigger: 'click', + content: '', + template: '' + }) + + + // NOTE: POPOVER EXTENDS tooltip.js + // ================================ + + Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) + + Popover.prototype.constructor = Popover + + Popover.prototype.getDefaults = function () { + return Popover.DEFAULTS + } + + Popover.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + var content = this.getContent() + + $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) + $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events + this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' + ](content) + + $tip.removeClass('fade top bottom left right in') + + // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do + // this manually by checking the contents. + if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() + } + + Popover.prototype.hasContent = function () { + return this.getTitle() || this.getContent() + } + + Popover.prototype.getContent = function () { + var $e = this.$element + var o = this.options + + return $e.attr('data-content') + || (typeof o.content == 'function' ? + o.content.call($e[0]) : + o.content) + } + + Popover.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.arrow')) + } + + + // POPOVER PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.popover') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.popover', (data = new Popover(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.popover + + $.fn.popover = Plugin + $.fn.popover.Constructor = Popover + + + // POPOVER NO CONFLICT + // =================== + + $.fn.popover.noConflict = function () { + $.fn.popover = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: scrollspy.js v3.3.6 + * http://getbootstrap.com/javascript/#scrollspy + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // SCROLLSPY CLASS DEFINITION + // ========================== + + function ScrollSpy(element, options) { + this.$body = $(document.body) + this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) + this.options = $.extend({}, ScrollSpy.DEFAULTS, options) + this.selector = (this.options.target || '') + ' .nav li > a' + this.offsets = [] + this.targets = [] + this.activeTarget = null + this.scrollHeight = 0 + + this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) + this.refresh() + this.process() + } + + ScrollSpy.VERSION = '3.3.6' + + ScrollSpy.DEFAULTS = { + offset: 10 + } + + ScrollSpy.prototype.getScrollHeight = function () { + return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) + } + + ScrollSpy.prototype.refresh = function () { + var that = this + var offsetMethod = 'offset' + var offsetBase = 0 + + this.offsets = [] + this.targets = [] + this.scrollHeight = this.getScrollHeight() + + if (!$.isWindow(this.$scrollElement[0])) { + offsetMethod = 'position' + offsetBase = this.$scrollElement.scrollTop() + } + + this.$body + .find(this.selector) + .map(function () { + var $el = $(this) + var href = $el.data('target') || $el.attr('href') + var $href = /^#./.test(href) && $(href) + + return ($href + && $href.length + && $href.is(':visible') + && [[$href[offsetMethod]().top + offsetBase, href]]) || null + }) + .sort(function (a, b) { return a[0] - b[0] }) + .each(function () { + that.offsets.push(this[0]) + that.targets.push(this[1]) + }) + } + + ScrollSpy.prototype.process = function () { + var scrollTop = this.$scrollElement.scrollTop() + this.options.offset + var scrollHeight = this.getScrollHeight() + var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() + var offsets = this.offsets + var targets = this.targets + var activeTarget = this.activeTarget + var i + + if (this.scrollHeight != scrollHeight) { + this.refresh() + } + + if (scrollTop >= maxScroll) { + return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) + } + + if (activeTarget && scrollTop < offsets[0]) { + this.activeTarget = null + return this.clear() + } + + for (i = offsets.length; i--;) { + activeTarget != targets[i] + && scrollTop >= offsets[i] + && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) + && this.activate(targets[i]) + } + } + + ScrollSpy.prototype.activate = function (target) { + this.activeTarget = target + + this.clear() + + var selector = this.selector + + '[data-target="' + target + '"],' + + this.selector + '[href="' + target + '"]' + + var active = $(selector) + .parents('li') + .addClass('active') + + if (active.parent('.dropdown-menu').length) { + active = active + .closest('li.dropdown') + .addClass('active') + } + + active.trigger('activate.bs.scrollspy') + } + + ScrollSpy.prototype.clear = function () { + $(this.selector) + .parentsUntil(this.options.target, '.active') + .removeClass('active') + } + + + // SCROLLSPY PLUGIN DEFINITION + // =========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.scrollspy') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.scrollspy + + $.fn.scrollspy = Plugin + $.fn.scrollspy.Constructor = ScrollSpy + + + // SCROLLSPY NO CONFLICT + // ===================== + + $.fn.scrollspy.noConflict = function () { + $.fn.scrollspy = old + return this + } + + + // SCROLLSPY DATA-API + // ================== + + $(window).on('load.bs.scrollspy.data-api', function () { + $('[data-spy="scroll"]').each(function () { + var $spy = $(this) + Plugin.call($spy, $spy.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tab.js v3.3.6 + * http://getbootstrap.com/javascript/#tabs + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TAB CLASS DEFINITION + // ==================== + + var Tab = function (element) { + // jscs:disable requireDollarBeforejQueryAssignment + this.element = $(element) + // jscs:enable requireDollarBeforejQueryAssignment + } + + Tab.VERSION = '3.3.6' + + Tab.TRANSITION_DURATION = 150 + + Tab.prototype.show = function () { + var $this = this.element + var $ul = $this.closest('ul:not(.dropdown-menu)') + var selector = $this.data('target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + if ($this.parent('li').hasClass('active')) return + + var $previous = $ul.find('.active:last a') + var hideEvent = $.Event('hide.bs.tab', { + relatedTarget: $this[0] + }) + var showEvent = $.Event('show.bs.tab', { + relatedTarget: $previous[0] + }) + + $previous.trigger(hideEvent) + $this.trigger(showEvent) + + if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return + + var $target = $(selector) + + this.activate($this.closest('li'), $ul) + this.activate($target, $target.parent(), function () { + $previous.trigger({ + type: 'hidden.bs.tab', + relatedTarget: $this[0] + }) + $this.trigger({ + type: 'shown.bs.tab', + relatedTarget: $previous[0] + }) + }) + } + + Tab.prototype.activate = function (element, container, callback) { + var $active = container.find('> .active') + var transition = callback + && $.support.transition + && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) + + function next() { + $active + .removeClass('active') + .find('> .dropdown-menu > .active') + .removeClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', false) + + element + .addClass('active') + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + + if (transition) { + element[0].offsetWidth // reflow for transition + element.addClass('in') + } else { + element.removeClass('fade') + } + + if (element.parent('.dropdown-menu').length) { + element + .closest('li.dropdown') + .addClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + } + + callback && callback() + } + + $active.length && transition ? + $active + .one('bsTransitionEnd', next) + .emulateTransitionEnd(Tab.TRANSITION_DURATION) : + next() + + $active.removeClass('in') + } + + + // TAB PLUGIN DEFINITION + // ===================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tab') + + if (!data) $this.data('bs.tab', (data = new Tab(this))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tab + + $.fn.tab = Plugin + $.fn.tab.Constructor = Tab + + + // TAB NO CONFLICT + // =============== + + $.fn.tab.noConflict = function () { + $.fn.tab = old + return this + } + + + // TAB DATA-API + // ============ + + var clickHandler = function (e) { + e.preventDefault() + Plugin.call($(this), 'show') + } + + $(document) + .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) + .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: affix.js v3.3.6 + * http://getbootstrap.com/javascript/#affix + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // AFFIX CLASS DEFINITION + // ====================== + + var Affix = function (element, options) { + this.options = $.extend({}, Affix.DEFAULTS, options) + + this.$target = $(this.options.target) + .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) + .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) + + this.$element = $(element) + this.affixed = null + this.unpin = null + this.pinnedOffset = null + + this.checkPosition() + } + + Affix.VERSION = '3.3.6' + + Affix.RESET = 'affix affix-top affix-bottom' + + Affix.DEFAULTS = { + offset: 0, + target: window + } + + Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + var targetHeight = this.$target.height() + + if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false + + if (this.affixed == 'bottom') { + if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' + return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' + } + + var initializing = this.affixed == null + var colliderTop = initializing ? scrollTop : position.top + var colliderHeight = initializing ? targetHeight : height + + if (offsetTop != null && scrollTop <= offsetTop) return 'top' + if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' + + return false + } + + Affix.prototype.getPinnedOffset = function () { + if (this.pinnedOffset) return this.pinnedOffset + this.$element.removeClass(Affix.RESET).addClass('affix') + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + return (this.pinnedOffset = position.top - scrollTop) + } + + Affix.prototype.checkPositionWithEventLoop = function () { + setTimeout($.proxy(this.checkPosition, this), 1) + } + + Affix.prototype.checkPosition = function () { + if (!this.$element.is(':visible')) return + + var height = this.$element.height() + var offset = this.options.offset + var offsetTop = offset.top + var offsetBottom = offset.bottom + var scrollHeight = Math.max($(document).height(), $(document.body).height()) + + if (typeof offset != 'object') offsetBottom = offsetTop = offset + if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) + + var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) + + if (this.affixed != affix) { + if (this.unpin != null) this.$element.css('top', '') + + var affixType = 'affix' + (affix ? '-' + affix : '') + var e = $.Event(affixType + '.bs.affix') + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + this.affixed = affix + this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null + + this.$element + .removeClass(Affix.RESET) + .addClass(affixType) + .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') + } + + if (affix == 'bottom') { + this.$element.offset({ + top: scrollHeight - height - offsetBottom + }) + } + } + + + // AFFIX PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.affix') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.affix', (data = new Affix(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.affix + + $.fn.affix = Plugin + $.fn.affix.Constructor = Affix + + + // AFFIX NO CONFLICT + // ================= + + $.fn.affix.noConflict = function () { + $.fn.affix = old + return this + } + + + // AFFIX DATA-API + // ============== + + $(window).on('load', function () { + $('[data-spy="affix"]').each(function () { + var $spy = $(this) + var data = $spy.data() + + data.offset = data.offset || {} + + if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom + if (data.offsetTop != null) data.offset.top = data.offsetTop + + Plugin.call($spy, data) + }) + }) + +}(jQuery); diff --git a/src/main/webapp/vendors/bootstrap/dist/js/bootstrap.min.js b/src/main/webapp/vendors/bootstrap/dist/js/bootstrap.min.js new file mode 100644 index 000000000..e79c06513 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/dist/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.6",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.6",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.6",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.6",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
    ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.6",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.6",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.6",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/src/main/webapp/vendors/bootstrap/dist/js/npm.js b/src/main/webapp/vendors/bootstrap/dist/js/npm.js new file mode 100644 index 000000000..bf6aa8060 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/dist/js/npm.js @@ -0,0 +1,13 @@ +// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. +require('../../js/transition.js') +require('../../js/alert.js') +require('../../js/button.js') +require('../../js/carousel.js') +require('../../js/collapse.js') +require('../../js/dropdown.js') +require('../../js/modal.js') +require('../../js/tooltip.js') +require('../../js/popover.js') +require('../../js/scrollspy.js') +require('../../js/tab.js') +require('../../js/affix.js') \ No newline at end of file diff --git a/src/main/webapp/vendors/bootstrap/less/.csscomb.json b/src/main/webapp/vendors/bootstrap/less/.csscomb.json new file mode 100644 index 000000000..40695a478 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/.csscomb.json @@ -0,0 +1,304 @@ +{ + "always-semicolon": true, + "block-indent": 2, + "color-case": "lower", + "color-shorthand": true, + "element-case": "lower", + "eof-newline": true, + "leading-zero": false, + "remove-empty-rulesets": true, + "space-after-colon": 1, + "space-after-combinator": 1, + "space-before-selector-delimiter": 0, + "space-between-declarations": "\n", + "space-after-opening-brace": "\n", + "space-before-closing-brace": "\n", + "space-before-colon": 0, + "space-before-combinator": 1, + "space-before-opening-brace": 1, + "strip-spaces": true, + "unitless-zero": true, + "vendor-prefix-align": true, + "sort-order": [ + [ + "position", + "top", + "right", + "bottom", + "left", + "z-index", + "display", + "float", + "width", + "min-width", + "max-width", + "height", + "min-height", + "max-height", + "-webkit-box-sizing", + "-moz-box-sizing", + "box-sizing", + "-webkit-appearance", + "padding", + "padding-top", + "padding-right", + "padding-bottom", + "padding-left", + "margin", + "margin-top", + "margin-right", + "margin-bottom", + "margin-left", + "overflow", + "overflow-x", + "overflow-y", + "-webkit-overflow-scrolling", + "-ms-overflow-x", + "-ms-overflow-y", + "-ms-overflow-style", + "clip", + "clear", + "font", + "font-family", + "font-size", + "font-style", + "font-weight", + "font-variant", + "font-size-adjust", + "font-stretch", + "font-effect", + "font-emphasize", + "font-emphasize-position", + "font-emphasize-style", + "font-smooth", + "-webkit-hyphens", + "-moz-hyphens", + "hyphens", + "line-height", + "color", + "text-align", + "-webkit-text-align-last", + "-moz-text-align-last", + "-ms-text-align-last", + "text-align-last", + "text-emphasis", + "text-emphasis-color", + "text-emphasis-style", + "text-emphasis-position", + "text-decoration", + "text-indent", + "text-justify", + "text-outline", + "-ms-text-overflow", + "text-overflow", + "text-overflow-ellipsis", + "text-overflow-mode", + "text-shadow", + "text-transform", + "text-wrap", + "-webkit-text-size-adjust", + "-ms-text-size-adjust", + "letter-spacing", + "-ms-word-break", + "word-break", + "word-spacing", + "-ms-word-wrap", + "word-wrap", + "-moz-tab-size", + "-o-tab-size", + "tab-size", + "white-space", + "vertical-align", + "list-style", + "list-style-position", + "list-style-type", + "list-style-image", + "pointer-events", + "-ms-touch-action", + "touch-action", + "cursor", + "visibility", + "zoom", + "flex-direction", + "flex-order", + "flex-pack", + "flex-align", + "table-layout", + "empty-cells", + "caption-side", + "border-spacing", + "border-collapse", + "content", + "quotes", + "counter-reset", + "counter-increment", + "resize", + "-webkit-user-select", + "-moz-user-select", + "-ms-user-select", + "-o-user-select", + "user-select", + "nav-index", + "nav-up", + "nav-right", + "nav-down", + "nav-left", + "background", + "background-color", + "background-image", + "-ms-filter:\\'progid:DXImageTransform.Microsoft.gradient", + "filter:progid:DXImageTransform.Microsoft.gradient", + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader", + "filter", + "background-repeat", + "background-attachment", + "background-position", + "background-position-x", + "background-position-y", + "-webkit-background-clip", + "-moz-background-clip", + "background-clip", + "background-origin", + "-webkit-background-size", + "-moz-background-size", + "-o-background-size", + "background-size", + "border", + "border-color", + "border-style", + "border-width", + "border-top", + "border-top-color", + "border-top-style", + "border-top-width", + "border-right", + "border-right-color", + "border-right-style", + "border-right-width", + "border-bottom", + "border-bottom-color", + "border-bottom-style", + "border-bottom-width", + "border-left", + "border-left-color", + "border-left-style", + "border-left-width", + "border-radius", + "border-top-left-radius", + "border-top-right-radius", + "border-bottom-right-radius", + "border-bottom-left-radius", + "-webkit-border-image", + "-moz-border-image", + "-o-border-image", + "border-image", + "-webkit-border-image-source", + "-moz-border-image-source", + "-o-border-image-source", + "border-image-source", + "-webkit-border-image-slice", + "-moz-border-image-slice", + "-o-border-image-slice", + "border-image-slice", + "-webkit-border-image-width", + "-moz-border-image-width", + "-o-border-image-width", + "border-image-width", + "-webkit-border-image-outset", + "-moz-border-image-outset", + "-o-border-image-outset", + "border-image-outset", + "-webkit-border-image-repeat", + "-moz-border-image-repeat", + "-o-border-image-repeat", + "border-image-repeat", + "outline", + "outline-width", + "outline-style", + "outline-color", + "outline-offset", + "-webkit-box-shadow", + "-moz-box-shadow", + "box-shadow", + "filter:progid:DXImageTransform.Microsoft.Alpha(Opacity", + "-ms-filter:\\'progid:DXImageTransform.Microsoft.Alpha", + "opacity", + "-ms-interpolation-mode", + "-webkit-transition", + "-moz-transition", + "-ms-transition", + "-o-transition", + "transition", + "-webkit-transition-delay", + "-moz-transition-delay", + "-ms-transition-delay", + "-o-transition-delay", + "transition-delay", + "-webkit-transition-timing-function", + "-moz-transition-timing-function", + "-ms-transition-timing-function", + "-o-transition-timing-function", + "transition-timing-function", + "-webkit-transition-duration", + "-moz-transition-duration", + "-ms-transition-duration", + "-o-transition-duration", + "transition-duration", + "-webkit-transition-property", + "-moz-transition-property", + "-ms-transition-property", + "-o-transition-property", + "transition-property", + "-webkit-transform", + "-moz-transform", + "-ms-transform", + "-o-transform", + "transform", + "-webkit-transform-origin", + "-moz-transform-origin", + "-ms-transform-origin", + "-o-transform-origin", + "transform-origin", + "-webkit-animation", + "-moz-animation", + "-ms-animation", + "-o-animation", + "animation", + "-webkit-animation-name", + "-moz-animation-name", + "-ms-animation-name", + "-o-animation-name", + "animation-name", + "-webkit-animation-duration", + "-moz-animation-duration", + "-ms-animation-duration", + "-o-animation-duration", + "animation-duration", + "-webkit-animation-play-state", + "-moz-animation-play-state", + "-ms-animation-play-state", + "-o-animation-play-state", + "animation-play-state", + "-webkit-animation-timing-function", + "-moz-animation-timing-function", + "-ms-animation-timing-function", + "-o-animation-timing-function", + "animation-timing-function", + "-webkit-animation-delay", + "-moz-animation-delay", + "-ms-animation-delay", + "-o-animation-delay", + "animation-delay", + "-webkit-animation-iteration-count", + "-moz-animation-iteration-count", + "-ms-animation-iteration-count", + "-o-animation-iteration-count", + "animation-iteration-count", + "-webkit-animation-direction", + "-moz-animation-direction", + "-ms-animation-direction", + "-o-animation-direction", + "animation-direction" + ] + ] +} diff --git a/src/main/webapp/vendors/bootstrap/less/.csslintrc b/src/main/webapp/vendors/bootstrap/less/.csslintrc new file mode 100644 index 000000000..005b86236 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/.csslintrc @@ -0,0 +1,19 @@ +{ + "adjoining-classes": false, + "box-sizing": false, + "box-model": false, + "compatible-vendor-prefixes": false, + "floats": false, + "font-sizes": false, + "gradients": false, + "important": false, + "known-properties": false, + "outline-none": false, + "qualified-headings": false, + "regex-selectors": false, + "shorthand": false, + "text-indent": false, + "unique-headings": false, + "universal-selector": false, + "unqualified-attributes": false +} diff --git a/src/main/webapp/vendors/bootstrap/less/alerts.less b/src/main/webapp/vendors/bootstrap/less/alerts.less new file mode 100644 index 000000000..c4199db92 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/alerts.less @@ -0,0 +1,73 @@ +// +// Alerts +// -------------------------------------------------- + + +// Base styles +// ------------------------- + +.alert { + padding: @alert-padding; + margin-bottom: @line-height-computed; + border: 1px solid transparent; + border-radius: @alert-border-radius; + + // Headings for larger alerts + h4 { + margin-top: 0; + // Specified for the h4 to prevent conflicts of changing @headings-color + color: inherit; + } + + // Provide class for links that match alerts + .alert-link { + font-weight: @alert-link-font-weight; + } + + // Improve alignment and spacing of inner content + > p, + > ul { + margin-bottom: 0; + } + + > p + p { + margin-top: 5px; + } +} + +// Dismissible alerts +// +// Expand the right padding and account for the close button's positioning. + +.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0. +.alert-dismissible { + padding-right: (@alert-padding + 20); + + // Adjust close link position + .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; + } +} + +// Alternate styles +// +// Generate contextual modifier classes for colorizing the alert. + +.alert-success { + .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text); +} + +.alert-info { + .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text); +} + +.alert-warning { + .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text); +} + +.alert-danger { + .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text); +} diff --git a/src/main/webapp/vendors/bootstrap/less/badges.less b/src/main/webapp/vendors/bootstrap/less/badges.less new file mode 100644 index 000000000..6ee16dca4 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/badges.less @@ -0,0 +1,66 @@ +// +// Badges +// -------------------------------------------------- + + +// Base class +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: @font-size-small; + font-weight: @badge-font-weight; + color: @badge-color; + line-height: @badge-line-height; + vertical-align: middle; + white-space: nowrap; + text-align: center; + background-color: @badge-bg; + border-radius: @badge-border-radius; + + // Empty badges collapse automatically (not available in IE8) + &:empty { + display: none; + } + + // Quick fix for badges in buttons + .btn & { + position: relative; + top: -1px; + } + + .btn-xs &, + .btn-group-xs > .btn & { + top: 0; + padding: 1px 5px; + } + + // Hover state, but only for links + a& { + &:hover, + &:focus { + color: @badge-link-hover-color; + text-decoration: none; + cursor: pointer; + } + } + + // Account for badges in navs + .list-group-item.active > &, + .nav-pills > .active > a > & { + color: @badge-active-color; + background-color: @badge-active-bg; + } + + .list-group-item > & { + float: right; + } + + .list-group-item > & + & { + margin-right: 5px; + } + + .nav-pills > li > a > & { + margin-left: 3px; + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/bootstrap.less b/src/main/webapp/vendors/bootstrap/less/bootstrap.less new file mode 100644 index 000000000..1c0477805 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/bootstrap.less @@ -0,0 +1,56 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +// Core variables and mixins +@import "variables.less"; +@import "mixins.less"; + +// Reset and dependencies +@import "normalize.less"; +@import "print.less"; +@import "glyphicons.less"; + +// Core CSS +@import "scaffolding.less"; +@import "type.less"; +@import "code.less"; +@import "grid.less"; +@import "tables.less"; +@import "forms.less"; +@import "buttons.less"; + +// Components +@import "component-animations.less"; +@import "dropdowns.less"; +@import "button-groups.less"; +@import "input-groups.less"; +@import "navs.less"; +@import "navbar.less"; +@import "breadcrumbs.less"; +@import "pagination.less"; +@import "pager.less"; +@import "labels.less"; +@import "badges.less"; +@import "jumbotron.less"; +@import "thumbnails.less"; +@import "alerts.less"; +@import "progress-bars.less"; +@import "media.less"; +@import "list-group.less"; +@import "panels.less"; +@import "responsive-embed.less"; +@import "wells.less"; +@import "close.less"; + +// Components w/ JavaScript +@import "modals.less"; +@import "tooltip.less"; +@import "popovers.less"; +@import "carousel.less"; + +// Utility classes +@import "utilities.less"; +@import "responsive-utilities.less"; diff --git a/src/main/webapp/vendors/bootstrap/less/breadcrumbs.less b/src/main/webapp/vendors/bootstrap/less/breadcrumbs.less new file mode 100644 index 000000000..cb01d503f --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/breadcrumbs.less @@ -0,0 +1,26 @@ +// +// Breadcrumbs +// -------------------------------------------------- + + +.breadcrumb { + padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal; + margin-bottom: @line-height-computed; + list-style: none; + background-color: @breadcrumb-bg; + border-radius: @border-radius-base; + + > li { + display: inline-block; + + + li:before { + content: "@{breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space + padding: 0 5px; + color: @breadcrumb-color; + } + } + + > .active { + color: @breadcrumb-active-color; + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/button-groups.less b/src/main/webapp/vendors/bootstrap/less/button-groups.less new file mode 100644 index 000000000..293245a65 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/button-groups.less @@ -0,0 +1,244 @@ +// +// Button groups +// -------------------------------------------------- + +// Make the div behave like a button +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; // match .btn alignment given font-size hack above + > .btn { + position: relative; + float: left; + // Bring the "active" button to the front + &:hover, + &:focus, + &:active, + &.active { + z-index: 2; + } + } +} + +// Prevent double borders when buttons are next to each other +.btn-group { + .btn + .btn, + .btn + .btn-group, + .btn-group + .btn, + .btn-group + .btn-group { + margin-left: -1px; + } +} + +// Optional: Group multiple button groups together for a toolbar +.btn-toolbar { + margin-left: -5px; // Offset the first child's margin + &:extend(.clearfix all); + + .btn, + .btn-group, + .input-group { + float: left; + } + > .btn, + > .btn-group, + > .input-group { + margin-left: 5px; + } +} + +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} + +// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match +.btn-group > .btn:first-child { + margin-left: 0; + &:not(:last-child):not(.dropdown-toggle) { + .border-right-radius(0); + } +} +// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + .border-left-radius(0); +} + +// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group) +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) { + > .btn:last-child, + > .dropdown-toggle { + .border-right-radius(0); + } +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + .border-left-radius(0); +} + +// On active and open, don't show outline +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + + +// Sizing +// +// Remix the default button sizing classes into new ones for easier manipulation. + +.btn-group-xs > .btn { &:extend(.btn-xs); } +.btn-group-sm > .btn { &:extend(.btn-sm); } +.btn-group-lg > .btn { &:extend(.btn-lg); } + + +// Split button dropdowns +// ---------------------- + +// Give the line between buttons some depth +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} + +// The clickable button for toggling the menu +// Remove the gradient and set the same inset shadow as the :active state +.btn-group.open .dropdown-toggle { + .box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); + + // Show no shadow for `.btn-link` since it has no other button styles. + &.btn-link { + .box-shadow(none); + } +} + + +// Reposition the caret +.btn .caret { + margin-left: 0; +} +// Carets in other button sizes +.btn-lg .caret { + border-width: @caret-width-large @caret-width-large 0; + border-bottom-width: 0; +} +// Upside down carets for .dropup +.dropup .btn-lg .caret { + border-width: 0 @caret-width-large @caret-width-large; +} + + +// Vertical button groups +// ---------------------- + +.btn-group-vertical { + > .btn, + > .btn-group, + > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; + } + + // Clear floats so dropdown menus can be properly placed + > .btn-group { + &:extend(.clearfix all); + > .btn { + float: none; + } + } + + > .btn + .btn, + > .btn + .btn-group, + > .btn-group + .btn, + > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; + } +} + +.btn-group-vertical > .btn { + &:not(:first-child):not(:last-child) { + border-radius: 0; + } + &:first-child:not(:last-child) { + .border-top-radius(@btn-border-radius-base); + .border-bottom-radius(0); + } + &:last-child:not(:first-child) { + .border-top-radius(0); + .border-bottom-radius(@btn-border-radius-base); + } +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) { + > .btn:last-child, + > .dropdown-toggle { + .border-bottom-radius(0); + } +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + .border-top-radius(0); +} + + +// Justified button groups +// ---------------------- + +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; + > .btn, + > .btn-group { + float: none; + display: table-cell; + width: 1%; + } + > .btn-group .btn { + width: 100%; + } + + > .btn-group .dropdown-menu { + left: auto; + } +} + + +// Checkbox and radio options +// +// In order to support the browser's form validation feedback, powered by the +// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use +// `display: none;` or `visibility: hidden;` as that also hides the popover. +// Simply visually hiding the inputs via `opacity` would leave them clickable in +// certain cases which is prevented by using `clip` and `pointer-events`. +// This way, we ensure a DOM element is visible to position the popover from. +// +// See https://github.com/twbs/bootstrap/pull/12794 and +// https://github.com/twbs/bootstrap/pull/14559 for more information. + +[data-toggle="buttons"] { + > .btn, + > .btn-group > .btn { + input[type="radio"], + input[type="checkbox"] { + position: absolute; + clip: rect(0,0,0,0); + pointer-events: none; + } + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/buttons.less b/src/main/webapp/vendors/bootstrap/less/buttons.less new file mode 100644 index 000000000..9cbb8f416 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/buttons.less @@ -0,0 +1,166 @@ +// +// Buttons +// -------------------------------------------------- + + +// Base styles +// -------------------------------------------------- + +.btn { + display: inline-block; + margin-bottom: 0; // For input.btn + font-weight: @btn-font-weight; + text-align: center; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 + border: 1px solid transparent; + white-space: nowrap; + .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base); + .user-select(none); + + &, + &:active, + &.active { + &:focus, + &.focus { + .tab-focus(); + } + } + + &:hover, + &:focus, + &.focus { + color: @btn-default-color; + text-decoration: none; + } + + &:active, + &.active { + outline: 0; + background-image: none; + .box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); + } + + &.disabled, + &[disabled], + fieldset[disabled] & { + cursor: @cursor-disabled; + .opacity(.65); + .box-shadow(none); + } + + a& { + &.disabled, + fieldset[disabled] & { + pointer-events: none; // Future-proof disabling of clicks on `` elements + } + } +} + + +// Alternate buttons +// -------------------------------------------------- + +.btn-default { + .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border); +} +.btn-primary { + .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border); +} +// Success appears as green +.btn-success { + .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border); +} +// Info appears as blue-green +.btn-info { + .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border); +} +// Warning appears as orange +.btn-warning { + .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border); +} +// Danger and error appear as red +.btn-danger { + .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border); +} + + +// Link buttons +// ------------------------- + +// Make a button look and behave like a link +.btn-link { + color: @link-color; + font-weight: normal; + border-radius: 0; + + &, + &:active, + &.active, + &[disabled], + fieldset[disabled] & { + background-color: transparent; + .box-shadow(none); + } + &, + &:hover, + &:focus, + &:active { + border-color: transparent; + } + &:hover, + &:focus { + color: @link-hover-color; + text-decoration: @link-hover-decoration; + background-color: transparent; + } + &[disabled], + fieldset[disabled] & { + &:hover, + &:focus { + color: @btn-link-disabled-color; + text-decoration: none; + } + } +} + + +// Button Sizes +// -------------------------------------------------- + +.btn-lg { + // line-height: ensure even-numbered height of button next to large input + .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large); +} +.btn-sm { + // line-height: ensure proper height of button next to small input + .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small); +} +.btn-xs { + .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small); +} + + +// Block button +// -------------------------------------------------- + +.btn-block { + display: block; + width: 100%; +} + +// Vertically space out multiple block buttons +.btn-block + .btn-block { + margin-top: 5px; +} + +// Specificity overrides +input[type="submit"], +input[type="reset"], +input[type="button"] { + &.btn-block { + width: 100%; + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/carousel.less b/src/main/webapp/vendors/bootstrap/less/carousel.less new file mode 100644 index 000000000..252011e9e --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/carousel.less @@ -0,0 +1,270 @@ +// +// Carousel +// -------------------------------------------------- + + +// Wrapper for the slide container and indicators +.carousel { + position: relative; +} + +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; + + > .item { + display: none; + position: relative; + .transition(.6s ease-in-out left); + + // Account for jankitude on images + > img, + > a > img { + &:extend(.img-responsive); + line-height: 1; + } + + // WebKit CSS3 transforms for supported devices + @media all and (transform-3d), (-webkit-transform-3d) { + .transition-transform(~'0.6s ease-in-out'); + .backface-visibility(~'hidden'); + .perspective(1000px); + + &.next, + &.active.right { + .translate3d(100%, 0, 0); + left: 0; + } + &.prev, + &.active.left { + .translate3d(-100%, 0, 0); + left: 0; + } + &.next.left, + &.prev.right, + &.active { + .translate3d(0, 0, 0); + left: 0; + } + } + } + + > .active, + > .next, + > .prev { + display: block; + } + + > .active { + left: 0; + } + + > .next, + > .prev { + position: absolute; + top: 0; + width: 100%; + } + + > .next { + left: 100%; + } + > .prev { + left: -100%; + } + > .next.left, + > .prev.right { + left: 0; + } + + > .active.left { + left: -100%; + } + > .active.right { + left: 100%; + } + +} + +// Left/right controls for nav +// --------------------------- + +.carousel-control { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: @carousel-control-width; + .opacity(@carousel-control-opacity); + font-size: @carousel-control-font-size; + color: @carousel-control-color; + text-align: center; + text-shadow: @carousel-text-shadow; + background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug + // We can't have this transition here because WebKit cancels the carousel + // animation if you trip this while in the middle of another animation. + + // Set gradients for backgrounds + &.left { + #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001)); + } + &.right { + left: auto; + right: 0; + #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5)); + } + + // Hover/focus state + &:hover, + &:focus { + outline: 0; + color: @carousel-control-color; + text-decoration: none; + .opacity(.9); + } + + // Toggles + .icon-prev, + .icon-next, + .glyphicon-chevron-left, + .glyphicon-chevron-right { + position: absolute; + top: 50%; + margin-top: -10px; + z-index: 5; + display: inline-block; + } + .icon-prev, + .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; + } + .icon-next, + .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; + } + .icon-prev, + .icon-next { + width: 20px; + height: 20px; + line-height: 1; + font-family: serif; + } + + + .icon-prev { + &:before { + content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039) + } + } + .icon-next { + &:before { + content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A) + } + } +} + +// Optional indicator pips +// +// Add an unordered list with the following class and add a list item for each +// slide your carousel holds. + +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; + + li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid @carousel-indicator-border-color; + border-radius: 10px; + cursor: pointer; + + // IE8-9 hack for event handling + // + // Internet Explorer 8-9 does not support clicks on elements without a set + // `background-color`. We cannot use `filter` since that's not viewed as a + // background color by the browser. Thus, a hack is needed. + // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer + // + // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we + // set alpha transparency for the best results possible. + background-color: #000 \9; // IE8 + background-color: rgba(0,0,0,0); // IE9 + } + .active { + margin: 0; + width: 12px; + height: 12px; + background-color: @carousel-indicator-active-bg; + } +} + +// Optional captions +// ----------------------------- +// Hidden by default for smaller viewports +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: @carousel-caption-color; + text-align: center; + text-shadow: @carousel-text-shadow; + & .btn { + text-shadow: none; // No shadow for button elements in carousel-caption + } +} + + +// Scale up controls for tablets and up +@media screen and (min-width: @screen-sm-min) { + + // Scale up the controls a smidge + .carousel-control { + .glyphicon-chevron-left, + .glyphicon-chevron-right, + .icon-prev, + .icon-next { + width: (@carousel-control-font-size * 1.5); + height: (@carousel-control-font-size * 1.5); + margin-top: (@carousel-control-font-size / -2); + font-size: (@carousel-control-font-size * 1.5); + } + .glyphicon-chevron-left, + .icon-prev { + margin-left: (@carousel-control-font-size / -2); + } + .glyphicon-chevron-right, + .icon-next { + margin-right: (@carousel-control-font-size / -2); + } + } + + // Show and left align the captions + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } + + // Move up the indicators + .carousel-indicators { + bottom: 20px; + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/close.less b/src/main/webapp/vendors/bootstrap/less/close.less new file mode 100644 index 000000000..6d5bfe087 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/close.less @@ -0,0 +1,34 @@ +// +// Close icons +// -------------------------------------------------- + + +.close { + float: right; + font-size: (@font-size-base * 1.5); + font-weight: @close-font-weight; + line-height: 1; + color: @close-color; + text-shadow: @close-text-shadow; + .opacity(.2); + + &:hover, + &:focus { + color: @close-color; + text-decoration: none; + cursor: pointer; + .opacity(.5); + } + + // Additional properties for button version + // iOS requires the button element instead of an anchor tag. + // If you want the anchor version, it requires `href="#"`. + // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile + button& { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/code.less b/src/main/webapp/vendors/bootstrap/less/code.less new file mode 100644 index 000000000..a08b4d48c --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/code.less @@ -0,0 +1,69 @@ +// +// Code (inline and block) +// -------------------------------------------------- + + +// Inline and block code styles +code, +kbd, +pre, +samp { + font-family: @font-family-monospace; +} + +// Inline code +code { + padding: 2px 4px; + font-size: 90%; + color: @code-color; + background-color: @code-bg; + border-radius: @border-radius-base; +} + +// User input typically entered via keyboard +kbd { + padding: 2px 4px; + font-size: 90%; + color: @kbd-color; + background-color: @kbd-bg; + border-radius: @border-radius-small; + box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); + + kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + box-shadow: none; + } +} + +// Blocks of code +pre { + display: block; + padding: ((@line-height-computed - 1) / 2); + margin: 0 0 (@line-height-computed / 2); + font-size: (@font-size-base - 1); // 14px to 13px + line-height: @line-height-base; + word-break: break-all; + word-wrap: break-word; + color: @pre-color; + background-color: @pre-bg; + border: 1px solid @pre-border-color; + border-radius: @border-radius-base; + + // Account for some code outputs that place code tags in pre tags + code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; + } +} + +// Enable scrollable blocks of code +.pre-scrollable { + max-height: @pre-scrollable-max-height; + overflow-y: scroll; +} diff --git a/src/main/webapp/vendors/bootstrap/less/component-animations.less b/src/main/webapp/vendors/bootstrap/less/component-animations.less new file mode 100644 index 000000000..0bcee910a --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/component-animations.less @@ -0,0 +1,33 @@ +// +// Component animations +// -------------------------------------------------- + +// Heads up! +// +// We don't use the `.opacity()` mixin here since it causes a bug with text +// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552. + +.fade { + opacity: 0; + .transition(opacity .15s linear); + &.in { + opacity: 1; + } +} + +.collapse { + display: none; + + &.in { display: block; } + tr&.in { display: table-row; } + tbody&.in { display: table-row-group; } +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + .transition-property(~"height, visibility"); + .transition-duration(.35s); + .transition-timing-function(ease); +} diff --git a/src/main/webapp/vendors/bootstrap/less/dropdowns.less b/src/main/webapp/vendors/bootstrap/less/dropdowns.less new file mode 100644 index 000000000..f6876c1a9 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/dropdowns.less @@ -0,0 +1,216 @@ +// +// Dropdown menus +// -------------------------------------------------- + + +// Dropdown arrow/caret +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: @caret-width-base dashed; + border-top: @caret-width-base solid ~"\9"; // IE8 + border-right: @caret-width-base solid transparent; + border-left: @caret-width-base solid transparent; +} + +// The dropdown wrapper (div) +.dropup, +.dropdown { + position: relative; +} + +// Prevent the focus on the dropdown toggle when closing dropdowns +.dropdown-toggle:focus { + outline: 0; +} + +// The dropdown menu (ul) +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: @zindex-dropdown; + display: none; // none by default, but block on "open" of the menu + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; // override default ul + list-style: none; + font-size: @font-size-base; + text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) + background-color: @dropdown-bg; + border: 1px solid @dropdown-fallback-border; // IE8 fallback + border: 1px solid @dropdown-border; + border-radius: @border-radius-base; + .box-shadow(0 6px 12px rgba(0,0,0,.175)); + background-clip: padding-box; + + // Aligns the dropdown menu to right + // + // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]` + &.pull-right { + right: 0; + left: auto; + } + + // Dividers (basically an hr) within the dropdown + .divider { + .nav-divider(@dropdown-divider-bg); + } + + // Links within the dropdown menu + > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: @line-height-base; + color: @dropdown-link-color; + white-space: nowrap; // prevent links from randomly breaking onto new lines + } +} + +// Hover/Focus state +.dropdown-menu > li > a { + &:hover, + &:focus { + text-decoration: none; + color: @dropdown-link-hover-color; + background-color: @dropdown-link-hover-bg; + } +} + +// Active state +.dropdown-menu > .active > a { + &, + &:hover, + &:focus { + color: @dropdown-link-active-color; + text-decoration: none; + outline: 0; + background-color: @dropdown-link-active-bg; + } +} + +// Disabled state +// +// Gray out text and ensure the hover/focus state remains gray + +.dropdown-menu > .disabled > a { + &, + &:hover, + &:focus { + color: @dropdown-link-disabled-color; + } + + // Nuke hover/focus effects + &:hover, + &:focus { + text-decoration: none; + background-color: transparent; + background-image: none; // Remove CSS gradient + .reset-filter(); + cursor: @cursor-disabled; + } +} + +// Open state for the dropdown +.open { + // Show the menu + > .dropdown-menu { + display: block; + } + + // Remove the outline when :focus is triggered + > a { + outline: 0; + } +} + +// Menu positioning +// +// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown +// menu with the parent. +.dropdown-menu-right { + left: auto; // Reset the default from `.dropdown-menu` + right: 0; +} +// With v3, we enabled auto-flipping if you have a dropdown within a right +// aligned nav component. To enable the undoing of that, we provide an override +// to restore the default dropdown menu alignment. +// +// This is only for left-aligning a dropdown menu within a `.navbar-right` or +// `.pull-right` nav component. +.dropdown-menu-left { + left: 0; + right: auto; +} + +// Dropdown section headers +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: @font-size-small; + line-height: @line-height-base; + color: @dropdown-header-color; + white-space: nowrap; // as with > li > a +} + +// Backdrop to catch body clicks on mobile, etc. +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: (@zindex-dropdown - 10); +} + +// Right aligned dropdowns +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +// Allow for dropdowns to go bottom up (aka, dropup-menu) +// +// Just add .dropup after the standard .dropdown class and you're set, bro. +// TODO: abstract this so that the navbar fixed styles are not placed here? + +.dropup, +.navbar-fixed-bottom .dropdown { + // Reverse the caret + .caret { + border-top: 0; + border-bottom: @caret-width-base dashed; + border-bottom: @caret-width-base solid ~"\9"; // IE8 + content: ""; + } + // Different positioning for bottom up menu + .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; + } +} + + +// Component alignment +// +// Reiterate per navbar.less and the modified component alignment there. + +@media (min-width: @grid-float-breakpoint) { + .navbar-right { + .dropdown-menu { + .dropdown-menu-right(); + } + // Necessary for overrides of the default right aligned menu. + // Will remove come v4 in all likelihood. + .dropdown-menu-left { + .dropdown-menu-left(); + } + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/forms.less b/src/main/webapp/vendors/bootstrap/less/forms.less new file mode 100644 index 000000000..e8b071a13 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/forms.less @@ -0,0 +1,613 @@ +// +// Forms +// -------------------------------------------------- + + +// Normalize non-controls +// +// Restyle and baseline non-control form elements. + +fieldset { + padding: 0; + margin: 0; + border: 0; + // Chrome and Firefox set a `min-width: min-content;` on fieldsets, + // so we reset that to ensure it behaves more like a standard block element. + // See https://github.com/twbs/bootstrap/issues/12359. + min-width: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: @line-height-computed; + font-size: (@font-size-base * 1.5); + line-height: inherit; + color: @legend-color; + border: 0; + border-bottom: 1px solid @legend-border-color; +} + +label { + display: inline-block; + max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141) + margin-bottom: 5px; + font-weight: bold; +} + + +// Normalize form controls +// +// While most of our form styles require extra classes, some basic normalization +// is required to ensure optimum display with or without those classes to better +// address browser inconsistencies. + +// Override content-box in Normalize (* isn't specific enough) +input[type="search"] { + .box-sizing(border-box); +} + +// Position radios and checkboxes better +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; // IE8-9 + line-height: normal; +} + +input[type="file"] { + display: block; +} + +// Make range inputs behave like textual form controls +input[type="range"] { + display: block; + width: 100%; +} + +// Make multiple select elements height not fixed +select[multiple], +select[size] { + height: auto; +} + +// Focus for file, radio, and checkbox +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + .tab-focus(); +} + +// Adjust output element +output { + display: block; + padding-top: (@padding-base-vertical + 1); + font-size: @font-size-base; + line-height: @line-height-base; + color: @input-color; +} + + +// Common form controls +// +// Shared size and type resets for form controls. Apply `.form-control` to any +// of the following form controls: +// +// select +// textarea +// input[type="text"] +// input[type="password"] +// input[type="datetime"] +// input[type="datetime-local"] +// input[type="date"] +// input[type="month"] +// input[type="time"] +// input[type="week"] +// input[type="number"] +// input[type="email"] +// input[type="url"] +// input[type="search"] +// input[type="tel"] +// input[type="color"] + +.form-control { + display: block; + width: 100%; + height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border) + padding: @padding-base-vertical @padding-base-horizontal; + font-size: @font-size-base; + line-height: @line-height-base; + color: @input-color; + background-color: @input-bg; + background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 + border: 1px solid @input-border; + border-radius: @input-border-radius; // Note: This has no effect on s in CSS. + .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); + .transition(~"border-color ease-in-out .15s, box-shadow ease-in-out .15s"); + + // Customize the `:focus` state to imitate native WebKit styles. + .form-control-focus(); + + // Placeholder + .placeholder(); + + // Unstyle the caret on `` +// element gets special love because it's special, and that's a fact! +.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) { + height: @input-height; + padding: @padding-vertical @padding-horizontal; + font-size: @font-size; + line-height: @line-height; + border-radius: @border-radius; + + select& { + height: @input-height; + line-height: @input-height; + } + + textarea&, + select[multiple]& { + height: auto; + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/mixins/gradients.less b/src/main/webapp/vendors/bootstrap/less/mixins/gradients.less new file mode 100644 index 000000000..0b88a89cc --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/mixins/gradients.less @@ -0,0 +1,59 @@ +// Gradients + +#gradient { + + // Horizontal gradient, from left to right + // + // Creates two color stops, start and end, by specifying a color and position for each color stop. + // Color stops are not available in IE9 and below. + .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) { + background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+ + background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12 + background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+ + background-repeat: repeat-x; + filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down + } + + // Vertical gradient, from top to bottom + // + // Creates two color stops, start and end, by specifying a color and position for each color stop. + // Color stops are not available in IE9 and below. + .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) { + background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+ + background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12 + background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+ + background-repeat: repeat-x; + filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down + } + + .directional(@start-color: #555; @end-color: #333; @deg: 45deg) { + background-repeat: repeat-x; + background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+ + background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12 + background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+ + } + .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) { + background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color); + background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color); + background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color); + background-repeat: no-repeat; + filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback + } + .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) { + background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color); + background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color); + background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color); + background-repeat: no-repeat; + filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback + } + .radial(@inner-color: #555; @outer-color: #333) { + background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color); + background-image: radial-gradient(circle, @inner-color, @outer-color); + background-repeat: no-repeat; + } + .striped(@color: rgba(255,255,255,.15); @angle: 45deg) { + background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent); + background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent); + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/mixins/grid-framework.less b/src/main/webapp/vendors/bootstrap/less/mixins/grid-framework.less new file mode 100644 index 000000000..8c23eed24 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/mixins/grid-framework.less @@ -0,0 +1,91 @@ +// Framework grid generation +// +// Used only by Bootstrap to generate the correct number of grid classes given +// any value of `@grid-columns`. + +.make-grid-columns() { + // Common styles for all sizes of grid columns, widths 1-12 + .col(@index) { // initial + @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}"; + .col((@index + 1), @item); + } + .col(@index, @list) when (@index =< @grid-columns) { // general; "=<" isn't a typo + @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}"; + .col((@index + 1), ~"@{list}, @{item}"); + } + .col(@index, @list) when (@index > @grid-columns) { // terminal + @{list} { + position: relative; + // Prevent columns from collapsing when empty + min-height: 1px; + // Inner gutter via padding + padding-left: ceil((@grid-gutter-width / 2)); + padding-right: floor((@grid-gutter-width / 2)); + } + } + .col(1); // kickstart it +} + +.float-grid-columns(@class) { + .col(@index) { // initial + @item: ~".col-@{class}-@{index}"; + .col((@index + 1), @item); + } + .col(@index, @list) when (@index =< @grid-columns) { // general + @item: ~".col-@{class}-@{index}"; + .col((@index + 1), ~"@{list}, @{item}"); + } + .col(@index, @list) when (@index > @grid-columns) { // terminal + @{list} { + float: left; + } + } + .col(1); // kickstart it +} + +.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) { + .col-@{class}-@{index} { + width: percentage((@index / @grid-columns)); + } +} +.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) { + .col-@{class}-push-@{index} { + left: percentage((@index / @grid-columns)); + } +} +.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) { + .col-@{class}-push-0 { + left: auto; + } +} +.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) { + .col-@{class}-pull-@{index} { + right: percentage((@index / @grid-columns)); + } +} +.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) { + .col-@{class}-pull-0 { + right: auto; + } +} +.calc-grid-column(@index, @class, @type) when (@type = offset) { + .col-@{class}-offset-@{index} { + margin-left: percentage((@index / @grid-columns)); + } +} + +// Basic looping in LESS +.loop-grid-columns(@index, @class, @type) when (@index >= 0) { + .calc-grid-column(@index, @class, @type); + // next iteration + .loop-grid-columns((@index - 1), @class, @type); +} + +// Create grid for specific class +.make-grid(@class) { + .float-grid-columns(@class); + .loop-grid-columns(@grid-columns, @class, width); + .loop-grid-columns(@grid-columns, @class, pull); + .loop-grid-columns(@grid-columns, @class, push); + .loop-grid-columns(@grid-columns, @class, offset); +} diff --git a/src/main/webapp/vendors/bootstrap/less/mixins/grid.less b/src/main/webapp/vendors/bootstrap/less/mixins/grid.less new file mode 100644 index 000000000..df496d0b3 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/mixins/grid.less @@ -0,0 +1,122 @@ +// Grid system +// +// Generate semantic grid columns with these mixins. + +// Centered container element +.container-fixed(@gutter: @grid-gutter-width) { + margin-right: auto; + margin-left: auto; + padding-left: floor((@gutter / 2)); + padding-right: ceil((@gutter / 2)); + &:extend(.clearfix all); +} + +// Creates a wrapper for a series of columns +.make-row(@gutter: @grid-gutter-width) { + margin-left: ceil((@gutter / -2)); + margin-right: floor((@gutter / -2)); + &:extend(.clearfix all); +} + +// Generate the extra small columns +.make-xs-column(@columns; @gutter: @grid-gutter-width) { + position: relative; + float: left; + width: percentage((@columns / @grid-columns)); + min-height: 1px; + padding-left: (@gutter / 2); + padding-right: (@gutter / 2); +} +.make-xs-column-offset(@columns) { + margin-left: percentage((@columns / @grid-columns)); +} +.make-xs-column-push(@columns) { + left: percentage((@columns / @grid-columns)); +} +.make-xs-column-pull(@columns) { + right: percentage((@columns / @grid-columns)); +} + +// Generate the small columns +.make-sm-column(@columns; @gutter: @grid-gutter-width) { + position: relative; + min-height: 1px; + padding-left: (@gutter / 2); + padding-right: (@gutter / 2); + + @media (min-width: @screen-sm-min) { + float: left; + width: percentage((@columns / @grid-columns)); + } +} +.make-sm-column-offset(@columns) { + @media (min-width: @screen-sm-min) { + margin-left: percentage((@columns / @grid-columns)); + } +} +.make-sm-column-push(@columns) { + @media (min-width: @screen-sm-min) { + left: percentage((@columns / @grid-columns)); + } +} +.make-sm-column-pull(@columns) { + @media (min-width: @screen-sm-min) { + right: percentage((@columns / @grid-columns)); + } +} + +// Generate the medium columns +.make-md-column(@columns; @gutter: @grid-gutter-width) { + position: relative; + min-height: 1px; + padding-left: (@gutter / 2); + padding-right: (@gutter / 2); + + @media (min-width: @screen-md-min) { + float: left; + width: percentage((@columns / @grid-columns)); + } +} +.make-md-column-offset(@columns) { + @media (min-width: @screen-md-min) { + margin-left: percentage((@columns / @grid-columns)); + } +} +.make-md-column-push(@columns) { + @media (min-width: @screen-md-min) { + left: percentage((@columns / @grid-columns)); + } +} +.make-md-column-pull(@columns) { + @media (min-width: @screen-md-min) { + right: percentage((@columns / @grid-columns)); + } +} + +// Generate the large columns +.make-lg-column(@columns; @gutter: @grid-gutter-width) { + position: relative; + min-height: 1px; + padding-left: (@gutter / 2); + padding-right: (@gutter / 2); + + @media (min-width: @screen-lg-min) { + float: left; + width: percentage((@columns / @grid-columns)); + } +} +.make-lg-column-offset(@columns) { + @media (min-width: @screen-lg-min) { + margin-left: percentage((@columns / @grid-columns)); + } +} +.make-lg-column-push(@columns) { + @media (min-width: @screen-lg-min) { + left: percentage((@columns / @grid-columns)); + } +} +.make-lg-column-pull(@columns) { + @media (min-width: @screen-lg-min) { + right: percentage((@columns / @grid-columns)); + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/mixins/hide-text.less b/src/main/webapp/vendors/bootstrap/less/mixins/hide-text.less new file mode 100644 index 000000000..2bb84a3b4 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/mixins/hide-text.less @@ -0,0 +1,21 @@ +// CSS image replacement +// +// Heads up! v3 launched with only `.hide-text()`, but per our pattern for +// mixins being reused as classes with the same name, this doesn't hold up. As +// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. +// +// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757 + +// Deprecated as of v3.0.1 (has been removed in v4) +.hide-text() { + font: ~"0/0" a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +// New mixin to use as of v3.0.1 +.text-hide() { + .hide-text(); +} diff --git a/src/main/webapp/vendors/bootstrap/less/mixins/image.less b/src/main/webapp/vendors/bootstrap/less/mixins/image.less new file mode 100644 index 000000000..f233cb3e1 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/mixins/image.less @@ -0,0 +1,33 @@ +// Image Mixins +// - Responsive image +// - Retina image + + +// Responsive image +// +// Keep images from scaling beyond the width of their parents. +.img-responsive(@display: block) { + display: @display; + max-width: 100%; // Part 1: Set a maximum relative to the parent + height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching +} + + +// Retina image +// +// Short retina mixin for setting background-image and -size. Note that the +// spelling of `min--moz-device-pixel-ratio` is intentional. +.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) { + background-image: url("@{file-1x}"); + + @media + only screen and (-webkit-min-device-pixel-ratio: 2), + only screen and ( min--moz-device-pixel-ratio: 2), + only screen and ( -o-min-device-pixel-ratio: 2/1), + only screen and ( min-device-pixel-ratio: 2), + only screen and ( min-resolution: 192dpi), + only screen and ( min-resolution: 2dppx) { + background-image: url("@{file-2x}"); + background-size: @width-1x @height-1x; + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/mixins/labels.less b/src/main/webapp/vendors/bootstrap/less/mixins/labels.less new file mode 100644 index 000000000..9f7a67ee3 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/mixins/labels.less @@ -0,0 +1,12 @@ +// Labels + +.label-variant(@color) { + background-color: @color; + + &[href] { + &:hover, + &:focus { + background-color: darken(@color, 10%); + } + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/mixins/list-group.less b/src/main/webapp/vendors/bootstrap/less/mixins/list-group.less new file mode 100644 index 000000000..03aa19069 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/mixins/list-group.less @@ -0,0 +1,30 @@ +// List Groups + +.list-group-item-variant(@state; @background; @color) { + .list-group-item-@{state} { + color: @color; + background-color: @background; + + a&, + button& { + color: @color; + + .list-group-item-heading { + color: inherit; + } + + &:hover, + &:focus { + color: @color; + background-color: darken(@background, 5%); + } + &.active, + &.active:hover, + &.active:focus { + color: #fff; + background-color: @color; + border-color: @color; + } + } + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/mixins/nav-divider.less b/src/main/webapp/vendors/bootstrap/less/mixins/nav-divider.less new file mode 100644 index 000000000..feb1e9ed0 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/mixins/nav-divider.less @@ -0,0 +1,10 @@ +// Horizontal dividers +// +// Dividers (basically an hr) within dropdowns and nav lists + +.nav-divider(@color: #e5e5e5) { + height: 1px; + margin: ((@line-height-computed / 2) - 1) 0; + overflow: hidden; + background-color: @color; +} diff --git a/src/main/webapp/vendors/bootstrap/less/mixins/nav-vertical-align.less b/src/main/webapp/vendors/bootstrap/less/mixins/nav-vertical-align.less new file mode 100644 index 000000000..d458c7861 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/mixins/nav-vertical-align.less @@ -0,0 +1,9 @@ +// Navbar vertical align +// +// Vertically center elements in the navbar. +// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin. + +.navbar-vertical-align(@element-height) { + margin-top: ((@navbar-height - @element-height) / 2); + margin-bottom: ((@navbar-height - @element-height) / 2); +} diff --git a/src/main/webapp/vendors/bootstrap/less/mixins/opacity.less b/src/main/webapp/vendors/bootstrap/less/mixins/opacity.less new file mode 100644 index 000000000..33ed25ce6 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/mixins/opacity.less @@ -0,0 +1,8 @@ +// Opacity + +.opacity(@opacity) { + opacity: @opacity; + // IE8 filter + @opacity-ie: (@opacity * 100); + filter: ~"alpha(opacity=@{opacity-ie})"; +} diff --git a/src/main/webapp/vendors/bootstrap/less/mixins/pagination.less b/src/main/webapp/vendors/bootstrap/less/mixins/pagination.less new file mode 100644 index 000000000..618804f2d --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/mixins/pagination.less @@ -0,0 +1,24 @@ +// Pagination + +.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) { + > li { + > a, + > span { + padding: @padding-vertical @padding-horizontal; + font-size: @font-size; + line-height: @line-height; + } + &:first-child { + > a, + > span { + .border-left-radius(@border-radius); + } + } + &:last-child { + > a, + > span { + .border-right-radius(@border-radius); + } + } + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/mixins/panels.less b/src/main/webapp/vendors/bootstrap/less/mixins/panels.less new file mode 100644 index 000000000..49ee10d4a --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/mixins/panels.less @@ -0,0 +1,24 @@ +// Panels + +.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) { + border-color: @border; + + & > .panel-heading { + color: @heading-text-color; + background-color: @heading-bg-color; + border-color: @heading-border; + + + .panel-collapse > .panel-body { + border-top-color: @border; + } + .badge { + color: @heading-bg-color; + background-color: @heading-text-color; + } + } + & > .panel-footer { + + .panel-collapse > .panel-body { + border-bottom-color: @border; + } + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/mixins/progress-bar.less b/src/main/webapp/vendors/bootstrap/less/mixins/progress-bar.less new file mode 100644 index 000000000..f07996a34 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/mixins/progress-bar.less @@ -0,0 +1,10 @@ +// Progress bars + +.progress-bar-variant(@color) { + background-color: @color; + + // Deprecated parent class requirement as of v3.2.0 + .progress-striped & { + #gradient > .striped(); + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/mixins/reset-filter.less b/src/main/webapp/vendors/bootstrap/less/mixins/reset-filter.less new file mode 100644 index 000000000..68cdb5e18 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/mixins/reset-filter.less @@ -0,0 +1,8 @@ +// Reset filters for IE +// +// When you need to remove a gradient background, do not forget to use this to reset +// the IE filter for IE9 and below. + +.reset-filter() { + filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)")); +} diff --git a/src/main/webapp/vendors/bootstrap/less/mixins/reset-text.less b/src/main/webapp/vendors/bootstrap/less/mixins/reset-text.less new file mode 100644 index 000000000..58dd4d19b --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/mixins/reset-text.less @@ -0,0 +1,18 @@ +.reset-text() { + font-family: @font-family-base; + // We deliberately do NOT reset font-size. + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: @line-height-base; + text-align: left; // Fallback for where `start` is not supported + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; +} diff --git a/src/main/webapp/vendors/bootstrap/less/mixins/resize.less b/src/main/webapp/vendors/bootstrap/less/mixins/resize.less new file mode 100644 index 000000000..3acd3afdb --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/mixins/resize.less @@ -0,0 +1,6 @@ +// Resize anything + +.resizable(@direction) { + resize: @direction; // Options: horizontal, vertical, both + overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible` +} diff --git a/src/main/webapp/vendors/bootstrap/less/mixins/responsive-visibility.less b/src/main/webapp/vendors/bootstrap/less/mixins/responsive-visibility.less new file mode 100644 index 000000000..ecf1e979f --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/mixins/responsive-visibility.less @@ -0,0 +1,15 @@ +// Responsive utilities + +// +// More easily include all the states for responsive-utilities.less. +.responsive-visibility() { + display: block !important; + table& { display: table !important; } + tr& { display: table-row !important; } + th&, + td& { display: table-cell !important; } +} + +.responsive-invisibility() { + display: none !important; +} diff --git a/src/main/webapp/vendors/bootstrap/less/mixins/size.less b/src/main/webapp/vendors/bootstrap/less/mixins/size.less new file mode 100644 index 000000000..a8be65089 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/mixins/size.less @@ -0,0 +1,10 @@ +// Sizing shortcuts + +.size(@width; @height) { + width: @width; + height: @height; +} + +.square(@size) { + .size(@size; @size); +} diff --git a/src/main/webapp/vendors/bootstrap/less/mixins/tab-focus.less b/src/main/webapp/vendors/bootstrap/less/mixins/tab-focus.less new file mode 100644 index 000000000..1f1f05ab0 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/mixins/tab-focus.less @@ -0,0 +1,9 @@ +// WebKit-style focus + +.tab-focus() { + // Default + outline: thin dotted; + // WebKit + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} diff --git a/src/main/webapp/vendors/bootstrap/less/mixins/table-row.less b/src/main/webapp/vendors/bootstrap/less/mixins/table-row.less new file mode 100644 index 000000000..0f287f1a8 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/mixins/table-row.less @@ -0,0 +1,28 @@ +// Tables + +.table-row-variant(@state; @background) { + // Exact selectors below required to override `.table-striped` and prevent + // inheritance to nested tables. + .table > thead > tr, + .table > tbody > tr, + .table > tfoot > tr { + > td.@{state}, + > th.@{state}, + &.@{state} > td, + &.@{state} > th { + background-color: @background; + } + } + + // Hover states for `.table-hover` + // Note: this is not available for cells or rows within `thead` or `tfoot`. + .table-hover > tbody > tr { + > td.@{state}:hover, + > th.@{state}:hover, + &.@{state}:hover > td, + &:hover > .@{state}, + &.@{state}:hover > th { + background-color: darken(@background, 5%); + } + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/mixins/text-emphasis.less b/src/main/webapp/vendors/bootstrap/less/mixins/text-emphasis.less new file mode 100644 index 000000000..9e8a77a69 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/mixins/text-emphasis.less @@ -0,0 +1,9 @@ +// Typography + +.text-emphasis-variant(@color) { + color: @color; + a&:hover, + a&:focus { + color: darken(@color, 10%); + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/mixins/text-overflow.less b/src/main/webapp/vendors/bootstrap/less/mixins/text-overflow.less new file mode 100644 index 000000000..c11ad2fb7 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/mixins/text-overflow.less @@ -0,0 +1,8 @@ +// Text overflow +// Requires inline-block or block for proper styling + +.text-overflow() { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} diff --git a/src/main/webapp/vendors/bootstrap/less/mixins/vendor-prefixes.less b/src/main/webapp/vendors/bootstrap/less/mixins/vendor-prefixes.less new file mode 100644 index 000000000..2b5e74b99 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/mixins/vendor-prefixes.less @@ -0,0 +1,227 @@ +// Vendor Prefixes +// +// All vendor mixins are deprecated as of v3.2.0 due to the introduction of +// Autoprefixer in our Gruntfile. They have been removed in v4. + +// - Animations +// - Backface visibility +// - Box shadow +// - Box sizing +// - Content columns +// - Hyphens +// - Placeholder text +// - Transformations +// - Transitions +// - User Select + + +// Animations +.animation(@animation) { + -webkit-animation: @animation; + -o-animation: @animation; + animation: @animation; +} +.animation-name(@name) { + -webkit-animation-name: @name; + animation-name: @name; +} +.animation-duration(@duration) { + -webkit-animation-duration: @duration; + animation-duration: @duration; +} +.animation-timing-function(@timing-function) { + -webkit-animation-timing-function: @timing-function; + animation-timing-function: @timing-function; +} +.animation-delay(@delay) { + -webkit-animation-delay: @delay; + animation-delay: @delay; +} +.animation-iteration-count(@iteration-count) { + -webkit-animation-iteration-count: @iteration-count; + animation-iteration-count: @iteration-count; +} +.animation-direction(@direction) { + -webkit-animation-direction: @direction; + animation-direction: @direction; +} +.animation-fill-mode(@fill-mode) { + -webkit-animation-fill-mode: @fill-mode; + animation-fill-mode: @fill-mode; +} + +// Backface visibility +// Prevent browsers from flickering when using CSS 3D transforms. +// Default value is `visible`, but can be changed to `hidden` + +.backface-visibility(@visibility) { + -webkit-backface-visibility: @visibility; + -moz-backface-visibility: @visibility; + backface-visibility: @visibility; +} + +// Drop shadows +// +// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's +// supported browsers that have box shadow capabilities now support it. + +.box-shadow(@shadow) { + -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1 + box-shadow: @shadow; +} + +// Box sizing +.box-sizing(@boxmodel) { + -webkit-box-sizing: @boxmodel; + -moz-box-sizing: @boxmodel; + box-sizing: @boxmodel; +} + +// CSS3 Content Columns +.content-columns(@column-count; @column-gap: @grid-gutter-width) { + -webkit-column-count: @column-count; + -moz-column-count: @column-count; + column-count: @column-count; + -webkit-column-gap: @column-gap; + -moz-column-gap: @column-gap; + column-gap: @column-gap; +} + +// Optional hyphenation +.hyphens(@mode: auto) { + word-wrap: break-word; + -webkit-hyphens: @mode; + -moz-hyphens: @mode; + -ms-hyphens: @mode; // IE10+ + -o-hyphens: @mode; + hyphens: @mode; +} + +// Placeholder text +.placeholder(@color: @input-color-placeholder) { + // Firefox + &::-moz-placeholder { + color: @color; + opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526 + } + &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+ + &::-webkit-input-placeholder { color: @color; } // Safari and Chrome +} + +// Transformations +.scale(@ratio) { + -webkit-transform: scale(@ratio); + -ms-transform: scale(@ratio); // IE9 only + -o-transform: scale(@ratio); + transform: scale(@ratio); +} +.scale(@ratioX; @ratioY) { + -webkit-transform: scale(@ratioX, @ratioY); + -ms-transform: scale(@ratioX, @ratioY); // IE9 only + -o-transform: scale(@ratioX, @ratioY); + transform: scale(@ratioX, @ratioY); +} +.scaleX(@ratio) { + -webkit-transform: scaleX(@ratio); + -ms-transform: scaleX(@ratio); // IE9 only + -o-transform: scaleX(@ratio); + transform: scaleX(@ratio); +} +.scaleY(@ratio) { + -webkit-transform: scaleY(@ratio); + -ms-transform: scaleY(@ratio); // IE9 only + -o-transform: scaleY(@ratio); + transform: scaleY(@ratio); +} +.skew(@x; @y) { + -webkit-transform: skewX(@x) skewY(@y); + -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+ + -o-transform: skewX(@x) skewY(@y); + transform: skewX(@x) skewY(@y); +} +.translate(@x; @y) { + -webkit-transform: translate(@x, @y); + -ms-transform: translate(@x, @y); // IE9 only + -o-transform: translate(@x, @y); + transform: translate(@x, @y); +} +.translate3d(@x; @y; @z) { + -webkit-transform: translate3d(@x, @y, @z); + transform: translate3d(@x, @y, @z); +} +.rotate(@degrees) { + -webkit-transform: rotate(@degrees); + -ms-transform: rotate(@degrees); // IE9 only + -o-transform: rotate(@degrees); + transform: rotate(@degrees); +} +.rotateX(@degrees) { + -webkit-transform: rotateX(@degrees); + -ms-transform: rotateX(@degrees); // IE9 only + -o-transform: rotateX(@degrees); + transform: rotateX(@degrees); +} +.rotateY(@degrees) { + -webkit-transform: rotateY(@degrees); + -ms-transform: rotateY(@degrees); // IE9 only + -o-transform: rotateY(@degrees); + transform: rotateY(@degrees); +} +.perspective(@perspective) { + -webkit-perspective: @perspective; + -moz-perspective: @perspective; + perspective: @perspective; +} +.perspective-origin(@perspective) { + -webkit-perspective-origin: @perspective; + -moz-perspective-origin: @perspective; + perspective-origin: @perspective; +} +.transform-origin(@origin) { + -webkit-transform-origin: @origin; + -moz-transform-origin: @origin; + -ms-transform-origin: @origin; // IE9 only + transform-origin: @origin; +} + + +// Transitions + +.transition(@transition) { + -webkit-transition: @transition; + -o-transition: @transition; + transition: @transition; +} +.transition-property(@transition-property) { + -webkit-transition-property: @transition-property; + transition-property: @transition-property; +} +.transition-delay(@transition-delay) { + -webkit-transition-delay: @transition-delay; + transition-delay: @transition-delay; +} +.transition-duration(@transition-duration) { + -webkit-transition-duration: @transition-duration; + transition-duration: @transition-duration; +} +.transition-timing-function(@timing-function) { + -webkit-transition-timing-function: @timing-function; + transition-timing-function: @timing-function; +} +.transition-transform(@transition) { + -webkit-transition: -webkit-transform @transition; + -moz-transition: -moz-transform @transition; + -o-transition: -o-transform @transition; + transition: transform @transition; +} + + +// User select +// For selecting text on the page + +.user-select(@select) { + -webkit-user-select: @select; + -moz-user-select: @select; + -ms-user-select: @select; // IE10+ + user-select: @select; +} diff --git a/src/main/webapp/vendors/bootstrap/less/modals.less b/src/main/webapp/vendors/bootstrap/less/modals.less new file mode 100644 index 000000000..767ce36ba --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/modals.less @@ -0,0 +1,150 @@ +// +// Modals +// -------------------------------------------------- + +// .modal-open - body class for killing the scroll +// .modal - container to scroll within +// .modal-dialog - positioning shell for the actual modal +// .modal-content - actual modal w/ bg and corners and shit + +// Kill the scroll on the body +.modal-open { + overflow: hidden; +} + +// Container that the modal scrolls within +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: @zindex-modal; + -webkit-overflow-scrolling: touch; + + // Prevent Chrome on Windows from adding a focus outline. For details, see + // https://github.com/twbs/bootstrap/pull/10951. + outline: 0; + + // When fading in the modal, animate it to slide down + &.fade .modal-dialog { + .translate(0, -25%); + .transition-transform(~"0.3s ease-out"); + } + &.in .modal-dialog { .translate(0, 0) } +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} + +// Shell div to position the modal with bottom padding +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} + +// Actual modal +.modal-content { + position: relative; + background-color: @modal-content-bg; + border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc) + border: 1px solid @modal-content-border-color; + border-radius: @border-radius-large; + .box-shadow(0 3px 9px rgba(0,0,0,.5)); + background-clip: padding-box; + // Remove focus outline from opened modal + outline: 0; +} + +// Modal background +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: @zindex-modal-background; + background-color: @modal-backdrop-bg; + // Fade for backdrop + &.fade { .opacity(0); } + &.in { .opacity(@modal-backdrop-opacity); } +} + +// Modal header +// Top section of the modal w/ title and dismiss +.modal-header { + padding: @modal-title-padding; + border-bottom: 1px solid @modal-header-border-color; + &:extend(.clearfix all); +} +// Close icon +.modal-header .close { + margin-top: -2px; +} + +// Title text within header +.modal-title { + margin: 0; + line-height: @modal-title-line-height; +} + +// Modal body +// Where all modal content resides (sibling of .modal-header and .modal-footer) +.modal-body { + position: relative; + padding: @modal-inner-padding; +} + +// Footer (for actions) +.modal-footer { + padding: @modal-inner-padding; + text-align: right; // right align buttons + border-top: 1px solid @modal-footer-border-color; + &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons + + // Properly space out buttons + .btn + .btn { + margin-left: 5px; + margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs + } + // but override that for button groups + .btn-group .btn + .btn { + margin-left: -1px; + } + // and override it for block buttons as well + .btn-block + .btn-block { + margin-left: 0; + } +} + +// Measure scrollbar width for padding body during modal show/hide +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +// Scale up the modal +@media (min-width: @screen-sm-min) { + // Automatically set modal's width for larger viewports + .modal-dialog { + width: @modal-md; + margin: 30px auto; + } + .modal-content { + .box-shadow(0 5px 15px rgba(0,0,0,.5)); + } + + // Modal sizes + .modal-sm { width: @modal-sm; } +} + +@media (min-width: @screen-md-min) { + .modal-lg { width: @modal-lg; } +} diff --git a/src/main/webapp/vendors/bootstrap/less/navbar.less b/src/main/webapp/vendors/bootstrap/less/navbar.less new file mode 100644 index 000000000..6d751bb9c --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/navbar.less @@ -0,0 +1,660 @@ +// +// Navbars +// -------------------------------------------------- + + +// Wrapper and base class +// +// Provide a static navbar from which we expand to create full-width, fixed, and +// other navbar variations. + +.navbar { + position: relative; + min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode) + margin-bottom: @navbar-margin-bottom; + border: 1px solid transparent; + + // Prevent floats from breaking the navbar + &:extend(.clearfix all); + + @media (min-width: @grid-float-breakpoint) { + border-radius: @navbar-border-radius; + } +} + + +// Navbar heading +// +// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy +// styling of responsive aspects. + +.navbar-header { + &:extend(.clearfix all); + + @media (min-width: @grid-float-breakpoint) { + float: left; + } +} + + +// Navbar collapse (body) +// +// Group your navbar content into this for easy collapsing and expanding across +// various device sizes. By default, this content is collapsed when <768px, but +// will expand past that for a horizontal display. +// +// To start (on mobile devices) the navbar links, forms, and buttons are stacked +// vertically and include a `max-height` to overflow in case you have too much +// content for the user's viewport. + +.navbar-collapse { + overflow-x: visible; + padding-right: @navbar-padding-horizontal; + padding-left: @navbar-padding-horizontal; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255,255,255,.1); + &:extend(.clearfix all); + -webkit-overflow-scrolling: touch; + + &.in { + overflow-y: auto; + } + + @media (min-width: @grid-float-breakpoint) { + width: auto; + border-top: 0; + box-shadow: none; + + &.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; // Override default setting + overflow: visible !important; + } + + &.in { + overflow-y: visible; + } + + // Undo the collapse side padding for navbars with containers to ensure + // alignment of right-aligned contents. + .navbar-fixed-top &, + .navbar-static-top &, + .navbar-fixed-bottom & { + padding-left: 0; + padding-right: 0; + } + } +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + .navbar-collapse { + max-height: @navbar-collapse-max-height; + + @media (max-device-width: @screen-xs-min) and (orientation: landscape) { + max-height: 200px; + } + } +} + + +// Both navbar header and collapse +// +// When a container is present, change the behavior of the header and collapse. + +.container, +.container-fluid { + > .navbar-header, + > .navbar-collapse { + margin-right: -@navbar-padding-horizontal; + margin-left: -@navbar-padding-horizontal; + + @media (min-width: @grid-float-breakpoint) { + margin-right: 0; + margin-left: 0; + } + } +} + + +// +// Navbar alignment options +// +// Display the navbar across the entirety of the page or fixed it to the top or +// bottom of the page. + +// Static top (unfixed, but 100% wide) navbar +.navbar-static-top { + z-index: @zindex-navbar; + border-width: 0 0 1px; + + @media (min-width: @grid-float-breakpoint) { + border-radius: 0; + } +} + +// Fix the top/bottom navbars when screen real estate supports it +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: @zindex-navbar-fixed; + + // Undo the rounded corners + @media (min-width: @grid-float-breakpoint) { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; // override .navbar defaults + border-width: 1px 0 0; +} + + +// Brand/project name + +.navbar-brand { + float: left; + padding: @navbar-padding-vertical @navbar-padding-horizontal; + font-size: @font-size-large; + line-height: @line-height-computed; + height: @navbar-height; + + &:hover, + &:focus { + text-decoration: none; + } + + > img { + display: block; + } + + @media (min-width: @grid-float-breakpoint) { + .navbar > .container &, + .navbar > .container-fluid & { + margin-left: -@navbar-padding-horizontal; + } + } +} + + +// Navbar toggle +// +// Custom button for toggling the `.navbar-collapse`, powered by the collapse +// JavaScript plugin. + +.navbar-toggle { + position: relative; + float: right; + margin-right: @navbar-padding-horizontal; + padding: 9px 10px; + .navbar-vertical-align(34px); + background-color: transparent; + background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 + border: 1px solid transparent; + border-radius: @border-radius-base; + + // We remove the `outline` here, but later compensate by attaching `:hover` + // styles to `:focus`. + &:focus { + outline: 0; + } + + // Bars + .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; + } + .icon-bar + .icon-bar { + margin-top: 4px; + } + + @media (min-width: @grid-float-breakpoint) { + display: none; + } +} + + +// Navbar nav links +// +// Builds on top of the `.nav` components with its own modifier class to make +// the nav the full height of the horizontal nav (above 768px). + +.navbar-nav { + margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal; + + > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: @line-height-computed; + } + + @media (max-width: @grid-float-breakpoint-max) { + // Dropdowns get custom display when collapsed + .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; + > li > a, + .dropdown-header { + padding: 5px 15px 5px 25px; + } + > li > a { + line-height: @line-height-computed; + &:hover, + &:focus { + background-image: none; + } + } + } + } + + // Uncollapse the nav + @media (min-width: @grid-float-breakpoint) { + float: left; + margin: 0; + + > li { + float: left; + > a { + padding-top: @navbar-padding-vertical; + padding-bottom: @navbar-padding-vertical; + } + } + } +} + + +// Navbar form +// +// Extension of the `.form-inline` with some extra flavor for optimum display in +// our navbars. + +.navbar-form { + margin-left: -@navbar-padding-horizontal; + margin-right: -@navbar-padding-horizontal; + padding: 10px @navbar-padding-horizontal; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); + .box-shadow(@shadow); + + // Mixin behavior for optimum display + .form-inline(); + + .form-group { + @media (max-width: @grid-float-breakpoint-max) { + margin-bottom: 5px; + + &:last-child { + margin-bottom: 0; + } + } + } + + // Vertically center in expanded, horizontal navbar + .navbar-vertical-align(@input-height-base); + + // Undo 100% width for pull classes + @media (min-width: @grid-float-breakpoint) { + width: auto; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + .box-shadow(none); + } +} + + +// Dropdown menus + +// Menu position and menu carets +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + .border-top-radius(0); +} +// Menu position and menu caret support for dropups via extra dropup class +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + .border-top-radius(@navbar-border-radius); + .border-bottom-radius(0); +} + + +// Buttons in navbars +// +// Vertically center a button within a navbar (when *not* in a form). + +.navbar-btn { + .navbar-vertical-align(@input-height-base); + + &.btn-sm { + .navbar-vertical-align(@input-height-small); + } + &.btn-xs { + .navbar-vertical-align(22); + } +} + + +// Text in navbars +// +// Add a class to make any element properly align itself vertically within the navbars. + +.navbar-text { + .navbar-vertical-align(@line-height-computed); + + @media (min-width: @grid-float-breakpoint) { + float: left; + margin-left: @navbar-padding-horizontal; + margin-right: @navbar-padding-horizontal; + } +} + + +// Component alignment +// +// Repurpose the pull utilities as their own navbar utilities to avoid specificity +// issues with parents and chaining. Only do this when the navbar is uncollapsed +// though so that navbar contents properly stack and align in mobile. +// +// Declared after the navbar components to ensure more specificity on the margins. + +@media (min-width: @grid-float-breakpoint) { + .navbar-left { .pull-left(); } + .navbar-right { + .pull-right(); + margin-right: -@navbar-padding-horizontal; + + ~ .navbar-right { + margin-right: 0; + } + } +} + + +// Alternate navbars +// -------------------------------------------------- + +// Default navbar +.navbar-default { + background-color: @navbar-default-bg; + border-color: @navbar-default-border; + + .navbar-brand { + color: @navbar-default-brand-color; + &:hover, + &:focus { + color: @navbar-default-brand-hover-color; + background-color: @navbar-default-brand-hover-bg; + } + } + + .navbar-text { + color: @navbar-default-color; + } + + .navbar-nav { + > li > a { + color: @navbar-default-link-color; + + &:hover, + &:focus { + color: @navbar-default-link-hover-color; + background-color: @navbar-default-link-hover-bg; + } + } + > .active > a { + &, + &:hover, + &:focus { + color: @navbar-default-link-active-color; + background-color: @navbar-default-link-active-bg; + } + } + > .disabled > a { + &, + &:hover, + &:focus { + color: @navbar-default-link-disabled-color; + background-color: @navbar-default-link-disabled-bg; + } + } + } + + .navbar-toggle { + border-color: @navbar-default-toggle-border-color; + &:hover, + &:focus { + background-color: @navbar-default-toggle-hover-bg; + } + .icon-bar { + background-color: @navbar-default-toggle-icon-bar-bg; + } + } + + .navbar-collapse, + .navbar-form { + border-color: @navbar-default-border; + } + + // Dropdown menu items + .navbar-nav { + // Remove background color from open dropdown + > .open > a { + &, + &:hover, + &:focus { + background-color: @navbar-default-link-active-bg; + color: @navbar-default-link-active-color; + } + } + + @media (max-width: @grid-float-breakpoint-max) { + // Dropdowns get custom display when collapsed + .open .dropdown-menu { + > li > a { + color: @navbar-default-link-color; + &:hover, + &:focus { + color: @navbar-default-link-hover-color; + background-color: @navbar-default-link-hover-bg; + } + } + > .active > a { + &, + &:hover, + &:focus { + color: @navbar-default-link-active-color; + background-color: @navbar-default-link-active-bg; + } + } + > .disabled > a { + &, + &:hover, + &:focus { + color: @navbar-default-link-disabled-color; + background-color: @navbar-default-link-disabled-bg; + } + } + } + } + } + + + // Links in navbars + // + // Add a class to ensure links outside the navbar nav are colored correctly. + + .navbar-link { + color: @navbar-default-link-color; + &:hover { + color: @navbar-default-link-hover-color; + } + } + + .btn-link { + color: @navbar-default-link-color; + &:hover, + &:focus { + color: @navbar-default-link-hover-color; + } + &[disabled], + fieldset[disabled] & { + &:hover, + &:focus { + color: @navbar-default-link-disabled-color; + } + } + } +} + +// Inverse navbar + +.navbar-inverse { + background-color: @navbar-inverse-bg; + border-color: @navbar-inverse-border; + + .navbar-brand { + color: @navbar-inverse-brand-color; + &:hover, + &:focus { + color: @navbar-inverse-brand-hover-color; + background-color: @navbar-inverse-brand-hover-bg; + } + } + + .navbar-text { + color: @navbar-inverse-color; + } + + .navbar-nav { + > li > a { + color: @navbar-inverse-link-color; + + &:hover, + &:focus { + color: @navbar-inverse-link-hover-color; + background-color: @navbar-inverse-link-hover-bg; + } + } + > .active > a { + &, + &:hover, + &:focus { + color: @navbar-inverse-link-active-color; + background-color: @navbar-inverse-link-active-bg; + } + } + > .disabled > a { + &, + &:hover, + &:focus { + color: @navbar-inverse-link-disabled-color; + background-color: @navbar-inverse-link-disabled-bg; + } + } + } + + // Darken the responsive nav toggle + .navbar-toggle { + border-color: @navbar-inverse-toggle-border-color; + &:hover, + &:focus { + background-color: @navbar-inverse-toggle-hover-bg; + } + .icon-bar { + background-color: @navbar-inverse-toggle-icon-bar-bg; + } + } + + .navbar-collapse, + .navbar-form { + border-color: darken(@navbar-inverse-bg, 7%); + } + + // Dropdowns + .navbar-nav { + > .open > a { + &, + &:hover, + &:focus { + background-color: @navbar-inverse-link-active-bg; + color: @navbar-inverse-link-active-color; + } + } + + @media (max-width: @grid-float-breakpoint-max) { + // Dropdowns get custom display + .open .dropdown-menu { + > .dropdown-header { + border-color: @navbar-inverse-border; + } + .divider { + background-color: @navbar-inverse-border; + } + > li > a { + color: @navbar-inverse-link-color; + &:hover, + &:focus { + color: @navbar-inverse-link-hover-color; + background-color: @navbar-inverse-link-hover-bg; + } + } + > .active > a { + &, + &:hover, + &:focus { + color: @navbar-inverse-link-active-color; + background-color: @navbar-inverse-link-active-bg; + } + } + > .disabled > a { + &, + &:hover, + &:focus { + color: @navbar-inverse-link-disabled-color; + background-color: @navbar-inverse-link-disabled-bg; + } + } + } + } + } + + .navbar-link { + color: @navbar-inverse-link-color; + &:hover { + color: @navbar-inverse-link-hover-color; + } + } + + .btn-link { + color: @navbar-inverse-link-color; + &:hover, + &:focus { + color: @navbar-inverse-link-hover-color; + } + &[disabled], + fieldset[disabled] & { + &:hover, + &:focus { + color: @navbar-inverse-link-disabled-color; + } + } + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/navs.less b/src/main/webapp/vendors/bootstrap/less/navs.less new file mode 100644 index 000000000..a3d11b136 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/navs.less @@ -0,0 +1,242 @@ +// +// Navs +// -------------------------------------------------- + + +// Base class +// -------------------------------------------------- + +.nav { + margin-bottom: 0; + padding-left: 0; // Override default ul/ol + list-style: none; + &:extend(.clearfix all); + + > li { + position: relative; + display: block; + + > a { + position: relative; + display: block; + padding: @nav-link-padding; + &:hover, + &:focus { + text-decoration: none; + background-color: @nav-link-hover-bg; + } + } + + // Disabled state sets text to gray and nukes hover/tab effects + &.disabled > a { + color: @nav-disabled-link-color; + + &:hover, + &:focus { + color: @nav-disabled-link-hover-color; + text-decoration: none; + background-color: transparent; + cursor: @cursor-disabled; + } + } + } + + // Open dropdowns + .open > a { + &, + &:hover, + &:focus { + background-color: @nav-link-hover-bg; + border-color: @link-color; + } + } + + // Nav dividers (deprecated with v3.0.1) + // + // This should have been removed in v3 with the dropping of `.nav-list`, but + // we missed it. We don't currently support this anywhere, but in the interest + // of maintaining backward compatibility in case you use it, it's deprecated. + .nav-divider { + .nav-divider(); + } + + // Prevent IE8 from misplacing imgs + // + // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989 + > li > a > img { + max-width: none; + } +} + + +// Tabs +// ------------------------- + +// Give the tabs something to sit on +.nav-tabs { + border-bottom: 1px solid @nav-tabs-border-color; + > li { + float: left; + // Make the list-items overlay the bottom border + margin-bottom: -1px; + + // Actual tabs (as links) + > a { + margin-right: 2px; + line-height: @line-height-base; + border: 1px solid transparent; + border-radius: @border-radius-base @border-radius-base 0 0; + &:hover { + border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color; + } + } + + // Active state, and its :hover to override normal :hover + &.active > a { + &, + &:hover, + &:focus { + color: @nav-tabs-active-link-hover-color; + background-color: @nav-tabs-active-link-hover-bg; + border: 1px solid @nav-tabs-active-link-hover-border-color; + border-bottom-color: transparent; + cursor: default; + } + } + } + // pulling this in mainly for less shorthand + &.nav-justified { + .nav-justified(); + .nav-tabs-justified(); + } +} + + +// Pills +// ------------------------- +.nav-pills { + > li { + float: left; + + // Links rendered as pills + > a { + border-radius: @nav-pills-border-radius; + } + + li { + margin-left: 2px; + } + + // Active state + &.active > a { + &, + &:hover, + &:focus { + color: @nav-pills-active-link-hover-color; + background-color: @nav-pills-active-link-hover-bg; + } + } + } +} + + +// Stacked pills +.nav-stacked { + > li { + float: none; + + li { + margin-top: 2px; + margin-left: 0; // no need for this gap between nav items + } + } +} + + +// Nav variations +// -------------------------------------------------- + +// Justified nav links +// ------------------------- + +.nav-justified { + width: 100%; + + > li { + float: none; + > a { + text-align: center; + margin-bottom: 5px; + } + } + + > .dropdown .dropdown-menu { + top: auto; + left: auto; + } + + @media (min-width: @screen-sm-min) { + > li { + display: table-cell; + width: 1%; + > a { + margin-bottom: 0; + } + } + } +} + +// Move borders to anchors instead of bottom of list +// +// Mixin for adding on top the shared `.nav-justified` styles for our tabs +.nav-tabs-justified { + border-bottom: 0; + + > li > a { + // Override margin from .nav-tabs + margin-right: 0; + border-radius: @border-radius-base; + } + + > .active > a, + > .active > a:hover, + > .active > a:focus { + border: 1px solid @nav-tabs-justified-link-border-color; + } + + @media (min-width: @screen-sm-min) { + > li > a { + border-bottom: 1px solid @nav-tabs-justified-link-border-color; + border-radius: @border-radius-base @border-radius-base 0 0; + } + > .active > a, + > .active > a:hover, + > .active > a:focus { + border-bottom-color: @nav-tabs-justified-active-link-border-color; + } + } +} + + +// Tabbable tabs +// ------------------------- + +// Hide tabbable panes to start, show them when `.active` +.tab-content { + > .tab-pane { + display: none; + } + > .active { + display: block; + } +} + + +// Dropdowns +// ------------------------- + +// Specific dropdowns +.nav-tabs .dropdown-menu { + // make dropdown border overlap tab border + margin-top: -1px; + // Remove the top rounded corners here since there is a hard edge above the menu + .border-top-radius(0); +} diff --git a/src/main/webapp/vendors/bootstrap/less/normalize.less b/src/main/webapp/vendors/bootstrap/less/normalize.less new file mode 100644 index 000000000..9dddf73ad --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/normalize.less @@ -0,0 +1,424 @@ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ + +// +// 1. Set default font family to sans-serif. +// 2. Prevent iOS and IE text size adjust after device orientation change, +// without disabling user zoom. +// + +html { + font-family: sans-serif; // 1 + -ms-text-size-adjust: 100%; // 2 + -webkit-text-size-adjust: 100%; // 2 +} + +// +// Remove default margin. +// + +body { + margin: 0; +} + +// HTML5 display definitions +// ========================================================================== + +// +// Correct `block` display not defined for any HTML5 element in IE 8/9. +// Correct `block` display not defined for `details` or `summary` in IE 10/11 +// and Firefox. +// Correct `block` display not defined for `main` in IE 11. +// + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +// +// 1. Correct `inline-block` display not defined in IE 8/9. +// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. +// + +audio, +canvas, +progress, +video { + display: inline-block; // 1 + vertical-align: baseline; // 2 +} + +// +// Prevent modern browsers from displaying `audio` without controls. +// Remove excess height in iOS 5 devices. +// + +audio:not([controls]) { + display: none; + height: 0; +} + +// +// Address `[hidden]` styling not present in IE 8/9/10. +// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22. +// + +[hidden], +template { + display: none; +} + +// Links +// ========================================================================== + +// +// Remove the gray background color from active links in IE 10. +// + +a { + background-color: transparent; +} + +// +// Improve readability of focused elements when they are also in an +// active/hover state. +// + +a:active, +a:hover { + outline: 0; +} + +// Text-level semantics +// ========================================================================== + +// +// Address styling not present in IE 8/9/10/11, Safari, and Chrome. +// + +abbr[title] { + border-bottom: 1px dotted; +} + +// +// Address style set to `bolder` in Firefox 4+, Safari, and Chrome. +// + +b, +strong { + font-weight: bold; +} + +// +// Address styling not present in Safari and Chrome. +// + +dfn { + font-style: italic; +} + +// +// Address variable `h1` font-size and margin within `section` and `article` +// contexts in Firefox 4+, Safari, and Chrome. +// + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +// +// Address styling not present in IE 8/9. +// + +mark { + background: #ff0; + color: #000; +} + +// +// Address inconsistent and variable font size in all browsers. +// + +small { + font-size: 80%; +} + +// +// Prevent `sub` and `sup` affecting `line-height` in all browsers. +// + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +// Embedded content +// ========================================================================== + +// +// Remove border when inside `a` element in IE 8/9/10. +// + +img { + border: 0; +} + +// +// Correct overflow not hidden in IE 9/10/11. +// + +svg:not(:root) { + overflow: hidden; +} + +// Grouping content +// ========================================================================== + +// +// Address margin not present in IE 8/9 and Safari. +// + +figure { + margin: 1em 40px; +} + +// +// Address differences between Firefox and other browsers. +// + +hr { + box-sizing: content-box; + height: 0; +} + +// +// Contain overflow in all browsers. +// + +pre { + overflow: auto; +} + +// +// Address odd `em`-unit font size rendering in all browsers. +// + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +// Forms +// ========================================================================== + +// +// Known limitation: by default, Chrome and Safari on OS X allow very limited +// styling of `select`, unless a `border` property is set. +// + +// +// 1. Correct color not being inherited. +// Known issue: affects color of disabled elements. +// 2. Correct font properties not being inherited. +// 3. Address margins set differently in Firefox 4+, Safari, and Chrome. +// + +button, +input, +optgroup, +select, +textarea { + color: inherit; // 1 + font: inherit; // 2 + margin: 0; // 3 +} + +// +// Address `overflow` set to `hidden` in IE 8/9/10/11. +// + +button { + overflow: visible; +} + +// +// Address inconsistent `text-transform` inheritance for `button` and `select`. +// All other form control elements do not inherit `text-transform` values. +// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. +// Correct `select` style inheritance in Firefox. +// + +button, +select { + text-transform: none; +} + +// +// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` +// and `video` controls. +// 2. Correct inability to style clickable `input` types in iOS. +// 3. Improve usability and consistency of cursor style between image-type +// `input` and others. +// + +button, +html input[type="button"], // 1 +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; // 2 + cursor: pointer; // 3 +} + +// +// Re-set default cursor for disabled elements. +// + +button[disabled], +html input[disabled] { + cursor: default; +} + +// +// Remove inner padding and border in Firefox 4+. +// + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +// +// Address Firefox 4+ setting `line-height` on `input` using `!important` in +// the UA stylesheet. +// + +input { + line-height: normal; +} + +// +// It's recommended that you don't attempt to style these elements. +// Firefox's implementation doesn't respect box-sizing, padding, or width. +// +// 1. Address box sizing set to `content-box` in IE 8/9/10. +// 2. Remove excess padding in IE 8/9/10. +// + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; // 1 + padding: 0; // 2 +} + +// +// Fix the cursor style for Chrome's increment/decrement buttons. For certain +// `font-size` values of the `input`, it causes the cursor style of the +// decrement button to change from `default` to `text`. +// + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +// +// 1. Address `appearance` set to `searchfield` in Safari and Chrome. +// 2. Address `box-sizing` set to `border-box` in Safari and Chrome. +// + +input[type="search"] { + -webkit-appearance: textfield; // 1 + box-sizing: content-box; //2 +} + +// +// Remove inner padding and search cancel button in Safari and Chrome on OS X. +// Safari (but not Chrome) clips the cancel button when the search input has +// padding (and `textfield` appearance). +// + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +// +// Define consistent border, margin, and padding. +// + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +// +// 1. Correct `color` not being inherited in IE 8/9/10/11. +// 2. Remove padding so people aren't caught out if they zero out fieldsets. +// + +legend { + border: 0; // 1 + padding: 0; // 2 +} + +// +// Remove default vertical scrollbar in IE 8/9/10/11. +// + +textarea { + overflow: auto; +} + +// +// Don't inherit the `font-weight` (applied by a rule above). +// NOTE: the default cannot safely be changed in Chrome and Safari on OS X. +// + +optgroup { + font-weight: bold; +} + +// Tables +// ========================================================================== + +// +// Remove most spacing between table cells. +// + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} diff --git a/src/main/webapp/vendors/bootstrap/less/pager.less b/src/main/webapp/vendors/bootstrap/less/pager.less new file mode 100644 index 000000000..41abaaadc --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/pager.less @@ -0,0 +1,54 @@ +// +// Pager pagination +// -------------------------------------------------- + + +.pager { + padding-left: 0; + margin: @line-height-computed 0; + list-style: none; + text-align: center; + &:extend(.clearfix all); + li { + display: inline; + > a, + > span { + display: inline-block; + padding: 5px 14px; + background-color: @pager-bg; + border: 1px solid @pager-border; + border-radius: @pager-border-radius; + } + + > a:hover, + > a:focus { + text-decoration: none; + background-color: @pager-hover-bg; + } + } + + .next { + > a, + > span { + float: right; + } + } + + .previous { + > a, + > span { + float: left; + } + } + + .disabled { + > a, + > a:hover, + > a:focus, + > span { + color: @pager-disabled-color; + background-color: @pager-bg; + cursor: @cursor-disabled; + } + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/pagination.less b/src/main/webapp/vendors/bootstrap/less/pagination.less new file mode 100644 index 000000000..31f77aae4 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/pagination.less @@ -0,0 +1,89 @@ +// +// Pagination (multiple pages) +// -------------------------------------------------- +.pagination { + display: inline-block; + padding-left: 0; + margin: @line-height-computed 0; + border-radius: @border-radius-base; + + > li { + display: inline; // Remove list-style and block-level defaults + > a, + > span { + position: relative; + float: left; // Collapse white-space + padding: @padding-base-vertical @padding-base-horizontal; + line-height: @line-height-base; + text-decoration: none; + color: @pagination-color; + background-color: @pagination-bg; + border: 1px solid @pagination-border; + margin-left: -1px; + } + &:first-child { + > a, + > span { + margin-left: 0; + .border-left-radius(@border-radius-base); + } + } + &:last-child { + > a, + > span { + .border-right-radius(@border-radius-base); + } + } + } + + > li > a, + > li > span { + &:hover, + &:focus { + z-index: 2; + color: @pagination-hover-color; + background-color: @pagination-hover-bg; + border-color: @pagination-hover-border; + } + } + + > .active > a, + > .active > span { + &, + &:hover, + &:focus { + z-index: 3; + color: @pagination-active-color; + background-color: @pagination-active-bg; + border-color: @pagination-active-border; + cursor: default; + } + } + + > .disabled { + > span, + > span:hover, + > span:focus, + > a, + > a:hover, + > a:focus { + color: @pagination-disabled-color; + background-color: @pagination-disabled-bg; + border-color: @pagination-disabled-border; + cursor: @cursor-disabled; + } + } +} + +// Sizing +// -------------------------------------------------- + +// Large +.pagination-lg { + .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large); +} + +// Small +.pagination-sm { + .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small); +} diff --git a/src/main/webapp/vendors/bootstrap/less/panels.less b/src/main/webapp/vendors/bootstrap/less/panels.less new file mode 100644 index 000000000..425eb5e64 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/panels.less @@ -0,0 +1,271 @@ +// +// Panels +// -------------------------------------------------- + + +// Base class +.panel { + margin-bottom: @line-height-computed; + background-color: @panel-bg; + border: 1px solid transparent; + border-radius: @panel-border-radius; + .box-shadow(0 1px 1px rgba(0,0,0,.05)); +} + +// Panel contents +.panel-body { + padding: @panel-body-padding; + &:extend(.clearfix all); +} + +// Optional heading +.panel-heading { + padding: @panel-heading-padding; + border-bottom: 1px solid transparent; + .border-top-radius((@panel-border-radius - 1)); + + > .dropdown .dropdown-toggle { + color: inherit; + } +} + +// Within heading, strip any `h*` tag of its default margins for spacing. +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: ceil((@font-size-base * 1.125)); + color: inherit; + + > a, + > small, + > .small, + > small > a, + > .small > a { + color: inherit; + } +} + +// Optional footer (stays gray in every modifier class) +.panel-footer { + padding: @panel-footer-padding; + background-color: @panel-footer-bg; + border-top: 1px solid @panel-inner-border; + .border-bottom-radius((@panel-border-radius - 1)); +} + + +// List groups in panels +// +// By default, space out list group content from panel headings to account for +// any kind of custom content between the two. + +.panel { + > .list-group, + > .panel-collapse > .list-group { + margin-bottom: 0; + + .list-group-item { + border-width: 1px 0; + border-radius: 0; + } + + // Add border top radius for first one + &:first-child { + .list-group-item:first-child { + border-top: 0; + .border-top-radius((@panel-border-radius - 1)); + } + } + + // Add border bottom radius for last one + &:last-child { + .list-group-item:last-child { + border-bottom: 0; + .border-bottom-radius((@panel-border-radius - 1)); + } + } + } + > .panel-heading + .panel-collapse > .list-group { + .list-group-item:first-child { + .border-top-radius(0); + } + } +} +// Collapse space between when there's no additional content. +.panel-heading + .list-group { + .list-group-item:first-child { + border-top-width: 0; + } +} +.list-group + .panel-footer { + border-top-width: 0; +} + +// Tables in panels +// +// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and +// watch it go full width. + +.panel { + > .table, + > .table-responsive > .table, + > .panel-collapse > .table { + margin-bottom: 0; + + caption { + padding-left: @panel-body-padding; + padding-right: @panel-body-padding; + } + } + // Add border top radius for first one + > .table:first-child, + > .table-responsive:first-child > .table:first-child { + .border-top-radius((@panel-border-radius - 1)); + + > thead:first-child, + > tbody:first-child { + > tr:first-child { + border-top-left-radius: (@panel-border-radius - 1); + border-top-right-radius: (@panel-border-radius - 1); + + td:first-child, + th:first-child { + border-top-left-radius: (@panel-border-radius - 1); + } + td:last-child, + th:last-child { + border-top-right-radius: (@panel-border-radius - 1); + } + } + } + } + // Add border bottom radius for last one + > .table:last-child, + > .table-responsive:last-child > .table:last-child { + .border-bottom-radius((@panel-border-radius - 1)); + + > tbody:last-child, + > tfoot:last-child { + > tr:last-child { + border-bottom-left-radius: (@panel-border-radius - 1); + border-bottom-right-radius: (@panel-border-radius - 1); + + td:first-child, + th:first-child { + border-bottom-left-radius: (@panel-border-radius - 1); + } + td:last-child, + th:last-child { + border-bottom-right-radius: (@panel-border-radius - 1); + } + } + } + } + > .panel-body + .table, + > .panel-body + .table-responsive, + > .table + .panel-body, + > .table-responsive + .panel-body { + border-top: 1px solid @table-border-color; + } + > .table > tbody:first-child > tr:first-child th, + > .table > tbody:first-child > tr:first-child td { + border-top: 0; + } + > .table-bordered, + > .table-responsive > .table-bordered { + border: 0; + > thead, + > tbody, + > tfoot { + > tr { + > th:first-child, + > td:first-child { + border-left: 0; + } + > th:last-child, + > td:last-child { + border-right: 0; + } + } + } + > thead, + > tbody { + > tr:first-child { + > td, + > th { + border-bottom: 0; + } + } + } + > tbody, + > tfoot { + > tr:last-child { + > td, + > th { + border-bottom: 0; + } + } + } + } + > .table-responsive { + border: 0; + margin-bottom: 0; + } +} + + +// Collapsable panels (aka, accordion) +// +// Wrap a series of panels in `.panel-group` to turn them into an accordion with +// the help of our collapse JavaScript plugin. + +.panel-group { + margin-bottom: @line-height-computed; + + // Tighten up margin so it's only between panels + .panel { + margin-bottom: 0; + border-radius: @panel-border-radius; + + + .panel { + margin-top: 5px; + } + } + + .panel-heading { + border-bottom: 0; + + + .panel-collapse > .panel-body, + + .panel-collapse > .list-group { + border-top: 1px solid @panel-inner-border; + } + } + + .panel-footer { + border-top: 0; + + .panel-collapse .panel-body { + border-bottom: 1px solid @panel-inner-border; + } + } +} + + +// Contextual variations +.panel-default { + .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border); +} +.panel-primary { + .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border); +} +.panel-success { + .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border); +} +.panel-info { + .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border); +} +.panel-warning { + .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border); +} +.panel-danger { + .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border); +} diff --git a/src/main/webapp/vendors/bootstrap/less/popovers.less b/src/main/webapp/vendors/bootstrap/less/popovers.less new file mode 100644 index 000000000..3a62a6455 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/popovers.less @@ -0,0 +1,131 @@ +// +// Popovers +// -------------------------------------------------- + + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: @zindex-popover; + display: none; + max-width: @popover-max-width; + padding: 1px; + // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element. + // So reset our font and text properties to avoid inheriting weird values. + .reset-text(); + font-size: @font-size-base; + + background-color: @popover-bg; + background-clip: padding-box; + border: 1px solid @popover-fallback-border-color; + border: 1px solid @popover-border-color; + border-radius: @border-radius-large; + .box-shadow(0 5px 10px rgba(0,0,0,.2)); + + // Offset the popover to account for the popover arrow + &.top { margin-top: -@popover-arrow-width; } + &.right { margin-left: @popover-arrow-width; } + &.bottom { margin-top: @popover-arrow-width; } + &.left { margin-left: -@popover-arrow-width; } +} + +.popover-title { + margin: 0; // reset heading margin + padding: 8px 14px; + font-size: @font-size-base; + background-color: @popover-title-bg; + border-bottom: 1px solid darken(@popover-title-bg, 5%); + border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0; +} + +.popover-content { + padding: 9px 14px; +} + +// Arrows +// +// .arrow is outer, .arrow:after is inner + +.popover > .arrow { + &, + &:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + } +} +.popover > .arrow { + border-width: @popover-arrow-outer-width; +} +.popover > .arrow:after { + border-width: @popover-arrow-width; + content: ""; +} + +.popover { + &.top > .arrow { + left: 50%; + margin-left: -@popover-arrow-outer-width; + border-bottom-width: 0; + border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback + border-top-color: @popover-arrow-outer-color; + bottom: -@popover-arrow-outer-width; + &:after { + content: " "; + bottom: 1px; + margin-left: -@popover-arrow-width; + border-bottom-width: 0; + border-top-color: @popover-arrow-color; + } + } + &.right > .arrow { + top: 50%; + left: -@popover-arrow-outer-width; + margin-top: -@popover-arrow-outer-width; + border-left-width: 0; + border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback + border-right-color: @popover-arrow-outer-color; + &:after { + content: " "; + left: 1px; + bottom: -@popover-arrow-width; + border-left-width: 0; + border-right-color: @popover-arrow-color; + } + } + &.bottom > .arrow { + left: 50%; + margin-left: -@popover-arrow-outer-width; + border-top-width: 0; + border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback + border-bottom-color: @popover-arrow-outer-color; + top: -@popover-arrow-outer-width; + &:after { + content: " "; + top: 1px; + margin-left: -@popover-arrow-width; + border-top-width: 0; + border-bottom-color: @popover-arrow-color; + } + } + + &.left > .arrow { + top: 50%; + right: -@popover-arrow-outer-width; + margin-top: -@popover-arrow-outer-width; + border-right-width: 0; + border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback + border-left-color: @popover-arrow-outer-color; + &:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: @popover-arrow-color; + bottom: -@popover-arrow-width; + } + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/print.less b/src/main/webapp/vendors/bootstrap/less/print.less new file mode 100644 index 000000000..66e54ab48 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/print.less @@ -0,0 +1,101 @@ +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ + +// ========================================================================== +// Print styles. +// Inlined to avoid the additional HTTP request: h5bp.com/r +// ========================================================================== + +@media print { + *, + *:before, + *:after { + background: transparent !important; + color: #000 !important; // Black prints faster: h5bp.com/s + box-shadow: none !important; + text-shadow: none !important; + } + + a, + a:visited { + text-decoration: underline; + } + + a[href]:after { + content: " (" attr(href) ")"; + } + + abbr[title]:after { + content: " (" attr(title) ")"; + } + + // Don't show links that are fragment identifiers, + // or use the `javascript:` pseudo protocol + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + + thead { + display: table-header-group; // h5bp.com/t + } + + tr, + img { + page-break-inside: avoid; + } + + img { + max-width: 100% !important; + } + + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + + h2, + h3 { + page-break-after: avoid; + } + + // Bootstrap specific changes start + + // Bootstrap components + .navbar { + display: none; + } + .btn, + .dropup > .btn { + > .caret { + border-top-color: #000 !important; + } + } + .label { + border: 1px solid #000; + } + + .table { + border-collapse: collapse !important; + + td, + th { + background-color: #fff !important; + } + } + .table-bordered { + th, + td { + border: 1px solid #ddd !important; + } + } + + // Bootstrap specific changes end +} diff --git a/src/main/webapp/vendors/bootstrap/less/progress-bars.less b/src/main/webapp/vendors/bootstrap/less/progress-bars.less new file mode 100644 index 000000000..8868a1fee --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/progress-bars.less @@ -0,0 +1,87 @@ +// +// Progress bars +// -------------------------------------------------- + + +// Bar animations +// ------------------------- + +// WebKit +@-webkit-keyframes progress-bar-stripes { + from { background-position: 40px 0; } + to { background-position: 0 0; } +} + +// Spec and IE10+ +@keyframes progress-bar-stripes { + from { background-position: 40px 0; } + to { background-position: 0 0; } +} + + +// Bar itself +// ------------------------- + +// Outer container +.progress { + overflow: hidden; + height: @line-height-computed; + margin-bottom: @line-height-computed; + background-color: @progress-bg; + border-radius: @progress-border-radius; + .box-shadow(inset 0 1px 2px rgba(0,0,0,.1)); +} + +// Bar of progress +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: @font-size-small; + line-height: @line-height-computed; + color: @progress-bar-color; + text-align: center; + background-color: @progress-bar-bg; + .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15)); + .transition(width .6s ease); +} + +// Striped bars +// +// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the +// `.progress-bar-striped` class, which you just add to an existing +// `.progress-bar`. +.progress-striped .progress-bar, +.progress-bar-striped { + #gradient > .striped(); + background-size: 40px 40px; +} + +// Call animation for the active one +// +// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the +// `.progress-bar.active` approach. +.progress.active .progress-bar, +.progress-bar.active { + .animation(progress-bar-stripes 2s linear infinite); +} + + +// Variations +// ------------------------- + +.progress-bar-success { + .progress-bar-variant(@progress-bar-success-bg); +} + +.progress-bar-info { + .progress-bar-variant(@progress-bar-info-bg); +} + +.progress-bar-warning { + .progress-bar-variant(@progress-bar-warning-bg); +} + +.progress-bar-danger { + .progress-bar-variant(@progress-bar-danger-bg); +} diff --git a/src/main/webapp/vendors/bootstrap/less/responsive-embed.less b/src/main/webapp/vendors/bootstrap/less/responsive-embed.less new file mode 100644 index 000000000..080a5118f --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/responsive-embed.less @@ -0,0 +1,35 @@ +// Embeds responsive +// +// Credit: Nicolas Gallagher and SUIT CSS. + +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; + + .embed-responsive-item, + iframe, + embed, + object, + video { + position: absolute; + top: 0; + left: 0; + bottom: 0; + height: 100%; + width: 100%; + border: 0; + } +} + +// Modifier class for 16:9 aspect ratio +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} + +// Modifier class for 4:3 aspect ratio +.embed-responsive-4by3 { + padding-bottom: 75%; +} diff --git a/src/main/webapp/vendors/bootstrap/less/responsive-utilities.less b/src/main/webapp/vendors/bootstrap/less/responsive-utilities.less new file mode 100644 index 000000000..b1db31d7b --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/responsive-utilities.less @@ -0,0 +1,194 @@ +// +// Responsive: Utility classes +// -------------------------------------------------- + + +// IE10 in Windows (Phone) 8 +// +// Support for responsive views via media queries is kind of borked in IE10, for +// Surface/desktop in split view and for Windows Phone 8. This particular fix +// must be accompanied by a snippet of JavaScript to sniff the user agent and +// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at +// our Getting Started page for more information on this bug. +// +// For more information, see the following: +// +// Issue: https://github.com/twbs/bootstrap/issues/10497 +// Docs: http://getbootstrap.com/getting-started/#support-ie10-width +// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/ +// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/ + +@-ms-viewport { + width: device-width; +} + + +// Visibility utilities +// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0 +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + .responsive-invisibility(); +} + +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} + +.visible-xs { + @media (max-width: @screen-xs-max) { + .responsive-visibility(); + } +} +.visible-xs-block { + @media (max-width: @screen-xs-max) { + display: block !important; + } +} +.visible-xs-inline { + @media (max-width: @screen-xs-max) { + display: inline !important; + } +} +.visible-xs-inline-block { + @media (max-width: @screen-xs-max) { + display: inline-block !important; + } +} + +.visible-sm { + @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { + .responsive-visibility(); + } +} +.visible-sm-block { + @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { + display: block !important; + } +} +.visible-sm-inline { + @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { + display: inline !important; + } +} +.visible-sm-inline-block { + @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { + display: inline-block !important; + } +} + +.visible-md { + @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { + .responsive-visibility(); + } +} +.visible-md-block { + @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { + display: block !important; + } +} +.visible-md-inline { + @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { + display: inline !important; + } +} +.visible-md-inline-block { + @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { + display: inline-block !important; + } +} + +.visible-lg { + @media (min-width: @screen-lg-min) { + .responsive-visibility(); + } +} +.visible-lg-block { + @media (min-width: @screen-lg-min) { + display: block !important; + } +} +.visible-lg-inline { + @media (min-width: @screen-lg-min) { + display: inline !important; + } +} +.visible-lg-inline-block { + @media (min-width: @screen-lg-min) { + display: inline-block !important; + } +} + +.hidden-xs { + @media (max-width: @screen-xs-max) { + .responsive-invisibility(); + } +} +.hidden-sm { + @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { + .responsive-invisibility(); + } +} +.hidden-md { + @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { + .responsive-invisibility(); + } +} +.hidden-lg { + @media (min-width: @screen-lg-min) { + .responsive-invisibility(); + } +} + + +// Print utilities +// +// Media queries are placed on the inside to be mixin-friendly. + +// Note: Deprecated .visible-print as of v3.2.0 +.visible-print { + .responsive-invisibility(); + + @media print { + .responsive-visibility(); + } +} +.visible-print-block { + display: none !important; + + @media print { + display: block !important; + } +} +.visible-print-inline { + display: none !important; + + @media print { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; + + @media print { + display: inline-block !important; + } +} + +.hidden-print { + @media print { + .responsive-invisibility(); + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/scaffolding.less b/src/main/webapp/vendors/bootstrap/less/scaffolding.less new file mode 100644 index 000000000..1929bfc5c --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/scaffolding.less @@ -0,0 +1,161 @@ +// +// Scaffolding +// -------------------------------------------------- + + +// Reset the box-sizing +// +// Heads up! This reset may cause conflicts with some third-party widgets. +// For recommendations on resolving such conflicts, see +// http://getbootstrap.com/getting-started/#third-box-sizing +* { + .box-sizing(border-box); +} +*:before, +*:after { + .box-sizing(border-box); +} + + +// Body reset + +html { + font-size: 10px; + -webkit-tap-highlight-color: rgba(0,0,0,0); +} + +body { + font-family: @font-family-base; + font-size: @font-size-base; + line-height: @line-height-base; + color: @text-color; + background-color: @body-bg; +} + +// Reset fonts for relevant elements +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + + +// Links + +a { + color: @link-color; + text-decoration: none; + + &:hover, + &:focus { + color: @link-hover-color; + text-decoration: @link-hover-decoration; + } + + &:focus { + .tab-focus(); + } +} + + +// Figures +// +// We reset this here because previously Normalize had no `figure` margins. This +// ensures we don't break anyone's use of the element. + +figure { + margin: 0; +} + + +// Images + +img { + vertical-align: middle; +} + +// Responsive images (ensure images don't scale beyond their parents) +.img-responsive { + .img-responsive(); +} + +// Rounded corners +.img-rounded { + border-radius: @border-radius-large; +} + +// Image thumbnails +// +// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`. +.img-thumbnail { + padding: @thumbnail-padding; + line-height: @line-height-base; + background-color: @thumbnail-bg; + border: 1px solid @thumbnail-border; + border-radius: @thumbnail-border-radius; + .transition(all .2s ease-in-out); + + // Keep them at most 100% wide + .img-responsive(inline-block); +} + +// Perfect circle +.img-circle { + border-radius: 50%; // set radius in percents +} + + +// Horizontal rules + +hr { + margin-top: @line-height-computed; + margin-bottom: @line-height-computed; + border: 0; + border-top: 1px solid @hr-border; +} + + +// Only display content to screen readers +// +// See: http://a11yproject.com/posts/how-to-hide-content/ + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// Credit: HTML5 Boilerplate + +.sr-only-focusable { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } +} + + +// iOS "clickable elements" fix for role="button" +// +// Fixes "clickability" issue (and more generally, the firing of events such as focus as well) +// for traditionally non-focusable elements with role="button" +// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile + +[role="button"] { + cursor: pointer; +} diff --git a/src/main/webapp/vendors/bootstrap/less/tables.less b/src/main/webapp/vendors/bootstrap/less/tables.less new file mode 100644 index 000000000..2242c0368 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/tables.less @@ -0,0 +1,234 @@ +// +// Tables +// -------------------------------------------------- + + +table { + background-color: @table-bg; +} +caption { + padding-top: @table-cell-padding; + padding-bottom: @table-cell-padding; + color: @text-muted; + text-align: left; +} +th { + text-align: left; +} + + +// Baseline styles + +.table { + width: 100%; + max-width: 100%; + margin-bottom: @line-height-computed; + // Cells + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + padding: @table-cell-padding; + line-height: @line-height-base; + vertical-align: top; + border-top: 1px solid @table-border-color; + } + } + } + // Bottom align for column headings + > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid @table-border-color; + } + // Remove top border from thead by default + > caption + thead, + > colgroup + thead, + > thead:first-child { + > tr:first-child { + > th, + > td { + border-top: 0; + } + } + } + // Account for multiple tbody instances + > tbody + tbody { + border-top: 2px solid @table-border-color; + } + + // Nesting + .table { + background-color: @body-bg; + } +} + + +// Condensed table w/ half padding + +.table-condensed { + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + padding: @table-condensed-cell-padding; + } + } + } +} + + +// Bordered version +// +// Add borders all around the table and between all the columns. + +.table-bordered { + border: 1px solid @table-border-color; + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + border: 1px solid @table-border-color; + } + } + } + > thead > tr { + > th, + > td { + border-bottom-width: 2px; + } + } +} + + +// Zebra-striping +// +// Default zebra-stripe styles (alternating gray and transparent backgrounds) + +.table-striped { + > tbody > tr:nth-of-type(odd) { + background-color: @table-bg-accent; + } +} + + +// Hover effect +// +// Placed here since it has to come after the potential zebra striping + +.table-hover { + > tbody > tr:hover { + background-color: @table-bg-hover; + } +} + + +// Table cell sizing +// +// Reset default table behavior + +table col[class*="col-"] { + position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623) + float: none; + display: table-column; +} +table { + td, + th { + &[class*="col-"] { + position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623) + float: none; + display: table-cell; + } + } +} + + +// Table backgrounds +// +// Exact selectors below required to override `.table-striped` and prevent +// inheritance to nested tables. + +// Generate the contextual variants +.table-row-variant(active; @table-bg-active); +.table-row-variant(success; @state-success-bg); +.table-row-variant(info; @state-info-bg); +.table-row-variant(warning; @state-warning-bg); +.table-row-variant(danger; @state-danger-bg); + + +// Responsive tables +// +// Wrap your tables in `.table-responsive` and we'll make them mobile friendly +// by enabling horizontal scrolling. Only applies <768px. Everything above that +// will display normally. + +.table-responsive { + overflow-x: auto; + min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837) + + @media screen and (max-width: @screen-xs-max) { + width: 100%; + margin-bottom: (@line-height-computed * 0.75); + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid @table-border-color; + + // Tighten up spacing + > .table { + margin-bottom: 0; + + // Ensure the content doesn't wrap + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + white-space: nowrap; + } + } + } + } + + // Special overrides for the bordered tables + > .table-bordered { + border: 0; + + // Nuke the appropriate borders so that the parent can handle them + > thead, + > tbody, + > tfoot { + > tr { + > th:first-child, + > td:first-child { + border-left: 0; + } + > th:last-child, + > td:last-child { + border-right: 0; + } + } + } + + // Only nuke the last row's bottom-border in `tbody` and `tfoot` since + // chances are there will be only one `tr` in a `thead` and that would + // remove the border altogether. + > tbody, + > tfoot { + > tr:last-child { + > th, + > td { + border-bottom: 0; + } + } + } + + } + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/theme.less b/src/main/webapp/vendors/bootstrap/less/theme.less new file mode 100644 index 000000000..8f51d913d --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/theme.less @@ -0,0 +1,291 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +// +// Load core variables and mixins +// -------------------------------------------------- + +@import "variables.less"; +@import "mixins.less"; + + +// +// Buttons +// -------------------------------------------------- + +// Common styles +.btn-default, +.btn-primary, +.btn-success, +.btn-info, +.btn-warning, +.btn-danger { + text-shadow: 0 -1px 0 rgba(0,0,0,.2); + @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075); + .box-shadow(@shadow); + + // Reset the shadow + &:active, + &.active { + .box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); + } + + &.disabled, + &[disabled], + fieldset[disabled] & { + .box-shadow(none); + } + + .badge { + text-shadow: none; + } +} + +// Mixin for generating new styles +.btn-styles(@btn-color: #555) { + #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%)); + .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620 + background-repeat: repeat-x; + border-color: darken(@btn-color, 14%); + + &:hover, + &:focus { + background-color: darken(@btn-color, 12%); + background-position: 0 -15px; + } + + &:active, + &.active { + background-color: darken(@btn-color, 12%); + border-color: darken(@btn-color, 14%); + } + + &.disabled, + &[disabled], + fieldset[disabled] & { + &, + &:hover, + &:focus, + &.focus, + &:active, + &.active { + background-color: darken(@btn-color, 12%); + background-image: none; + } + } +} + +// Common styles +.btn { + // Remove the gradient for the pressed/active state + &:active, + &.active { + background-image: none; + } +} + +// Apply the mixin to the buttons +.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; } +.btn-primary { .btn-styles(@btn-primary-bg); } +.btn-success { .btn-styles(@btn-success-bg); } +.btn-info { .btn-styles(@btn-info-bg); } +.btn-warning { .btn-styles(@btn-warning-bg); } +.btn-danger { .btn-styles(@btn-danger-bg); } + + +// +// Images +// -------------------------------------------------- + +.thumbnail, +.img-thumbnail { + .box-shadow(0 1px 2px rgba(0,0,0,.075)); +} + + +// +// Dropdowns +// -------------------------------------------------- + +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%)); + background-color: darken(@dropdown-link-hover-bg, 5%); +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%)); + background-color: darken(@dropdown-link-active-bg, 5%); +} + + +// +// Navbar +// -------------------------------------------------- + +// Default navbar +.navbar-default { + #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg); + .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered + border-radius: @navbar-border-radius; + @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075); + .box-shadow(@shadow); + + .navbar-nav > .open > a, + .navbar-nav > .active > a { + #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%)); + .box-shadow(inset 0 3px 9px rgba(0,0,0,.075)); + } +} +.navbar-brand, +.navbar-nav > li > a { + text-shadow: 0 1px 0 rgba(255,255,255,.25); +} + +// Inverted navbar +.navbar-inverse { + #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg); + .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257 + border-radius: @navbar-border-radius; + .navbar-nav > .open > a, + .navbar-nav > .active > a { + #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%)); + .box-shadow(inset 0 3px 9px rgba(0,0,0,.25)); + } + + .navbar-brand, + .navbar-nav > li > a { + text-shadow: 0 -1px 0 rgba(0,0,0,.25); + } +} + +// Undo rounded corners in static and fixed navbars +.navbar-static-top, +.navbar-fixed-top, +.navbar-fixed-bottom { + border-radius: 0; +} + +// Fix active state of dropdown items in collapsed mode +@media (max-width: @grid-float-breakpoint-max) { + .navbar .navbar-nav .open .dropdown-menu > .active > a { + &, + &:hover, + &:focus { + color: #fff; + #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%)); + } + } +} + + +// +// Alerts +// -------------------------------------------------- + +// Common styles +.alert { + text-shadow: 0 1px 0 rgba(255,255,255,.2); + @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05); + .box-shadow(@shadow); +} + +// Mixin for generating new styles +.alert-styles(@color) { + #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%)); + border-color: darken(@color, 15%); +} + +// Apply the mixin to the alerts +.alert-success { .alert-styles(@alert-success-bg); } +.alert-info { .alert-styles(@alert-info-bg); } +.alert-warning { .alert-styles(@alert-warning-bg); } +.alert-danger { .alert-styles(@alert-danger-bg); } + + +// +// Progress bars +// -------------------------------------------------- + +// Give the progress background some depth +.progress { + #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg) +} + +// Mixin for generating new styles +.progress-bar-styles(@color) { + #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%)); +} + +// Apply the mixin to the progress bars +.progress-bar { .progress-bar-styles(@progress-bar-bg); } +.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); } +.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); } +.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); } +.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); } + +// Reset the striped class because our mixins don't do multiple gradients and +// the above custom styles override the new `.progress-bar-striped` in v3.2.0. +.progress-bar-striped { + #gradient > .striped(); +} + + +// +// List groups +// -------------------------------------------------- + +.list-group { + border-radius: @border-radius-base; + .box-shadow(0 1px 2px rgba(0,0,0,.075)); +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%); + #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%)); + border-color: darken(@list-group-active-border, 7.5%); + + .badge { + text-shadow: none; + } +} + + +// +// Panels +// -------------------------------------------------- + +// Common styles +.panel { + .box-shadow(0 1px 2px rgba(0,0,0,.05)); +} + +// Mixin for generating new styles +.panel-heading-styles(@color) { + #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%)); +} + +// Apply the mixin to the panel headings only +.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); } +.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); } +.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); } +.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); } +.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); } +.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); } + + +// +// Wells +// -------------------------------------------------- + +.well { + #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg); + border-color: darken(@well-bg, 10%); + @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1); + .box-shadow(@shadow); +} diff --git a/src/main/webapp/vendors/bootstrap/less/thumbnails.less b/src/main/webapp/vendors/bootstrap/less/thumbnails.less new file mode 100644 index 000000000..0713e67d0 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/thumbnails.less @@ -0,0 +1,36 @@ +// +// Thumbnails +// -------------------------------------------------- + + +// Mixin and adjust the regular image class +.thumbnail { + display: block; + padding: @thumbnail-padding; + margin-bottom: @line-height-computed; + line-height: @line-height-base; + background-color: @thumbnail-bg; + border: 1px solid @thumbnail-border; + border-radius: @thumbnail-border-radius; + .transition(border .2s ease-in-out); + + > img, + a > img { + &:extend(.img-responsive); + margin-left: auto; + margin-right: auto; + } + + // Add a hover state for linked versions only + a&:hover, + a&:focus, + a&.active { + border-color: @link-color; + } + + // Image captions + .caption { + padding: @thumbnail-caption-padding; + color: @thumbnail-caption-color; + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/tooltip.less b/src/main/webapp/vendors/bootstrap/less/tooltip.less new file mode 100644 index 000000000..b48d63e07 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/tooltip.less @@ -0,0 +1,101 @@ +// +// Tooltips +// -------------------------------------------------- + + +// Base class +.tooltip { + position: absolute; + z-index: @zindex-tooltip; + display: block; + // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element. + // So reset our font and text properties to avoid inheriting weird values. + .reset-text(); + font-size: @font-size-small; + + .opacity(0); + + &.in { .opacity(@tooltip-opacity); } + &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; } + &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; } + &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; } + &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; } +} + +// Wrapper for the tooltip content +.tooltip-inner { + max-width: @tooltip-max-width; + padding: 3px 8px; + color: @tooltip-color; + text-align: center; + background-color: @tooltip-bg; + border-radius: @border-radius-base; +} + +// Arrows +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1 +.tooltip { + &.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -@tooltip-arrow-width; + border-width: @tooltip-arrow-width @tooltip-arrow-width 0; + border-top-color: @tooltip-arrow-color; + } + &.top-left .tooltip-arrow { + bottom: 0; + right: @tooltip-arrow-width; + margin-bottom: -@tooltip-arrow-width; + border-width: @tooltip-arrow-width @tooltip-arrow-width 0; + border-top-color: @tooltip-arrow-color; + } + &.top-right .tooltip-arrow { + bottom: 0; + left: @tooltip-arrow-width; + margin-bottom: -@tooltip-arrow-width; + border-width: @tooltip-arrow-width @tooltip-arrow-width 0; + border-top-color: @tooltip-arrow-color; + } + &.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -@tooltip-arrow-width; + border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0; + border-right-color: @tooltip-arrow-color; + } + &.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -@tooltip-arrow-width; + border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width; + border-left-color: @tooltip-arrow-color; + } + &.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -@tooltip-arrow-width; + border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; + border-bottom-color: @tooltip-arrow-color; + } + &.bottom-left .tooltip-arrow { + top: 0; + right: @tooltip-arrow-width; + margin-top: -@tooltip-arrow-width; + border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; + border-bottom-color: @tooltip-arrow-color; + } + &.bottom-right .tooltip-arrow { + top: 0; + left: @tooltip-arrow-width; + margin-top: -@tooltip-arrow-width; + border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; + border-bottom-color: @tooltip-arrow-color; + } +} diff --git a/src/main/webapp/vendors/bootstrap/less/type.less b/src/main/webapp/vendors/bootstrap/less/type.less new file mode 100644 index 000000000..0d4fee484 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/type.less @@ -0,0 +1,302 @@ +// +// Typography +// -------------------------------------------------- + + +// Headings +// ------------------------- + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + font-family: @headings-font-family; + font-weight: @headings-font-weight; + line-height: @headings-line-height; + color: @headings-color; + + small, + .small { + font-weight: normal; + line-height: 1; + color: @headings-small-color; + } +} + +h1, .h1, +h2, .h2, +h3, .h3 { + margin-top: @line-height-computed; + margin-bottom: (@line-height-computed / 2); + + small, + .small { + font-size: 65%; + } +} +h4, .h4, +h5, .h5, +h6, .h6 { + margin-top: (@line-height-computed / 2); + margin-bottom: (@line-height-computed / 2); + + small, + .small { + font-size: 75%; + } +} + +h1, .h1 { font-size: @font-size-h1; } +h2, .h2 { font-size: @font-size-h2; } +h3, .h3 { font-size: @font-size-h3; } +h4, .h4 { font-size: @font-size-h4; } +h5, .h5 { font-size: @font-size-h5; } +h6, .h6 { font-size: @font-size-h6; } + + +// Body text +// ------------------------- + +p { + margin: 0 0 (@line-height-computed / 2); +} + +.lead { + margin-bottom: @line-height-computed; + font-size: floor((@font-size-base * 1.15)); + font-weight: 300; + line-height: 1.4; + + @media (min-width: @screen-sm-min) { + font-size: (@font-size-base * 1.5); + } +} + + +// Emphasis & misc +// ------------------------- + +// Ex: (12px small font / 14px base font) * 100% = about 85% +small, +.small { + font-size: floor((100% * @font-size-small / @font-size-base)); +} + +mark, +.mark { + background-color: @state-warning-bg; + padding: .2em; +} + +// Alignment +.text-left { text-align: left; } +.text-right { text-align: right; } +.text-center { text-align: center; } +.text-justify { text-align: justify; } +.text-nowrap { white-space: nowrap; } + +// Transformation +.text-lowercase { text-transform: lowercase; } +.text-uppercase { text-transform: uppercase; } +.text-capitalize { text-transform: capitalize; } + +// Contextual colors +.text-muted { + color: @text-muted; +} +.text-primary { + .text-emphasis-variant(@brand-primary); +} +.text-success { + .text-emphasis-variant(@state-success-text); +} +.text-info { + .text-emphasis-variant(@state-info-text); +} +.text-warning { + .text-emphasis-variant(@state-warning-text); +} +.text-danger { + .text-emphasis-variant(@state-danger-text); +} + +// Contextual backgrounds +// For now we'll leave these alongside the text classes until v4 when we can +// safely shift things around (per SemVer rules). +.bg-primary { + // Given the contrast here, this is the only class to have its color inverted + // automatically. + color: #fff; + .bg-variant(@brand-primary); +} +.bg-success { + .bg-variant(@state-success-bg); +} +.bg-info { + .bg-variant(@state-info-bg); +} +.bg-warning { + .bg-variant(@state-warning-bg); +} +.bg-danger { + .bg-variant(@state-danger-bg); +} + + +// Page header +// ------------------------- + +.page-header { + padding-bottom: ((@line-height-computed / 2) - 1); + margin: (@line-height-computed * 2) 0 @line-height-computed; + border-bottom: 1px solid @page-header-border-color; +} + + +// Lists +// ------------------------- + +// Unordered and Ordered lists +ul, +ol { + margin-top: 0; + margin-bottom: (@line-height-computed / 2); + ul, + ol { + margin-bottom: 0; + } +} + +// List options + +// Unstyled keeps list items block level, just removes default browser padding and list-style +.list-unstyled { + padding-left: 0; + list-style: none; +} + +// Inline turns list items into inline-block +.list-inline { + .list-unstyled(); + margin-left: -5px; + + > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; + } +} + +// Description Lists +dl { + margin-top: 0; // Remove browser default + margin-bottom: @line-height-computed; +} +dt, +dd { + line-height: @line-height-base; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; // Undo browser default +} + +// Horizontal description lists +// +// Defaults to being stacked without any of the below styles applied, until the +// grid breakpoint is reached (default of ~768px). + +.dl-horizontal { + dd { + &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present + } + + @media (min-width: @dl-horizontal-breakpoint) { + dt { + float: left; + width: (@dl-horizontal-offset - 20); + clear: left; + text-align: right; + .text-overflow(); + } + dd { + margin-left: @dl-horizontal-offset; + } + } +} + + +// Misc +// ------------------------- + +// Abbreviations and acronyms +abbr[title], +// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257 +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted @abbr-border-color; +} +.initialism { + font-size: 90%; + .text-uppercase(); +} + +// Blockquotes +blockquote { + padding: (@line-height-computed / 2) @line-height-computed; + margin: 0 0 @line-height-computed; + font-size: @blockquote-font-size; + border-left: 5px solid @blockquote-border-color; + + p, + ul, + ol { + &:last-child { + margin-bottom: 0; + } + } + + // Note: Deprecated small and .small as of v3.1.0 + // Context: https://github.com/twbs/bootstrap/issues/11660 + footer, + small, + .small { + display: block; + font-size: 80%; // back to default font-size + line-height: @line-height-base; + color: @blockquote-small-color; + + &:before { + content: '\2014 \00A0'; // em dash, nbsp + } + } +} + +// Opposite alignment of blockquote +// +// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0. +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid @blockquote-border-color; + border-left: 0; + text-align: right; + + // Account for citation + footer, + small, + .small { + &:before { content: ''; } + &:after { + content: '\00A0 \2014'; // nbsp, em dash + } + } +} + +// Addresses +address { + margin-bottom: @line-height-computed; + font-style: normal; + line-height: @line-height-base; +} diff --git a/src/main/webapp/vendors/bootstrap/less/utilities.less b/src/main/webapp/vendors/bootstrap/less/utilities.less new file mode 100644 index 000000000..7a8ca27a8 --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/utilities.less @@ -0,0 +1,55 @@ +// +// Utility classes +// -------------------------------------------------- + + +// Floats +// ------------------------- + +.clearfix { + .clearfix(); +} +.center-block { + .center-block(); +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} + + +// Toggling content +// ------------------------- + +// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1 +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + .text-hide(); +} + + +// Hide from screenreaders and browsers +// +// Credit: HTML5 Boilerplate + +.hidden { + display: none !important; +} + + +// For Affix plugin +// ------------------------- + +.affix { + position: fixed; +} diff --git a/src/main/webapp/vendors/bootstrap/less/variables.less b/src/main/webapp/vendors/bootstrap/less/variables.less new file mode 100644 index 000000000..b057ef5bf --- /dev/null +++ b/src/main/webapp/vendors/bootstrap/less/variables.less @@ -0,0 +1,869 @@ +// +// Variables +// -------------------------------------------------- + + +//== Colors +// +//## Gray and brand colors for use across Bootstrap. + +@gray-base: #000; +@gray-darker: lighten(@gray-base, 13.5%); // #222 +@gray-dark: lighten(@gray-base, 20%); // #333 +@gray: lighten(@gray-base, 33.5%); // #555 +@gray-light: lighten(@gray-base, 46.7%); // #777 +@gray-lighter: lighten(@gray-base, 93.5%); // #eee + +@brand-primary: darken(#428bca, 6.5%); // #337ab7 +@brand-success: #5cb85c; +@brand-info: #5bc0de; +@brand-warning: #f0ad4e; +@brand-danger: #d9534f; + + +//== Scaffolding +// +//## Settings for some of the most global styles. + +//** Background color for ``. +@body-bg: #fff; +//** Global text color on ``. +@text-color: @gray-dark; + +//** Global textual link color. +@link-color: @brand-primary; +//** Link hover color set via `darken()` function. +@link-hover-color: darken(@link-color, 15%); +//** Link hover decoration. +@link-hover-decoration: underline; + + +//== Typography +// +//## Font, line-height, and color for body text, headings, and more. + +@font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif; +@font-family-serif: Georgia, "Times New Roman", Times, serif; +//** Default monospace fonts for ``, ``, and `
    `.
    +@font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace;
    +@font-family-base:        @font-family-sans-serif;
    +
    +@font-size-base:          14px;
    +@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px
    +@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px
    +
    +@font-size-h1:            floor((@font-size-base * 2.6)); // ~36px
    +@font-size-h2:            floor((@font-size-base * 2.15)); // ~30px
    +@font-size-h3:            ceil((@font-size-base * 1.7)); // ~24px
    +@font-size-h4:            ceil((@font-size-base * 1.25)); // ~18px
    +@font-size-h5:            @font-size-base;
    +@font-size-h6:            ceil((@font-size-base * 0.85)); // ~12px
    +
    +//** Unit-less `line-height` for use in components like buttons.
    +@line-height-base:        1.428571429; // 20/14
    +//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
    +@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px
    +
    +//** By default, this inherits from the ``.
    +@headings-font-family:    inherit;
    +@headings-font-weight:    500;
    +@headings-line-height:    1.1;
    +@headings-color:          inherit;
    +
    +
    +//== Iconography
    +//
    +//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
    +
    +//** Load fonts from this directory.
    +@icon-font-path:          "../fonts/";
    +//** File name for all font files.
    +@icon-font-name:          "glyphicons-halflings-regular";
    +//** Element ID within SVG icon file.
    +@icon-font-svg-id:        "glyphicons_halflingsregular";
    +
    +
    +//== Components
    +//
    +//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
    +
    +@padding-base-vertical:     6px;
    +@padding-base-horizontal:   12px;
    +
    +@padding-large-vertical:    10px;
    +@padding-large-horizontal:  16px;
    +
    +@padding-small-vertical:    5px;
    +@padding-small-horizontal:  10px;
    +
    +@padding-xs-vertical:       1px;
    +@padding-xs-horizontal:     5px;
    +
    +@line-height-large:         1.3333333; // extra decimals for Win 8.1 Chrome
    +@line-height-small:         1.5;
    +
    +@border-radius-base:        4px;
    +@border-radius-large:       6px;
    +@border-radius-small:       3px;
    +
    +//** Global color for active items (e.g., navs or dropdowns).
    +@component-active-color:    #fff;
    +//** Global background color for active items (e.g., navs or dropdowns).
    +@component-active-bg:       @brand-primary;
    +
    +//** Width of the `border` for generating carets that indicator dropdowns.
    +@caret-width-base:          4px;
    +//** Carets increase slightly in size for larger components.
    +@caret-width-large:         5px;
    +
    +
    +//== Tables
    +//
    +//## Customizes the `.table` component with basic values, each used across all table variations.
    +
    +//** Padding for ``s and ``s.
    +@table-cell-padding:            8px;
    +//** Padding for cells in `.table-condensed`.
    +@table-condensed-cell-padding:  5px;
    +
    +//** Default background color used for all tables.
    +@table-bg:                      transparent;
    +//** Background color used for `.table-striped`.
    +@table-bg-accent:               #f9f9f9;
    +//** Background color used for `.table-hover`.
    +@table-bg-hover:                #f5f5f5;
    +@table-bg-active:               @table-bg-hover;
    +
    +//** Border color for table and cell borders.
    +@table-border-color:            #ddd;
    +
    +
    +//== Buttons
    +//
    +//## For each of Bootstrap's buttons, define text, background and border color.
    +
    +@btn-font-weight:                normal;
    +
    +@btn-default-color:              #333;
    +@btn-default-bg:                 #fff;
    +@btn-default-border:             #ccc;
    +
    +@btn-primary-color:              #fff;
    +@btn-primary-bg:                 @brand-primary;
    +@btn-primary-border:             darken(@btn-primary-bg, 5%);
    +
    +@btn-success-color:              #fff;
    +@btn-success-bg:                 @brand-success;
    +@btn-success-border:             darken(@btn-success-bg, 5%);
    +
    +@btn-info-color:                 #fff;
    +@btn-info-bg:                    @brand-info;
    +@btn-info-border:                darken(@btn-info-bg, 5%);
    +
    +@btn-warning-color:              #fff;
    +@btn-warning-bg:                 @brand-warning;
    +@btn-warning-border:             darken(@btn-warning-bg, 5%);
    +
    +@btn-danger-color:               #fff;
    +@btn-danger-bg:                  @brand-danger;
    +@btn-danger-border:              darken(@btn-danger-bg, 5%);
    +
    +@btn-link-disabled-color:        @gray-light;
    +
    +// Allows for customizing button radius independently from global border radius
    +@btn-border-radius-base:         @border-radius-base;
    +@btn-border-radius-large:        @border-radius-large;
    +@btn-border-radius-small:        @border-radius-small;
    +
    +
    +//== Forms
    +//
    +//##
    +
    +//** `` background color
    +@input-bg:                       #fff;
    +//** `` background color
    +@input-bg-disabled:              @gray-lighter;
    +
    +//** Text color for ``s
    +@input-color:                    @gray;
    +//** `` border color
    +@input-border:                   #ccc;
    +
    +// TODO: Rename `@input-border-radius` to `@input-border-radius-base` in v4
    +//** Default `.form-control` border radius
    +// This has no effect on ``s in CSS.
    +@input-border-radius:            @border-radius-base;
    +//** Large `.form-control` border radius
    +@input-border-radius-large:      @border-radius-large;
    +//** Small `.form-control` border radius
    +@input-border-radius-small:      @border-radius-small;
    +
    +//** Border color for inputs on focus
    +@input-border-focus:             #66afe9;
    +
    +//** Placeholder text color
    +@input-color-placeholder:        #999;
    +
    +//** Default `.form-control` height
    +@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);
    +//** Large `.form-control` height
    +@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);
    +//** Small `.form-control` height
    +@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);
    +
    +//** `.form-group` margin
    +@form-group-margin-bottom:       15px;
    +
    +@legend-color:                   @gray-dark;
    +@legend-border-color:            #e5e5e5;
    +
    +//** Background color for textual input addons
    +@input-group-addon-bg:           @gray-lighter;
    +//** Border color for textual input addons
    +@input-group-addon-border-color: @input-border;
    +
    +//** Disabled cursor for form controls and buttons.
    +@cursor-disabled:                not-allowed;
    +
    +
    +//== Dropdowns
    +//
    +//## Dropdown menu container and contents.
    +
    +//** Background for the dropdown menu.
    +@dropdown-bg:                    #fff;
    +//** Dropdown menu `border-color`.
    +@dropdown-border:                rgba(0,0,0,.15);
    +//** Dropdown menu `border-color` **for IE8**.
    +@dropdown-fallback-border:       #ccc;
    +//** Divider color for between dropdown items.
    +@dropdown-divider-bg:            #e5e5e5;
    +
    +//** Dropdown link text color.
    +@dropdown-link-color:            @gray-dark;
    +//** Hover color for dropdown links.
    +@dropdown-link-hover-color:      darken(@gray-dark, 5%);
    +//** Hover background for dropdown links.
    +@dropdown-link-hover-bg:         #f5f5f5;
    +
    +//** Active dropdown menu item text color.
    +@dropdown-link-active-color:     @component-active-color;
    +//** Active dropdown menu item background color.
    +@dropdown-link-active-bg:        @component-active-bg;
    +
    +//** Disabled dropdown menu item background color.
    +@dropdown-link-disabled-color:   @gray-light;
    +
    +//** Text color for headers within dropdown menus.
    +@dropdown-header-color:          @gray-light;
    +
    +//** Deprecated `@dropdown-caret-color` as of v3.1.0
    +@dropdown-caret-color:           #000;
    +
    +
    +//-- Z-index master list
    +//
    +// Warning: Avoid customizing these values. They're used for a bird's eye view
    +// of components dependent on the z-axis and are designed to all work together.
    +//
    +// Note: These variables are not generated into the Customizer.
    +
    +@zindex-navbar:            1000;
    +@zindex-dropdown:          1000;
    +@zindex-popover:           1060;
    +@zindex-tooltip:           1070;
    +@zindex-navbar-fixed:      1030;
    +@zindex-modal-background:  1040;
    +@zindex-modal:             1050;
    +
    +
    +//== Media queries breakpoints
    +//
    +//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
    +
    +// Extra small screen / phone
    +//** Deprecated `@screen-xs` as of v3.0.1
    +@screen-xs:                  480px;
    +//** Deprecated `@screen-xs-min` as of v3.2.0
    +@screen-xs-min:              @screen-xs;
    +//** Deprecated `@screen-phone` as of v3.0.1
    +@screen-phone:               @screen-xs-min;
    +
    +// Small screen / tablet
    +//** Deprecated `@screen-sm` as of v3.0.1
    +@screen-sm:                  768px;
    +@screen-sm-min:              @screen-sm;
    +//** Deprecated `@screen-tablet` as of v3.0.1
    +@screen-tablet:              @screen-sm-min;
    +
    +// Medium screen / desktop
    +//** Deprecated `@screen-md` as of v3.0.1
    +@screen-md:                  992px;
    +@screen-md-min:              @screen-md;
    +//** Deprecated `@screen-desktop` as of v3.0.1
    +@screen-desktop:             @screen-md-min;
    +
    +// Large screen / wide desktop
    +//** Deprecated `@screen-lg` as of v3.0.1
    +@screen-lg:                  1200px;
    +@screen-lg-min:              @screen-lg;
    +//** Deprecated `@screen-lg-desktop` as of v3.0.1
    +@screen-lg-desktop:          @screen-lg-min;
    +
    +// So media queries don't overlap when required, provide a maximum
    +@screen-xs-max:              (@screen-sm-min - 1);
    +@screen-sm-max:              (@screen-md-min - 1);
    +@screen-md-max:              (@screen-lg-min - 1);
    +
    +
    +//== Grid system
    +//
    +//## Define your custom responsive grid.
    +
    +//** Number of columns in the grid.
    +@grid-columns:              12;
    +//** Padding between columns. Gets divided in half for the left and right.
    +@grid-gutter-width:         30px;
    +// Navbar collapse
    +//** Point at which the navbar becomes uncollapsed.
    +@grid-float-breakpoint:     @screen-sm-min;
    +//** Point at which the navbar begins collapsing.
    +@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);
    +
    +
    +//== Container sizes
    +//
    +//## Define the maximum width of `.container` for different screen sizes.
    +
    +// Small screen / tablet
    +@container-tablet:             (720px + @grid-gutter-width);
    +//** For `@screen-sm-min` and up.
    +@container-sm:                 @container-tablet;
    +
    +// Medium screen / desktop
    +@container-desktop:            (940px + @grid-gutter-width);
    +//** For `@screen-md-min` and up.
    +@container-md:                 @container-desktop;
    +
    +// Large screen / wide desktop
    +@container-large-desktop:      (1140px + @grid-gutter-width);
    +//** For `@screen-lg-min` and up.
    +@container-lg:                 @container-large-desktop;
    +
    +
    +//== Navbar
    +//
    +//##
    +
    +// Basics of a navbar
    +@navbar-height:                    50px;
    +@navbar-margin-bottom:             @line-height-computed;
    +@navbar-border-radius:             @border-radius-base;
    +@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));
    +@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);
    +@navbar-collapse-max-height:       340px;
    +
    +@navbar-default-color:             #777;
    +@navbar-default-bg:                #f8f8f8;
    +@navbar-default-border:            darken(@navbar-default-bg, 6.5%);
    +
    +// Navbar links
    +@navbar-default-link-color:                #777;
    +@navbar-default-link-hover-color:          #333;
    +@navbar-default-link-hover-bg:             transparent;
    +@navbar-default-link-active-color:         #555;
    +@navbar-default-link-active-bg:            darken(@navbar-default-bg, 6.5%);
    +@navbar-default-link-disabled-color:       #ccc;
    +@navbar-default-link-disabled-bg:          transparent;
    +
    +// Navbar brand label
    +@navbar-default-brand-color:               @navbar-default-link-color;
    +@navbar-default-brand-hover-color:         darken(@navbar-default-brand-color, 10%);
    +@navbar-default-brand-hover-bg:            transparent;
    +
    +// Navbar toggle
    +@navbar-default-toggle-hover-bg:           #ddd;
    +@navbar-default-toggle-icon-bar-bg:        #888;
    +@navbar-default-toggle-border-color:       #ddd;
    +
    +
    +//=== Inverted navbar
    +// Reset inverted navbar basics
    +@navbar-inverse-color:                      lighten(@gray-light, 15%);
    +@navbar-inverse-bg:                         #222;
    +@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);
    +
    +// Inverted navbar links
    +@navbar-inverse-link-color:                 lighten(@gray-light, 15%);
    +@navbar-inverse-link-hover-color:           #fff;
    +@navbar-inverse-link-hover-bg:              transparent;
    +@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;
    +@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 10%);
    +@navbar-inverse-link-disabled-color:        #444;
    +@navbar-inverse-link-disabled-bg:           transparent;
    +
    +// Inverted navbar brand label
    +@navbar-inverse-brand-color:                @navbar-inverse-link-color;
    +@navbar-inverse-brand-hover-color:          #fff;
    +@navbar-inverse-brand-hover-bg:             transparent;
    +
    +// Inverted navbar toggle
    +@navbar-inverse-toggle-hover-bg:            #333;
    +@navbar-inverse-toggle-icon-bar-bg:         #fff;
    +@navbar-inverse-toggle-border-color:        #333;
    +
    +
    +//== Navs
    +//
    +//##
    +
    +//=== Shared nav styles
    +@nav-link-padding:                          10px 15px;
    +@nav-link-hover-bg:                         @gray-lighter;
    +
    +@nav-disabled-link-color:                   @gray-light;
    +@nav-disabled-link-hover-color:             @gray-light;
    +
    +//== Tabs
    +@nav-tabs-border-color:                     #ddd;
    +
    +@nav-tabs-link-hover-border-color:          @gray-lighter;
    +
    +@nav-tabs-active-link-hover-bg:             @body-bg;
    +@nav-tabs-active-link-hover-color:          @gray;
    +@nav-tabs-active-link-hover-border-color:   #ddd;
    +
    +@nav-tabs-justified-link-border-color:            #ddd;
    +@nav-tabs-justified-active-link-border-color:     @body-bg;
    +
    +//== Pills
    +@nav-pills-border-radius:                   @border-radius-base;
    +@nav-pills-active-link-hover-bg:            @component-active-bg;
    +@nav-pills-active-link-hover-color:         @component-active-color;
    +
    +
    +//== Pagination
    +//
    +//##
    +
    +@pagination-color:                     @link-color;
    +@pagination-bg:                        #fff;
    +@pagination-border:                    #ddd;
    +
    +@pagination-hover-color:               @link-hover-color;
    +@pagination-hover-bg:                  @gray-lighter;
    +@pagination-hover-border:              #ddd;
    +
    +@pagination-active-color:              #fff;
    +@pagination-active-bg:                 @brand-primary;
    +@pagination-active-border:             @brand-primary;
    +
    +@pagination-disabled-color:            @gray-light;
    +@pagination-disabled-bg:               #fff;
    +@pagination-disabled-border:           #ddd;
    +
    +
    +//== Pager
    +//
    +//##
    +
    +@pager-bg:                             @pagination-bg;
    +@pager-border:                         @pagination-border;
    +@pager-border-radius:                  15px;
    +
    +@pager-hover-bg:                       @pagination-hover-bg;
    +
    +@pager-active-bg:                      @pagination-active-bg;
    +@pager-active-color:                   @pagination-active-color;
    +
    +@pager-disabled-color:                 @pagination-disabled-color;
    +
    +
    +//== Jumbotron
    +//
    +//##
    +
    +@jumbotron-padding:              30px;
    +@jumbotron-color:                inherit;
    +@jumbotron-bg:                   @gray-lighter;
    +@jumbotron-heading-color:        inherit;
    +@jumbotron-font-size:            ceil((@font-size-base * 1.5));
    +@jumbotron-heading-font-size:    ceil((@font-size-base * 4.5));
    +
    +
    +//== Form states and alerts
    +//
    +//## Define colors for form feedback states and, by default, alerts.
    +
    +@state-success-text:             #3c763d;
    +@state-success-bg:               #dff0d8;
    +@state-success-border:           darken(spin(@state-success-bg, -10), 5%);
    +
    +@state-info-text:                #31708f;
    +@state-info-bg:                  #d9edf7;
    +@state-info-border:              darken(spin(@state-info-bg, -10), 7%);
    +
    +@state-warning-text:             #8a6d3b;
    +@state-warning-bg:               #fcf8e3;
    +@state-warning-border:           darken(spin(@state-warning-bg, -10), 5%);
    +
    +@state-danger-text:              #a94442;
    +@state-danger-bg:                #f2dede;
    +@state-danger-border:            darken(spin(@state-danger-bg, -10), 5%);
    +
    +
    +//== Tooltips
    +//
    +//##
    +
    +//** Tooltip max width
    +@tooltip-max-width:           200px;
    +//** Tooltip text color
    +@tooltip-color:               #fff;
    +//** Tooltip background color
    +@tooltip-bg:                  #000;
    +@tooltip-opacity:             .9;
    +
    +//** Tooltip arrow width
    +@tooltip-arrow-width:         5px;
    +//** Tooltip arrow color
    +@tooltip-arrow-color:         @tooltip-bg;
    +
    +
    +//== Popovers
    +//
    +//##
    +
    +//** Popover body background color
    +@popover-bg:                          #fff;
    +//** Popover maximum width
    +@popover-max-width:                   276px;
    +//** Popover border color
    +@popover-border-color:                rgba(0,0,0,.2);
    +//** Popover fallback border color
    +@popover-fallback-border-color:       #ccc;
    +
    +//** Popover title background color
    +@popover-title-bg:                    darken(@popover-bg, 3%);
    +
    +//** Popover arrow width
    +@popover-arrow-width:                 10px;
    +//** Popover arrow color
    +@popover-arrow-color:                 @popover-bg;
    +
    +//** Popover outer arrow width
    +@popover-arrow-outer-width:           (@popover-arrow-width + 1);
    +//** Popover outer arrow color
    +@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);
    +//** Popover outer arrow fallback color
    +@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);
    +
    +
    +//== Labels
    +//
    +//##
    +
    +//** Default label background color
    +@label-default-bg:            @gray-light;
    +//** Primary label background color
    +@label-primary-bg:            @brand-primary;
    +//** Success label background color
    +@label-success-bg:            @brand-success;
    +//** Info label background color
    +@label-info-bg:               @brand-info;
    +//** Warning label background color
    +@label-warning-bg:            @brand-warning;
    +//** Danger label background color
    +@label-danger-bg:             @brand-danger;
    +
    +//** Default label text color
    +@label-color:                 #fff;
    +//** Default text color of a linked label
    +@label-link-hover-color:      #fff;
    +
    +
    +//== Modals
    +//
    +//##
    +
    +//** Padding applied to the modal body
    +@modal-inner-padding:         15px;
    +
    +//** Padding applied to the modal title
    +@modal-title-padding:         15px;
    +//** Modal title line-height
    +@modal-title-line-height:     @line-height-base;
    +
    +//** Background color of modal content area
    +@modal-content-bg:                             #fff;
    +//** Modal content border color
    +@modal-content-border-color:                   rgba(0,0,0,.2);
    +//** Modal content border color **for IE8**
    +@modal-content-fallback-border-color:          #999;
    +
    +//** Modal backdrop background color
    +@modal-backdrop-bg:           #000;
    +//** Modal backdrop opacity
    +@modal-backdrop-opacity:      .5;
    +//** Modal header border color
    +@modal-header-border-color:   #e5e5e5;
    +//** Modal footer border color
    +@modal-footer-border-color:   @modal-header-border-color;
    +
    +@modal-lg:                    900px;
    +@modal-md:                    600px;
    +@modal-sm:                    300px;
    +
    +
    +//== Alerts
    +//
    +//## Define alert colors, border radius, and padding.
    +
    +@alert-padding:               15px;
    +@alert-border-radius:         @border-radius-base;
    +@alert-link-font-weight:      bold;
    +
    +@alert-success-bg:            @state-success-bg;
    +@alert-success-text:          @state-success-text;
    +@alert-success-border:        @state-success-border;
    +
    +@alert-info-bg:               @state-info-bg;
    +@alert-info-text:             @state-info-text;
    +@alert-info-border:           @state-info-border;
    +
    +@alert-warning-bg:            @state-warning-bg;
    +@alert-warning-text:          @state-warning-text;
    +@alert-warning-border:        @state-warning-border;
    +
    +@alert-danger-bg:             @state-danger-bg;
    +@alert-danger-text:           @state-danger-text;
    +@alert-danger-border:         @state-danger-border;
    +
    +
    +//== Progress bars
    +//
    +//##
    +
    +//** Background color of the whole progress component
    +@progress-bg:                 #f5f5f5;
    +//** Progress bar text color
    +@progress-bar-color:          #fff;
    +//** Variable for setting rounded corners on progress bar.
    +@progress-border-radius:      @border-radius-base;
    +
    +//** Default progress bar color
    +@progress-bar-bg:             @brand-primary;
    +//** Success progress bar color
    +@progress-bar-success-bg:     @brand-success;
    +//** Warning progress bar color
    +@progress-bar-warning-bg:     @brand-warning;
    +//** Danger progress bar color
    +@progress-bar-danger-bg:      @brand-danger;
    +//** Info progress bar color
    +@progress-bar-info-bg:        @brand-info;
    +
    +
    +//== List group
    +//
    +//##
    +
    +//** Background color on `.list-group-item`
    +@list-group-bg:                 #fff;
    +//** `.list-group-item` border color
    +@list-group-border:             #ddd;
    +//** List group border radius
    +@list-group-border-radius:      @border-radius-base;
    +
    +//** Background color of single list items on hover
    +@list-group-hover-bg:           #f5f5f5;
    +//** Text color of active list items
    +@list-group-active-color:       @component-active-color;
    +//** Background color of active list items
    +@list-group-active-bg:          @component-active-bg;
    +//** Border color of active list elements
    +@list-group-active-border:      @list-group-active-bg;
    +//** Text color for content within active list items
    +@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);
    +
    +//** Text color of disabled list items
    +@list-group-disabled-color:      @gray-light;
    +//** Background color of disabled list items
    +@list-group-disabled-bg:         @gray-lighter;
    +//** Text color for content within disabled list items
    +@list-group-disabled-text-color: @list-group-disabled-color;
    +
    +@list-group-link-color:         #555;
    +@list-group-link-hover-color:   @list-group-link-color;
    +@list-group-link-heading-color: #333;
    +
    +
    +//== Panels
    +//
    +//##
    +
    +@panel-bg:                    #fff;
    +@panel-body-padding:          15px;
    +@panel-heading-padding:       10px 15px;
    +@panel-footer-padding:        @panel-heading-padding;
    +@panel-border-radius:         @border-radius-base;
    +
    +//** Border color for elements within panels
    +@panel-inner-border:          #ddd;
    +@panel-footer-bg:             #f5f5f5;
    +
    +@panel-default-text:          @gray-dark;
    +@panel-default-border:        #ddd;
    +@panel-default-heading-bg:    #f5f5f5;
    +
    +@panel-primary-text:          #fff;
    +@panel-primary-border:        @brand-primary;
    +@panel-primary-heading-bg:    @brand-primary;
    +
    +@panel-success-text:          @state-success-text;
    +@panel-success-border:        @state-success-border;
    +@panel-success-heading-bg:    @state-success-bg;
    +
    +@panel-info-text:             @state-info-text;
    +@panel-info-border:           @state-info-border;
    +@panel-info-heading-bg:       @state-info-bg;
    +
    +@panel-warning-text:          @state-warning-text;
    +@panel-warning-border:        @state-warning-border;
    +@panel-warning-heading-bg:    @state-warning-bg;
    +
    +@panel-danger-text:           @state-danger-text;
    +@panel-danger-border:         @state-danger-border;
    +@panel-danger-heading-bg:     @state-danger-bg;
    +
    +
    +//== Thumbnails
    +//
    +//##
    +
    +//** Padding around the thumbnail image
    +@thumbnail-padding:           4px;
    +//** Thumbnail background color
    +@thumbnail-bg:                @body-bg;
    +//** Thumbnail border color
    +@thumbnail-border:            #ddd;
    +//** Thumbnail border radius
    +@thumbnail-border-radius:     @border-radius-base;
    +
    +//** Custom text color for thumbnail captions
    +@thumbnail-caption-color:     @text-color;
    +//** Padding around the thumbnail caption
    +@thumbnail-caption-padding:   9px;
    +
    +
    +//== Wells
    +//
    +//##
    +
    +@well-bg:                     #f5f5f5;
    +@well-border:                 darken(@well-bg, 7%);
    +
    +
    +//== Badges
    +//
    +//##
    +
    +@badge-color:                 #fff;
    +//** Linked badge text color on hover
    +@badge-link-hover-color:      #fff;
    +@badge-bg:                    @gray-light;
    +
    +//** Badge text color in active nav link
    +@badge-active-color:          @link-color;
    +//** Badge background color in active nav link
    +@badge-active-bg:             #fff;
    +
    +@badge-font-weight:           bold;
    +@badge-line-height:           1;
    +@badge-border-radius:         10px;
    +
    +
    +//== Breadcrumbs
    +//
    +//##
    +
    +@breadcrumb-padding-vertical:   8px;
    +@breadcrumb-padding-horizontal: 15px;
    +//** Breadcrumb background color
    +@breadcrumb-bg:                 #f5f5f5;
    +//** Breadcrumb text color
    +@breadcrumb-color:              #ccc;
    +//** Text color of current page in the breadcrumb
    +@breadcrumb-active-color:       @gray-light;
    +//** Textual separator for between breadcrumb elements
    +@breadcrumb-separator:          "/";
    +
    +
    +//== Carousel
    +//
    +//##
    +
    +@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);
    +
    +@carousel-control-color:                      #fff;
    +@carousel-control-width:                      15%;
    +@carousel-control-opacity:                    .5;
    +@carousel-control-font-size:                  20px;
    +
    +@carousel-indicator-active-bg:                #fff;
    +@carousel-indicator-border-color:             #fff;
    +
    +@carousel-caption-color:                      #fff;
    +
    +
    +//== Close
    +//
    +//##
    +
    +@close-font-weight:           bold;
    +@close-color:                 #000;
    +@close-text-shadow:           0 1px 0 #fff;
    +
    +
    +//== Code
    +//
    +//##
    +
    +@code-color:                  #c7254e;
    +@code-bg:                     #f9f2f4;
    +
    +@kbd-color:                   #fff;
    +@kbd-bg:                      #333;
    +
    +@pre-bg:                      #f5f5f5;
    +@pre-color:                   @gray-dark;
    +@pre-border-color:            #ccc;
    +@pre-scrollable-max-height:   340px;
    +
    +
    +//== Type
    +//
    +//##
    +
    +//** Horizontal offset for forms and lists.
    +@component-offset-horizontal: 180px;
    +//** Text muted color
    +@text-muted:                  @gray-light;
    +//** Abbreviations and acronyms border color
    +@abbr-border-color:           @gray-light;
    +//** Headings small color
    +@headings-small-color:        @gray-light;
    +//** Blockquote small color
    +@blockquote-small-color:      @gray-light;
    +//** Blockquote font size
    +@blockquote-font-size:        (@font-size-base * 1.25);
    +//** Blockquote border color
    +@blockquote-border-color:     @gray-lighter;
    +//** Page header border color
    +@page-header-border-color:    @gray-lighter;
    +//** Width of horizontal description list titles
    +@dl-horizontal-offset:        @component-offset-horizontal;
    +//** Point at which .dl-horizontal becomes horizontal
    +@dl-horizontal-breakpoint:    @grid-float-breakpoint;
    +//** Horizontal line color.
    +@hr-border:                   @gray-lighter;
    diff --git a/src/main/webapp/vendors/bootstrap/less/wells.less b/src/main/webapp/vendors/bootstrap/less/wells.less
    new file mode 100644
    index 000000000..15d072b0c
    --- /dev/null
    +++ b/src/main/webapp/vendors/bootstrap/less/wells.less
    @@ -0,0 +1,29 @@
    +//
    +// Wells
    +// --------------------------------------------------
    +
    +
    +// Base class
    +.well {
    +  min-height: 20px;
    +  padding: 19px;
    +  margin-bottom: 20px;
    +  background-color: @well-bg;
    +  border: 1px solid @well-border;
    +  border-radius: @border-radius-base;
    +  .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
    +  blockquote {
    +    border-color: #ddd;
    +    border-color: rgba(0,0,0,.15);
    +  }
    +}
    +
    +// Sizes
    +.well-lg {
    +  padding: 24px;
    +  border-radius: @border-radius-large;
    +}
    +.well-sm {
    +  padding: 9px;
    +  border-radius: @border-radius-small;
    +}
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/images/animated-overlay.gif b/src/main/webapp/vendors/jquery-ui/themes/base/images/animated-overlay.gif
    new file mode 100644
    index 000000000..d441f75eb
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/images/animated-overlay.gif differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png
    new file mode 100644
    index 000000000..5b5dab2ab
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_flat_75_ffffff_40x100.png b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_flat_75_ffffff_40x100.png
    new file mode 100644
    index 000000000..ac8b229af
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_flat_75_ffffff_40x100.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png
    new file mode 100644
    index 000000000..ad3d6346e
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_glass_65_ffffff_1x400.png b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_glass_65_ffffff_1x400.png
    new file mode 100644
    index 000000000..42ccba269
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_glass_65_ffffff_1x400.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_glass_75_dadada_1x400.png b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_glass_75_dadada_1x400.png
    new file mode 100644
    index 000000000..5a46b47cb
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_glass_75_dadada_1x400.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png
    new file mode 100644
    index 000000000..86c2baa65
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png
    new file mode 100644
    index 000000000..4443fdc1a
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png
    new file mode 100644
    index 000000000..7c9fa6c6e
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-icons_222222_256x240.png b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-icons_222222_256x240.png
    new file mode 100644
    index 000000000..ee039dc09
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-icons_222222_256x240.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-icons_2e83ff_256x240.png b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-icons_2e83ff_256x240.png
    new file mode 100644
    index 000000000..45e8928e5
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-icons_2e83ff_256x240.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-icons_454545_256x240.png b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-icons_454545_256x240.png
    new file mode 100644
    index 000000000..7ec70d11b
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-icons_454545_256x240.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-icons_888888_256x240.png b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-icons_888888_256x240.png
    new file mode 100644
    index 000000000..5ba708c39
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-icons_888888_256x240.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-icons_cd0a0a_256x240.png b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-icons_cd0a0a_256x240.png
    new file mode 100644
    index 000000000..7930a5580
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/images/ui-icons_cd0a0a_256x240.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/jquery-ui.css b/src/main/webapp/vendors/jquery-ui/themes/base/jquery-ui.css
    new file mode 100644
    index 000000000..b3f091aff
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/jquery-ui.css
    @@ -0,0 +1,1177 @@
    +/*! jQuery UI - v1.10.4 - 2014-02-18
    +* http://jqueryui.com
    +* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css, jquery.ui.theme.css
    +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
    +
    +/* Layout helpers
    +----------------------------------*/
    +.ui-helper-hidden {
    +	display: none;
    +}
    +.ui-helper-hidden-accessible {
    +	border: 0;
    +	clip: rect(0 0 0 0);
    +	height: 1px;
    +	margin: -1px;
    +	overflow: hidden;
    +	padding: 0;
    +	position: absolute;
    +	width: 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:before,
    +.ui-helper-clearfix:after {
    +	content: "";
    +	display: table;
    +	border-collapse: collapse;
    +}
    +.ui-helper-clearfix:after {
    +	clear: both;
    +}
    +.ui-helper-clearfix {
    +	min-height: 0; /* support: IE7 */
    +}
    +.ui-helper-zfix {
    +	width: 100%;
    +	height: 100%;
    +	top: 0;
    +	left: 0;
    +	position: absolute;
    +	opacity: 0;
    +	filter:Alpha(Opacity=0);
    +}
    +
    +.ui-front {
    +	z-index: 100;
    +}
    +
    +
    +/* 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: fixed;
    +	top: 0;
    +	left: 0;
    +	width: 100%;
    +	height: 100%;
    +}
    +.ui-resizable {
    +	position: relative;
    +}
    +.ui-resizable-handle {
    +	position: absolute;
    +	font-size: 0.1px;
    +	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;
    +}
    +.ui-selectable-helper {
    +	position: absolute;
    +	z-index: 100;
    +	border: 1px dotted black;
    +}
    +.ui-accordion .ui-accordion-header {
    +	display: block;
    +	cursor: pointer;
    +	position: relative;
    +	margin-top: 2px;
    +	padding: .5em .5em .5em .7em;
    +	min-height: 0; /* support: IE7 */
    +}
    +.ui-accordion .ui-accordion-icons {
    +	padding-left: 2.2em;
    +}
    +.ui-accordion .ui-accordion-noicons {
    +	padding-left: .7em;
    +}
    +.ui-accordion .ui-accordion-icons .ui-accordion-icons {
    +	padding-left: 2.2em;
    +}
    +.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
    +	position: absolute;
    +	left: .5em;
    +	top: 50%;
    +	margin-top: -8px;
    +}
    +.ui-accordion .ui-accordion-content {
    +	padding: 1em 2.2em;
    +	border-top: 0;
    +	overflow: auto;
    +}
    +.ui-autocomplete {
    +	position: absolute;
    +	top: 0;
    +	left: 0;
    +	cursor: default;
    +}
    +.ui-button {
    +	display: inline-block;
    +	position: relative;
    +	padding: 0;
    +	line-height: normal;
    +	margin-right: .1em;
    +	cursor: pointer;
    +	vertical-align: middle;
    +	text-align: center;
    +	overflow: visible; /* removes extra width in IE */
    +}
    +.ui-button,
    +.ui-button:link,
    +.ui-button:visited,
    +.ui-button:hover,
    +.ui-button:active {
    +	text-decoration: none;
    +}
    +/* to make room for the icon, a width needs to be set here */
    +.ui-button-icon-only {
    +	width: 2.2em;
    +}
    +/* button elements seem to need a little more width */
    +button.ui-button-icon-only {
    +	width: 2.4em;
    +}
    +.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: normal;
    +}
    +.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;
    +}
    +
    +/* button sets */
    +.ui-buttonset {
    +	margin-right: 7px;
    +}
    +.ui-buttonset .ui-button {
    +	margin-left: 0;
    +	margin-right: -.3em;
    +}
    +
    +/* workarounds */
    +/* reset extra padding in Firefox, see h5bp.com/l */
    +input.ui-button::-moz-focus-inner,
    +button.ui-button::-moz-focus-inner {
    +	border: 0;
    +	padding: 0;
    +}
    +.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,
    +.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,
    +.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: 0;
    +}
    +
    +/* 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,
    +.ui-datepicker-rtl .ui-datepicker-group {
    +	float: right;
    +}
    +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
    +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
    +	border-right-width: 0;
    +	border-left-width: 1px;
    +}
    +.ui-dialog {
    +	overflow: hidden;
    +	position: absolute;
    +	top: 0;
    +	left: 0;
    +	padding: .2em;
    +	outline: 0;
    +}
    +.ui-dialog .ui-dialog-titlebar {
    +	padding: .4em 1em;
    +	position: relative;
    +}
    +.ui-dialog .ui-dialog-title {
    +	float: left;
    +	margin: .1em 0;
    +	white-space: nowrap;
    +	width: 90%;
    +	overflow: hidden;
    +	text-overflow: ellipsis;
    +}
    +.ui-dialog .ui-dialog-titlebar-close {
    +	position: absolute;
    +	right: .3em;
    +	top: 50%;
    +	width: 20px;
    +	margin: -10px 0 0 0;
    +	padding: 1px;
    +	height: 20px;
    +}
    +.ui-dialog .ui-dialog-content {
    +	position: relative;
    +	border: 0;
    +	padding: .5em 1em;
    +	background: none;
    +	overflow: auto;
    +}
    +.ui-dialog .ui-dialog-buttonpane {
    +	text-align: left;
    +	border-width: 1px 0 0 0;
    +	background-image: none;
    +	margin-top: .5em;
    +	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: 12px;
    +	height: 12px;
    +	right: -5px;
    +	bottom: -5px;
    +	background-position: 16px 16px;
    +}
    +.ui-draggable .ui-dialog-titlebar {
    +	cursor: move;
    +}
    +.ui-menu {
    +	list-style: none;
    +	padding: 2px;
    +	margin: 0;
    +	display: block;
    +	outline: none;
    +}
    +.ui-menu .ui-menu {
    +	margin-top: -3px;
    +	position: absolute;
    +}
    +.ui-menu .ui-menu-item {
    +	margin: 0;
    +	padding: 0;
    +	width: 100%;
    +	/* support: IE10, see #8844 */
    +	list-style-image: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
    +}
    +.ui-menu .ui-menu-divider {
    +	margin: 5px -2px 5px -2px;
    +	height: 0;
    +	font-size: 0;
    +	line-height: 0;
    +	border-width: 1px 0 0 0;
    +}
    +.ui-menu .ui-menu-item a {
    +	text-decoration: none;
    +	display: block;
    +	padding: 2px .4em;
    +	line-height: 1.5;
    +	min-height: 0; /* support: IE7 */
    +	font-weight: normal;
    +}
    +.ui-menu .ui-menu-item a.ui-state-focus,
    +.ui-menu .ui-menu-item a.ui-state-active {
    +	font-weight: normal;
    +	margin: -1px;
    +}
    +
    +.ui-menu .ui-state-disabled {
    +	font-weight: normal;
    +	margin: .4em 0 .2em;
    +	line-height: 1.5;
    +}
    +.ui-menu .ui-state-disabled a {
    +	cursor: default;
    +}
    +
    +/* icon support */
    +.ui-menu-icons {
    +	position: relative;
    +}
    +.ui-menu-icons .ui-menu-item a {
    +	position: relative;
    +	padding-left: 2em;
    +}
    +
    +/* left-aligned */
    +.ui-menu .ui-icon {
    +	position: absolute;
    +	top: .2em;
    +	left: .2em;
    +}
    +
    +/* right-aligned */
    +.ui-menu .ui-menu-icon {
    +	position: static;
    +	float: right;
    +}
    +.ui-progressbar {
    +	height: 2em;
    +	text-align: left;
    +	overflow: hidden;
    +}
    +.ui-progressbar .ui-progressbar-value {
    +	margin: -1px;
    +	height: 100%;
    +}
    +.ui-progressbar .ui-progressbar-overlay {
    +	background: url("images/animated-overlay.gif");
    +	height: 100%;
    +	filter: alpha(opacity=25);
    +	opacity: 0.25;
    +}
    +.ui-progressbar-indeterminate .ui-progressbar-value {
    +	background-image: none;
    +}
    +.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;
    +}
    +
    +/* For IE8 - See #6727 */
    +.ui-slider.ui-state-disabled .ui-slider-handle,
    +.ui-slider.ui-state-disabled .ui-slider-range {
    +	filter: inherit;
    +}
    +
    +.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;
    +}
    +.ui-spinner {
    +	position: relative;
    +	display: inline-block;
    +	overflow: hidden;
    +	padding: 0;
    +	vertical-align: middle;
    +}
    +.ui-spinner-input {
    +	border: none;
    +	background: none;
    +	color: inherit;
    +	padding: 0;
    +	margin: .2em 0;
    +	vertical-align: middle;
    +	margin-left: .4em;
    +	margin-right: 22px;
    +}
    +.ui-spinner-button {
    +	width: 16px;
    +	height: 50%;
    +	font-size: .5em;
    +	padding: 0;
    +	margin: 0;
    +	text-align: center;
    +	position: absolute;
    +	cursor: default;
    +	display: block;
    +	overflow: hidden;
    +	right: 0;
    +}
    +/* more specificity required here to override default borders */
    +.ui-spinner a.ui-spinner-button {
    +	border-top: none;
    +	border-bottom: none;
    +	border-right: none;
    +}
    +/* vertically center icon */
    +.ui-spinner .ui-icon {
    +	position: absolute;
    +	margin-top: -8px;
    +	top: 50%;
    +	left: 0;
    +}
    +.ui-spinner-up {
    +	top: 0;
    +}
    +.ui-spinner-down {
    +	bottom: 0;
    +}
    +
    +/* TR overrides */
    +.ui-spinner .ui-icon-triangle-1-s {
    +	/* need to fix icons sprite */
    +	background-position: -65px -16px;
    +}
    +.ui-tabs {
    +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
    +	padding: .2em;
    +}
    +.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: 0;
    +	margin: 1px .2em 0 0;
    +	border-bottom-width: 0;
    +	padding: 0;
    +	white-space: nowrap;
    +}
    +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
    +	float: left;
    +	padding: .5em 1em;
    +	text-decoration: none;
    +}
    +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
    +	margin-bottom: -1px;
    +	padding-bottom: 1px;
    +}
    +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
    +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
    +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
    +	cursor: text;
    +}
    +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
    +	cursor: pointer;
    +}
    +.ui-tabs .ui-tabs-panel {
    +	display: block;
    +	border-width: 0;
    +	padding: 1em 1.4em;
    +	background: none;
    +}
    +.ui-tooltip {
    +	padding: 8px;
    +	position: absolute;
    +	z-index: 9999;
    +	max-width: 300px;
    +	-webkit-box-shadow: 0 0 5px #aaa;
    +	box-shadow: 0 0 5px #aaa;
    +}
    +body .ui-tooltip {
    +	border-width: 2px;
    +}
    +
    +/* Component containers
    +----------------------------------*/
    +.ui-widget {
    +	font-family: Verdana,Arial,sans-serif/*{ffDefault}*/;
    +	font-size: 1.1em/*{fsDefault}*/;
    +}
    +.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/*{ffDefault}*/;
    +	font-size: 1em;
    +}
    +.ui-widget-content {
    +	border: 1px solid #aaaaaa/*{borderColorContent}*/;
    +	background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/;
    +	color: #222222/*{fcContent}*/;
    +}
    +.ui-widget-content a {
    +	color: #222222/*{fcContent}*/;
    +}
    +.ui-widget-header {
    +	border: 1px solid #aaaaaa/*{borderColorHeader}*/;
    +	background: #cccccc/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/;
    +	color: #222222/*{fcHeader}*/;
    +	font-weight: bold;
    +}
    +.ui-widget-header a {
    +	color: #222222/*{fcHeader}*/;
    +}
    +
    +/* Interaction states
    +----------------------------------*/
    +.ui-state-default,
    +.ui-widget-content .ui-state-default,
    +.ui-widget-header .ui-state-default {
    +	border: 1px solid #d3d3d3/*{borderColorDefault}*/;
    +	background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/;
    +	font-weight: normal/*{fwDefault}*/;
    +	color: #555555/*{fcDefault}*/;
    +}
    +.ui-state-default a,
    +.ui-state-default a:link,
    +.ui-state-default a:visited {
    +	color: #555555/*{fcDefault}*/;
    +	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/*{borderColorHover}*/;
    +	background: #dadada/*{bgColorHover}*/ url(images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/;
    +	font-weight: normal/*{fwDefault}*/;
    +	color: #212121/*{fcHover}*/;
    +}
    +.ui-state-hover a,
    +.ui-state-hover a:hover,
    +.ui-state-hover a:link,
    +.ui-state-hover a:visited,
    +.ui-state-focus a,
    +.ui-state-focus a:hover,
    +.ui-state-focus a:link,
    +.ui-state-focus a:visited {
    +	color: #212121/*{fcHover}*/;
    +	text-decoration: none;
    +}
    +.ui-state-active,
    +.ui-widget-content .ui-state-active,
    +.ui-widget-header .ui-state-active {
    +	border: 1px solid #aaaaaa/*{borderColorActive}*/;
    +	background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/;
    +	font-weight: normal/*{fwDefault}*/;
    +	color: #212121/*{fcActive}*/;
    +}
    +.ui-state-active a,
    +.ui-state-active a:link,
    +.ui-state-active a:visited {
    +	color: #212121/*{fcActive}*/;
    +	text-decoration: none;
    +}
    +
    +/* Interaction Cues
    +----------------------------------*/
    +.ui-state-highlight,
    +.ui-widget-content .ui-state-highlight,
    +.ui-widget-header .ui-state-highlight {
    +	border: 1px solid #fcefa1/*{borderColorHighlight}*/;
    +	background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/;
    +	color: #363636/*{fcHighlight}*/;
    +}
    +.ui-state-highlight a,
    +.ui-widget-content .ui-state-highlight a,
    +.ui-widget-header .ui-state-highlight a {
    +	color: #363636/*{fcHighlight}*/;
    +}
    +.ui-state-error,
    +.ui-widget-content .ui-state-error,
    +.ui-widget-header .ui-state-error {
    +	border: 1px solid #cd0a0a/*{borderColorError}*/;
    +	background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/;
    +	color: #cd0a0a/*{fcError}*/;
    +}
    +.ui-state-error a,
    +.ui-widget-content .ui-state-error a,
    +.ui-widget-header .ui-state-error a {
    +	color: #cd0a0a/*{fcError}*/;
    +}
    +.ui-state-error-text,
    +.ui-widget-content .ui-state-error-text,
    +.ui-widget-header .ui-state-error-text {
    +	color: #cd0a0a/*{fcError}*/;
    +}
    +.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;
    +}
    +.ui-state-disabled .ui-icon {
    +	filter:Alpha(Opacity=35); /* For IE8 - See #6059 */
    +}
    +
    +/* Icons
    +----------------------------------*/
    +
    +/* states and images */
    +.ui-icon {
    +	width: 16px;
    +	height: 16px;
    +}
    +.ui-icon,
    +.ui-widget-content .ui-icon {
    +	background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/;
    +}
    +.ui-widget-header .ui-icon {
    +	background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/;
    +}
    +.ui-state-default .ui-icon {
    +	background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/;
    +}
    +.ui-state-hover .ui-icon,
    +.ui-state-focus .ui-icon {
    +	background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/;
    +}
    +.ui-state-active .ui-icon {
    +	background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/;
    +}
    +.ui-state-highlight .ui-icon {
    +	background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/;
    +}
    +.ui-state-error .ui-icon,
    +.ui-state-error-text .ui-icon {
    +	background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/;
    +}
    +
    +/* positioning */
    +.ui-icon-blank { background-position: 16px 16px; }
    +.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-on { background-position: -96px -144px; }
    +.ui-icon-radio-off { 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 {
    +	border-top-left-radius: 4px/*{cornerRadius}*/;
    +}
    +.ui-corner-all,
    +.ui-corner-top,
    +.ui-corner-right,
    +.ui-corner-tr {
    +	border-top-right-radius: 4px/*{cornerRadius}*/;
    +}
    +.ui-corner-all,
    +.ui-corner-bottom,
    +.ui-corner-left,
    +.ui-corner-bl {
    +	border-bottom-left-radius: 4px/*{cornerRadius}*/;
    +}
    +.ui-corner-all,
    +.ui-corner-bottom,
    +.ui-corner-right,
    +.ui-corner-br {
    +	border-bottom-right-radius: 4px/*{cornerRadius}*/;
    +}
    +
    +/* Overlays */
    +.ui-widget-overlay {
    +	background: #aaaaaa/*{bgColorOverlay}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/;
    +	opacity: .3/*{opacityOverlay}*/;
    +	filter: Alpha(Opacity=30)/*{opacityFilterOverlay}*/;
    +}
    +.ui-widget-shadow {
    +	margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/;
    +	padding: 8px/*{thicknessShadow}*/;
    +	background: #aaaaaa/*{bgColorShadow}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/;
    +	opacity: .3/*{opacityShadow}*/;
    +	filter: Alpha(Opacity=30)/*{opacityFilterShadow}*/;
    +	border-radius: 8px/*{cornerRadiusShadow}*/;
    +}
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.accordion.css b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.accordion.css
    new file mode 100644
    index 000000000..e224270b5
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.accordion.css
    @@ -0,0 +1,38 @@
    +/*!
    + * jQuery UI Accordion 1.10.4
    + * http://jqueryui.com
    + *
    + * Copyright 2014 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + *
    + * http://api.jqueryui.com/accordion/#theming
    + */
    +.ui-accordion .ui-accordion-header {
    +	display: block;
    +	cursor: pointer;
    +	position: relative;
    +	margin-top: 2px;
    +	padding: .5em .5em .5em .7em;
    +	min-height: 0; /* support: IE7 */
    +}
    +.ui-accordion .ui-accordion-icons {
    +	padding-left: 2.2em;
    +}
    +.ui-accordion .ui-accordion-noicons {
    +	padding-left: .7em;
    +}
    +.ui-accordion .ui-accordion-icons .ui-accordion-icons {
    +	padding-left: 2.2em;
    +}
    +.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
    +	position: absolute;
    +	left: .5em;
    +	top: 50%;
    +	margin-top: -8px;
    +}
    +.ui-accordion .ui-accordion-content {
    +	padding: 1em 2.2em;
    +	border-top: 0;
    +	overflow: auto;
    +}
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.all.css b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.all.css
    new file mode 100644
    index 000000000..cfe9c621c
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.all.css
    @@ -0,0 +1,12 @@
    +/*!
    + * jQuery UI CSS Framework 1.10.4
    + * http://jqueryui.com
    + *
    + * Copyright 2014 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + *
    + * http://api.jqueryui.com/category/theming/
    + */
    +@import "jquery.ui.base.css";
    +@import "jquery.ui.theme.css";
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.autocomplete.css b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.autocomplete.css
    new file mode 100644
    index 000000000..17a34dafb
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.autocomplete.css
    @@ -0,0 +1,16 @@
    +/*!
    + * jQuery UI Autocomplete 1.10.4
    + * http://jqueryui.com
    + *
    + * Copyright 2014 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + *
    + * http://api.jqueryui.com/autocomplete/#theming
    + */
    +.ui-autocomplete {
    +	position: absolute;
    +	top: 0;
    +	left: 0;
    +	cursor: default;
    +}
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.base.css b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.base.css
    new file mode 100644
    index 000000000..66dc1bc64
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.base.css
    @@ -0,0 +1,25 @@
    +/*!
    + * jQuery UI CSS Framework 1.10.4
    + * http://jqueryui.com
    + *
    + * Copyright 2014 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + *
    + * http://api.jqueryui.com/category/theming/
    + */
    +@import url("jquery.ui.core.css");
    +
    +@import url("jquery.ui.accordion.css");
    +@import url("jquery.ui.autocomplete.css");
    +@import url("jquery.ui.button.css");
    +@import url("jquery.ui.datepicker.css");
    +@import url("jquery.ui.dialog.css");
    +@import url("jquery.ui.menu.css");
    +@import url("jquery.ui.progressbar.css");
    +@import url("jquery.ui.resizable.css");
    +@import url("jquery.ui.selectable.css");
    +@import url("jquery.ui.slider.css");
    +@import url("jquery.ui.spinner.css");
    +@import url("jquery.ui.tabs.css");
    +@import url("jquery.ui.tooltip.css");
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.button.css b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.button.css
    new file mode 100644
    index 000000000..f6fb63a69
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.button.css
    @@ -0,0 +1,114 @@
    +/*!
    + * jQuery UI Button 1.10.4
    + * http://jqueryui.com
    + *
    + * Copyright 2014 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + *
    + * http://api.jqueryui.com/button/#theming
    + */
    +.ui-button {
    +	display: inline-block;
    +	position: relative;
    +	padding: 0;
    +	line-height: normal;
    +	margin-right: .1em;
    +	cursor: pointer;
    +	vertical-align: middle;
    +	text-align: center;
    +	overflow: visible; /* removes extra width in IE */
    +}
    +.ui-button,
    +.ui-button:link,
    +.ui-button:visited,
    +.ui-button:hover,
    +.ui-button:active {
    +	text-decoration: none;
    +}
    +/* to make room for the icon, a width needs to be set here */
    +.ui-button-icon-only {
    +	width: 2.2em;
    +}
    +/* button elements seem to need a little more width */
    +button.ui-button-icon-only {
    +	width: 2.4em;
    +}
    +.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: normal;
    +}
    +.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;
    +}
    +
    +/* button sets */
    +.ui-buttonset {
    +	margin-right: 7px;
    +}
    +.ui-buttonset .ui-button {
    +	margin-left: 0;
    +	margin-right: -.3em;
    +}
    +
    +/* workarounds */
    +/* reset extra padding in Firefox, see h5bp.com/l */
    +input.ui-button::-moz-focus-inner,
    +button.ui-button::-moz-focus-inner {
    +	border: 0;
    +	padding: 0;
    +}
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.core.css b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.core.css
    new file mode 100644
    index 000000000..76e4ba3dc
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.core.css
    @@ -0,0 +1,93 @@
    +/*!
    + * jQuery UI CSS Framework 1.10.4
    + * http://jqueryui.com
    + *
    + * Copyright 2014 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + *
    + * http://api.jqueryui.com/category/theming/
    + */
    +
    +/* Layout helpers
    +----------------------------------*/
    +.ui-helper-hidden {
    +	display: none;
    +}
    +.ui-helper-hidden-accessible {
    +	border: 0;
    +	clip: rect(0 0 0 0);
    +	height: 1px;
    +	margin: -1px;
    +	overflow: hidden;
    +	padding: 0;
    +	position: absolute;
    +	width: 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:before,
    +.ui-helper-clearfix:after {
    +	content: "";
    +	display: table;
    +	border-collapse: collapse;
    +}
    +.ui-helper-clearfix:after {
    +	clear: both;
    +}
    +.ui-helper-clearfix {
    +	min-height: 0; /* support: IE7 */
    +}
    +.ui-helper-zfix {
    +	width: 100%;
    +	height: 100%;
    +	top: 0;
    +	left: 0;
    +	position: absolute;
    +	opacity: 0;
    +	filter:Alpha(Opacity=0);
    +}
    +
    +.ui-front {
    +	z-index: 100;
    +}
    +
    +
    +/* 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: fixed;
    +	top: 0;
    +	left: 0;
    +	width: 100%;
    +	height: 100%;
    +}
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.datepicker.css b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.datepicker.css
    new file mode 100644
    index 000000000..109660ad7
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.datepicker.css
    @@ -0,0 +1,175 @@
    +/*!
    + * jQuery UI Datepicker 1.10.4
    + * http://jqueryui.com
    + *
    + * Copyright 2014 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + *
    + * http://api.jqueryui.com/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,
    +.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,
    +.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: 0;
    +}
    +
    +/* 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,
    +.ui-datepicker-rtl .ui-datepicker-group {
    +	float: right;
    +}
    +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
    +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
    +	border-right-width: 0;
    +	border-left-width: 1px;
    +}
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.dialog.css b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.dialog.css
    new file mode 100644
    index 000000000..372f703f6
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.dialog.css
    @@ -0,0 +1,70 @@
    +/*!
    + * jQuery UI Dialog 1.10.4
    + * http://jqueryui.com
    + *
    + * Copyright 2014 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + *
    + * http://api.jqueryui.com/dialog/#theming
    + */
    +.ui-dialog {
    +	overflow: hidden;
    +	position: absolute;
    +	top: 0;
    +	left: 0;
    +	padding: .2em;
    +	outline: 0;
    +}
    +.ui-dialog .ui-dialog-titlebar {
    +	padding: .4em 1em;
    +	position: relative;
    +}
    +.ui-dialog .ui-dialog-title {
    +	float: left;
    +	margin: .1em 0;
    +	white-space: nowrap;
    +	width: 90%;
    +	overflow: hidden;
    +	text-overflow: ellipsis;
    +}
    +.ui-dialog .ui-dialog-titlebar-close {
    +	position: absolute;
    +	right: .3em;
    +	top: 50%;
    +	width: 20px;
    +	margin: -10px 0 0 0;
    +	padding: 1px;
    +	height: 20px;
    +}
    +.ui-dialog .ui-dialog-content {
    +	position: relative;
    +	border: 0;
    +	padding: .5em 1em;
    +	background: none;
    +	overflow: auto;
    +}
    +.ui-dialog .ui-dialog-buttonpane {
    +	text-align: left;
    +	border-width: 1px 0 0 0;
    +	background-image: none;
    +	margin-top: .5em;
    +	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: 12px;
    +	height: 12px;
    +	right: -5px;
    +	bottom: -5px;
    +	background-position: 16px 16px;
    +}
    +.ui-draggable .ui-dialog-titlebar {
    +	cursor: move;
    +}
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.menu.css b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.menu.css
    new file mode 100644
    index 000000000..8604f9a7d
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.menu.css
    @@ -0,0 +1,79 @@
    +/*!
    + * jQuery UI Menu 1.10.4
    + * http://jqueryui.com
    + *
    + * Copyright 2014 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + *
    + * http://api.jqueryui.com/menu/#theming
    + */
    +.ui-menu {
    +	list-style: none;
    +	padding: 2px;
    +	margin: 0;
    +	display: block;
    +	outline: none;
    +}
    +.ui-menu .ui-menu {
    +	margin-top: -3px;
    +	position: absolute;
    +}
    +.ui-menu .ui-menu-item {
    +	margin: 0;
    +	padding: 0;
    +	width: 100%;
    +	/* support: IE10, see #8844 */
    +	list-style-image: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
    +}
    +.ui-menu .ui-menu-divider {
    +	margin: 5px -2px 5px -2px;
    +	height: 0;
    +	font-size: 0;
    +	line-height: 0;
    +	border-width: 1px 0 0 0;
    +}
    +.ui-menu .ui-menu-item a {
    +	text-decoration: none;
    +	display: block;
    +	padding: 2px .4em;
    +	line-height: 1.5;
    +	min-height: 0; /* support: IE7 */
    +	font-weight: normal;
    +}
    +.ui-menu .ui-menu-item a.ui-state-focus,
    +.ui-menu .ui-menu-item a.ui-state-active {
    +	font-weight: normal;
    +	margin: -1px;
    +}
    +
    +.ui-menu .ui-state-disabled {
    +	font-weight: normal;
    +	margin: .4em 0 .2em;
    +	line-height: 1.5;
    +}
    +.ui-menu .ui-state-disabled a {
    +	cursor: default;
    +}
    +
    +/* icon support */
    +.ui-menu-icons {
    +	position: relative;
    +}
    +.ui-menu-icons .ui-menu-item a {
    +	position: relative;
    +	padding-left: 2em;
    +}
    +
    +/* left-aligned */
    +.ui-menu .ui-icon {
    +	position: absolute;
    +	top: .2em;
    +	left: .2em;
    +}
    +
    +/* right-aligned */
    +.ui-menu .ui-menu-icon {
    +	position: static;
    +	float: right;
    +}
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.progressbar.css b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.progressbar.css
    new file mode 100644
    index 000000000..b1a3a21af
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.progressbar.css
    @@ -0,0 +1,28 @@
    +/*!
    + * jQuery UI Progressbar 1.10.4
    + * http://jqueryui.com
    + *
    + * Copyright 2014 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + *
    + * http://api.jqueryui.com/progressbar/#theming
    + */
    +.ui-progressbar {
    +	height: 2em;
    +	text-align: left;
    +	overflow: hidden;
    +}
    +.ui-progressbar .ui-progressbar-value {
    +	margin: -1px;
    +	height: 100%;
    +}
    +.ui-progressbar .ui-progressbar-overlay {
    +	background: url("images/animated-overlay.gif");
    +	height: 100%;
    +	filter: alpha(opacity=25);
    +	opacity: 0.25;
    +}
    +.ui-progressbar-indeterminate .ui-progressbar-value {
    +	background-image: none;
    +}
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.resizable.css b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.resizable.css
    new file mode 100644
    index 000000000..924a291fc
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.resizable.css
    @@ -0,0 +1,76 @@
    +/*!
    + * jQuery UI Resizable 1.10.4
    + * http://jqueryui.com
    + *
    + * Copyright 2014 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + */
    +.ui-resizable {
    +	position: relative;
    +}
    +.ui-resizable-handle {
    +	position: absolute;
    +	font-size: 0.1px;
    +	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;
    +}
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.selectable.css b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.selectable.css
    new file mode 100644
    index 000000000..0daee3c45
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.selectable.css
    @@ -0,0 +1,13 @@
    +/*!
    + * jQuery UI Selectable 1.10.4
    + * http://jqueryui.com
    + *
    + * Copyright 2014 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + */
    +.ui-selectable-helper {
    +	position: absolute;
    +	z-index: 100;
    +	border: 1px dotted black;
    +}
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.slider.css b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.slider.css
    new file mode 100644
    index 000000000..b2d80d5f3
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.slider.css
    @@ -0,0 +1,73 @@
    +/*!
    + * jQuery UI Slider 1.10.4
    + * http://jqueryui.com
    + *
    + * Copyright 2014 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + *
    + * http://api.jqueryui.com/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;
    +}
    +
    +/* For IE8 - See #6727 */
    +.ui-slider.ui-state-disabled .ui-slider-handle,
    +.ui-slider.ui-state-disabled .ui-slider-range {
    +	filter: inherit;
    +}
    +
    +.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;
    +}
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.spinner.css b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.spinner.css
    new file mode 100644
    index 000000000..efcaa79e5
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.spinner.css
    @@ -0,0 +1,65 @@
    +/*!
    + * jQuery UI Spinner 1.10.4
    + * http://jqueryui.com
    + *
    + * Copyright 2014 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + *
    + * http://api.jqueryui.com/spinner/#theming
    + */
    +.ui-spinner {
    +	position: relative;
    +	display: inline-block;
    +	overflow: hidden;
    +	padding: 0;
    +	vertical-align: middle;
    +}
    +.ui-spinner-input {
    +	border: none;
    +	background: none;
    +	color: inherit;
    +	padding: 0;
    +	margin: .2em 0;
    +	vertical-align: middle;
    +	margin-left: .4em;
    +	margin-right: 22px;
    +}
    +.ui-spinner-button {
    +	width: 16px;
    +	height: 50%;
    +	font-size: .5em;
    +	padding: 0;
    +	margin: 0;
    +	text-align: center;
    +	position: absolute;
    +	cursor: default;
    +	display: block;
    +	overflow: hidden;
    +	right: 0;
    +}
    +/* more specificity required here to override default borders */
    +.ui-spinner a.ui-spinner-button {
    +	border-top: none;
    +	border-bottom: none;
    +	border-right: none;
    +}
    +/* vertically center icon */
    +.ui-spinner .ui-icon {
    +	position: absolute;
    +	margin-top: -8px;
    +	top: 50%;
    +	left: 0;
    +}
    +.ui-spinner-up {
    +	top: 0;
    +}
    +.ui-spinner-down {
    +	bottom: 0;
    +}
    +
    +/* TR overrides */
    +.ui-spinner .ui-icon-triangle-1-s {
    +	/* need to fix icons sprite */
    +	background-position: -65px -16px;
    +}
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.tabs.css b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.tabs.css
    new file mode 100644
    index 000000000..04f25808e
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.tabs.css
    @@ -0,0 +1,51 @@
    +/*!
    + * jQuery UI Tabs 1.10.4
    + * http://jqueryui.com
    + *
    + * Copyright 2014 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + *
    + * http://api.jqueryui.com/tabs/#theming
    + */
    +.ui-tabs {
    +	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
    +	padding: .2em;
    +}
    +.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: 0;
    +	margin: 1px .2em 0 0;
    +	border-bottom-width: 0;
    +	padding: 0;
    +	white-space: nowrap;
    +}
    +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
    +	float: left;
    +	padding: .5em 1em;
    +	text-decoration: none;
    +}
    +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
    +	margin-bottom: -1px;
    +	padding-bottom: 1px;
    +}
    +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
    +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
    +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
    +	cursor: text;
    +}
    +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
    +	cursor: pointer;
    +}
    +.ui-tabs .ui-tabs-panel {
    +	display: block;
    +	border-width: 0;
    +	padding: 1em 1.4em;
    +	background: none;
    +}
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.theme.css b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.theme.css
    new file mode 100644
    index 000000000..b86353d40
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.theme.css
    @@ -0,0 +1,410 @@
    +/*!
    + * jQuery UI CSS Framework 1.10.4
    + * http://jqueryui.com
    + *
    + * Copyright 2014 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + *
    + * http://api.jqueryui.com/category/theming/
    + *
    + * To view and modify this theme, visit http://jqueryui.com/themeroller/
    + */
    +
    +
    +/* Component containers
    +----------------------------------*/
    +.ui-widget {
    +	font-family: Verdana,Arial,sans-serif/*{ffDefault}*/;
    +	font-size: 1.1em/*{fsDefault}*/;
    +}
    +.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/*{ffDefault}*/;
    +	font-size: 1em;
    +}
    +.ui-widget-content {
    +	border: 1px solid #aaaaaa/*{borderColorContent}*/;
    +	background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/;
    +	color: #222222/*{fcContent}*/;
    +}
    +.ui-widget-content a {
    +	color: #222222/*{fcContent}*/;
    +}
    +.ui-widget-header {
    +	border: 1px solid #aaaaaa/*{borderColorHeader}*/;
    +	background: #cccccc/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/;
    +	color: #222222/*{fcHeader}*/;
    +	font-weight: bold;
    +}
    +.ui-widget-header a {
    +	color: #222222/*{fcHeader}*/;
    +}
    +
    +/* Interaction states
    +----------------------------------*/
    +.ui-state-default,
    +.ui-widget-content .ui-state-default,
    +.ui-widget-header .ui-state-default {
    +	border: 1px solid #d3d3d3/*{borderColorDefault}*/;
    +	background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/;
    +	font-weight: normal/*{fwDefault}*/;
    +	color: #555555/*{fcDefault}*/;
    +}
    +.ui-state-default a,
    +.ui-state-default a:link,
    +.ui-state-default a:visited {
    +	color: #555555/*{fcDefault}*/;
    +	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/*{borderColorHover}*/;
    +	background: #dadada/*{bgColorHover}*/ url(images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/;
    +	font-weight: normal/*{fwDefault}*/;
    +	color: #212121/*{fcHover}*/;
    +}
    +.ui-state-hover a,
    +.ui-state-hover a:hover,
    +.ui-state-hover a:link,
    +.ui-state-hover a:visited,
    +.ui-state-focus a,
    +.ui-state-focus a:hover,
    +.ui-state-focus a:link,
    +.ui-state-focus a:visited {
    +	color: #212121/*{fcHover}*/;
    +	text-decoration: none;
    +}
    +.ui-state-active,
    +.ui-widget-content .ui-state-active,
    +.ui-widget-header .ui-state-active {
    +	border: 1px solid #aaaaaa/*{borderColorActive}*/;
    +	background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/;
    +	font-weight: normal/*{fwDefault}*/;
    +	color: #212121/*{fcActive}*/;
    +}
    +.ui-state-active a,
    +.ui-state-active a:link,
    +.ui-state-active a:visited {
    +	color: #212121/*{fcActive}*/;
    +	text-decoration: none;
    +}
    +
    +/* Interaction Cues
    +----------------------------------*/
    +.ui-state-highlight,
    +.ui-widget-content .ui-state-highlight,
    +.ui-widget-header .ui-state-highlight {
    +	border: 1px solid #fcefa1/*{borderColorHighlight}*/;
    +	background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/;
    +	color: #363636/*{fcHighlight}*/;
    +}
    +.ui-state-highlight a,
    +.ui-widget-content .ui-state-highlight a,
    +.ui-widget-header .ui-state-highlight a {
    +	color: #363636/*{fcHighlight}*/;
    +}
    +.ui-state-error,
    +.ui-widget-content .ui-state-error,
    +.ui-widget-header .ui-state-error {
    +	border: 1px solid #cd0a0a/*{borderColorError}*/;
    +	background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/;
    +	color: #cd0a0a/*{fcError}*/;
    +}
    +.ui-state-error a,
    +.ui-widget-content .ui-state-error a,
    +.ui-widget-header .ui-state-error a {
    +	color: #cd0a0a/*{fcError}*/;
    +}
    +.ui-state-error-text,
    +.ui-widget-content .ui-state-error-text,
    +.ui-widget-header .ui-state-error-text {
    +	color: #cd0a0a/*{fcError}*/;
    +}
    +.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;
    +}
    +.ui-state-disabled .ui-icon {
    +	filter:Alpha(Opacity=35); /* For IE8 - See #6059 */
    +}
    +
    +/* Icons
    +----------------------------------*/
    +
    +/* states and images */
    +.ui-icon {
    +	width: 16px;
    +	height: 16px;
    +}
    +.ui-icon,
    +.ui-widget-content .ui-icon {
    +	background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/;
    +}
    +.ui-widget-header .ui-icon {
    +	background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/;
    +}
    +.ui-state-default .ui-icon {
    +	background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/;
    +}
    +.ui-state-hover .ui-icon,
    +.ui-state-focus .ui-icon {
    +	background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/;
    +}
    +.ui-state-active .ui-icon {
    +	background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/;
    +}
    +.ui-state-highlight .ui-icon {
    +	background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/;
    +}
    +.ui-state-error .ui-icon,
    +.ui-state-error-text .ui-icon {
    +	background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/;
    +}
    +
    +/* positioning */
    +.ui-icon-blank { background-position: 16px 16px; }
    +.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-on { background-position: -96px -144px; }
    +.ui-icon-radio-off { 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 {
    +	border-top-left-radius: 4px/*{cornerRadius}*/;
    +}
    +.ui-corner-all,
    +.ui-corner-top,
    +.ui-corner-right,
    +.ui-corner-tr {
    +	border-top-right-radius: 4px/*{cornerRadius}*/;
    +}
    +.ui-corner-all,
    +.ui-corner-bottom,
    +.ui-corner-left,
    +.ui-corner-bl {
    +	border-bottom-left-radius: 4px/*{cornerRadius}*/;
    +}
    +.ui-corner-all,
    +.ui-corner-bottom,
    +.ui-corner-right,
    +.ui-corner-br {
    +	border-bottom-right-radius: 4px/*{cornerRadius}*/;
    +}
    +
    +/* Overlays */
    +.ui-widget-overlay {
    +	background: #aaaaaa/*{bgColorOverlay}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/;
    +	opacity: .3/*{opacityOverlay}*/;
    +	filter: Alpha(Opacity=30)/*{opacityFilterOverlay}*/;
    +}
    +.ui-widget-shadow {
    +	margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/;
    +	padding: 8px/*{thicknessShadow}*/;
    +	background: #aaaaaa/*{bgColorShadow}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/;
    +	opacity: .3/*{opacityShadow}*/;
    +	filter: Alpha(Opacity=30)/*{opacityFilterShadow}*/;
    +	border-radius: 8px/*{cornerRadiusShadow}*/;
    +}
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.tooltip.css b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.tooltip.css
    new file mode 100644
    index 000000000..c5ecaa40f
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/jquery.ui.tooltip.css
    @@ -0,0 +1,21 @@
    +/*!
    + * jQuery UI Tooltip 1.10.4
    + * http://jqueryui.com
    + *
    + * Copyright 2014 jQuery Foundation and other contributors
    + * Released under the MIT license.
    + * http://jquery.org/license
    + *
    + * http://api.jqueryui.com/tooltip/#theming
    + */
    +.ui-tooltip {
    +	padding: 8px;
    +	position: absolute;
    +	z-index: 9999;
    +	max-width: 300px;
    +	-webkit-box-shadow: 0 0 5px #aaa;
    +	box-shadow: 0 0 5px #aaa;
    +}
    +body .ui-tooltip {
    +	border-width: 2px;
    +}
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/animated-overlay.gif b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/animated-overlay.gif
    new file mode 100644
    index 000000000..d441f75eb
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/animated-overlay.gif differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_flat_0_aaaaaa_40x100.png b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_flat_0_aaaaaa_40x100.png
    new file mode 100644
    index 000000000..5b5dab2ab
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_flat_0_aaaaaa_40x100.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_flat_75_ffffff_40x100.png b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_flat_75_ffffff_40x100.png
    new file mode 100644
    index 000000000..ac8b229af
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_flat_75_ffffff_40x100.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_glass_55_fbf9ee_1x400.png b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_glass_55_fbf9ee_1x400.png
    new file mode 100644
    index 000000000..ad3d6346e
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_glass_55_fbf9ee_1x400.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_glass_65_ffffff_1x400.png b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_glass_65_ffffff_1x400.png
    new file mode 100644
    index 000000000..42ccba269
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_glass_65_ffffff_1x400.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_glass_75_dadada_1x400.png b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_glass_75_dadada_1x400.png
    new file mode 100644
    index 000000000..5a46b47cb
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_glass_75_dadada_1x400.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_glass_75_e6e6e6_1x400.png b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_glass_75_e6e6e6_1x400.png
    new file mode 100644
    index 000000000..86c2baa65
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_glass_75_e6e6e6_1x400.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_glass_95_fef1ec_1x400.png b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_glass_95_fef1ec_1x400.png
    new file mode 100644
    index 000000000..4443fdc1a
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_glass_95_fef1ec_1x400.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_highlight-soft_75_cccccc_1x100.png
    new file mode 100644
    index 000000000..7c9fa6c6e
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-bg_highlight-soft_75_cccccc_1x100.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-icons_222222_256x240.png b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-icons_222222_256x240.png
    new file mode 100644
    index 000000000..ee039dc09
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-icons_222222_256x240.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-icons_2e83ff_256x240.png b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-icons_2e83ff_256x240.png
    new file mode 100644
    index 000000000..45e8928e5
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-icons_2e83ff_256x240.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-icons_454545_256x240.png b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-icons_454545_256x240.png
    new file mode 100644
    index 000000000..7ec70d11b
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-icons_454545_256x240.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-icons_888888_256x240.png b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-icons_888888_256x240.png
    new file mode 100644
    index 000000000..5ba708c39
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-icons_888888_256x240.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-icons_cd0a0a_256x240.png b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-icons_cd0a0a_256x240.png
    new file mode 100644
    index 000000000..7930a5580
    Binary files /dev/null and b/src/main/webapp/vendors/jquery-ui/themes/base/minified/images/ui-icons_cd0a0a_256x240.png differ
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery-ui.min.css b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery-ui.min.css
    new file mode 100644
    index 000000000..dd81a054b
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery-ui.min.css
    @@ -0,0 +1,7 @@
    +/*! jQuery UI - v1.10.4 - 2014-02-18
    +* http://jqueryui.com
    +* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css, jquery.ui.theme.css
    +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
    +
    +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width: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:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;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}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:2px;padding:.5em .5em .5em .7em;min-height:0}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.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}input.ui-button{padding:.4em 1em}.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-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.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,.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}.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,.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:0}.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,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;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:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:none}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:normal}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px}.ui-menu .ui-state-disabled{font-weight:normal;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("images/animated-overlay.gif");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.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.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.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}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.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:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}
    +.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 #aaa;background:#fff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.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:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;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 #999;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,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff 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-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}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.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)}.ui-icon-blank{background-position:16px 16px}.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-on{background-position:-96px -144px}.ui-icon-radio-off{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{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}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}
    \ No newline at end of file
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.accordion.min.css b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.accordion.min.css
    new file mode 100644
    index 000000000..d43b0bb66
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.accordion.min.css
    @@ -0,0 +1,5 @@
    +/*! jQuery UI - v1.10.4 - 2014-02-16
    +* http://jqueryui.com
    +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
    +
    +.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:2px;padding:.5em .5em .5em .7em;min-height:0}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}
    \ No newline at end of file
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.autocomplete.min.css b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.autocomplete.min.css
    new file mode 100644
    index 000000000..1e692e54c
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.autocomplete.min.css
    @@ -0,0 +1,5 @@
    +/*! jQuery UI - v1.10.4 - 2014-02-16
    +* http://jqueryui.com
    +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
    +
    +.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}
    \ No newline at end of file
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.button.min.css b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.button.min.css
    new file mode 100644
    index 000000000..c80002b50
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.button.min.css
    @@ -0,0 +1,5 @@
    +/*! jQuery UI - v1.10.4 - 2014-02-16
    +* http://jqueryui.com
    +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
    +
    +.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.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}input.ui-button{padding:.4em 1em}.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-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}
    \ No newline at end of file
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.core.min.css b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.core.min.css
    new file mode 100644
    index 000000000..5c99ae6ef
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.core.min.css
    @@ -0,0 +1,5 @@
    +/*! jQuery UI - v1.10.4 - 2014-02-16
    +* http://jqueryui.com
    +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
    +
    +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width: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:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}
    \ No newline at end of file
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.datepicker.min.css b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.datepicker.min.css
    new file mode 100644
    index 000000000..23309f2b4
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.datepicker.min.css
    @@ -0,0 +1,5 @@
    +/*! jQuery UI - v1.10.4 - 2014-02-16
    +* http://jqueryui.com
    +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
    +
    +.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,.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}.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,.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:0}.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,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}
    \ No newline at end of file
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.dialog.min.css b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.dialog.min.css
    new file mode 100644
    index 000000000..9ccb718ce
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.dialog.min.css
    @@ -0,0 +1,5 @@
    +/*! jQuery UI - v1.10.4 - 2014-02-16
    +* http://jqueryui.com
    +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
    +
    +.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;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:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}
    \ No newline at end of file
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.menu.min.css b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.menu.min.css
    new file mode 100644
    index 000000000..b2673b98c
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.menu.min.css
    @@ -0,0 +1,5 @@
    +/*! jQuery UI - v1.10.4 - 2014-02-16
    +* http://jqueryui.com
    +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
    +
    +.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:none}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:normal}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px}.ui-menu .ui-state-disabled{font-weight:normal;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}
    \ No newline at end of file
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.progressbar.min.css b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.progressbar.min.css
    new file mode 100644
    index 000000000..821414ec2
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.progressbar.min.css
    @@ -0,0 +1,5 @@
    +/*! jQuery UI - v1.10.4 - 2014-02-16
    +* http://jqueryui.com
    +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
    +
    +.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("images/animated-overlay.gif");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}
    \ No newline at end of file
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.resizable.min.css b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.resizable.min.css
    new file mode 100644
    index 000000000..a768697ad
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.resizable.min.css
    @@ -0,0 +1,5 @@
    +/*! jQuery UI - v1.10.4 - 2014-02-16
    +* http://jqueryui.com
    +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
    +
    +.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;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}
    \ No newline at end of file
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.selectable.min.css b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.selectable.min.css
    new file mode 100644
    index 000000000..e942b0e11
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.selectable.min.css
    @@ -0,0 +1,5 @@
    +/*! jQuery UI - v1.10.4 - 2014-02-16
    +* http://jqueryui.com
    +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
    +
    +.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}
    \ No newline at end of file
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.slider.min.css b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.slider.min.css
    new file mode 100644
    index 000000000..7057167f9
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.slider.min.css
    @@ -0,0 +1,5 @@
    +/*! jQuery UI - v1.10.4 - 2014-02-16
    +* http://jqueryui.com
    +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
    +
    +.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.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.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}
    \ No newline at end of file
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.spinner.min.css b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.spinner.min.css
    new file mode 100644
    index 000000000..630106105
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.spinner.min.css
    @@ -0,0 +1,5 @@
    +/*! jQuery UI - v1.10.4 - 2014-02-16
    +* http://jqueryui.com
    +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
    +
    +.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}
    \ No newline at end of file
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.tabs.min.css b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.tabs.min.css
    new file mode 100644
    index 000000000..cbcf8f1fc
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.tabs.min.css
    @@ -0,0 +1,5 @@
    +/*! jQuery UI - v1.10.4 - 2014-02-16
    +* http://jqueryui.com
    +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
    +
    +.ui-tabs{position:relative;padding:.2em}.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:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}
    \ No newline at end of file
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.theme.min.css b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.theme.min.css
    new file mode 100644
    index 000000000..3de6f87e1
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.theme.min.css
    @@ -0,0 +1,5 @@
    +/*! jQuery UI - v1.10.4 - 2014-02-16
    +* http://jqueryui.com
    +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
    +
    +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width: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:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;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}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:2px;padding:.5em .5em .5em .7em;min-height:0}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.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}input.ui-button{padding:.4em 1em}.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-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.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,.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}.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,.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:0}.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,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;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:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:none}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:normal}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px}.ui-menu .ui-state-disabled{font-weight:normal;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("images/animated-overlay.gif");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.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.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.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}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.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:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}
    \ No newline at end of file
    diff --git a/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.tooltip.min.css b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.tooltip.min.css
    new file mode 100644
    index 000000000..7af8bccd7
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/themes/base/minified/jquery.ui.tooltip.min.css
    @@ -0,0 +1,5 @@
    +/*! jQuery UI - v1.10.4 - 2014-02-16
    +* http://jqueryui.com
    +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
    +
    +.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}
    \ No newline at end of file
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/.jshintrc b/src/main/webapp/vendors/jquery-ui/ui/.jshintrc
    new file mode 100644
    index 000000000..a5d36e1d3
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/.jshintrc
    @@ -0,0 +1,22 @@
    +{
    +	"boss": true,
    +	"curly": true,
    +	"eqeqeq": true,
    +	"eqnull": true,
    +	"expr": true,
    +	"immed": true,
    +	"noarg": true,
    +	"onevar": true,
    +	"quotmark": "double",
    +	"smarttabs": true,
    +	"trailing": true,
    +	"undef": true,
    +	"unused": true,
    +
    +	"browser": true,
    +	"jquery": true,
    +
    +	"globals": {
    +		"Globalize": false
    +	}
    +}
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery-ui-i18n.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery-ui-i18n.js
    new file mode 100644
    index 000000000..707acad44
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery-ui-i18n.js
    @@ -0,0 +1,1645 @@
    +/*! jQuery UI - v1.10.4 - 2014-02-16
    +* http://jqueryui.com
    +* Includes: jquery.ui.datepicker-af.js, jquery.ui.datepicker-ar-DZ.js, jquery.ui.datepicker-ar.js, jquery.ui.datepicker-az.js, jquery.ui.datepicker-bg.js, jquery.ui.datepicker-bs.js, jquery.ui.datepicker-ca.js, jquery.ui.datepicker-cs.js, jquery.ui.datepicker-cy-GB.js, jquery.ui.datepicker-da.js, jquery.ui.datepicker-de.js, jquery.ui.datepicker-el.js, jquery.ui.datepicker-en-AU.js, jquery.ui.datepicker-en-GB.js, jquery.ui.datepicker-en-NZ.js, jquery.ui.datepicker-eo.js, jquery.ui.datepicker-es.js, jquery.ui.datepicker-et.js, jquery.ui.datepicker-eu.js, jquery.ui.datepicker-fa.js, jquery.ui.datepicker-fi.js, jquery.ui.datepicker-fo.js, jquery.ui.datepicker-fr-CH.js, jquery.ui.datepicker-fr.js, jquery.ui.datepicker-gl.js, jquery.ui.datepicker-he.js, jquery.ui.datepicker-hi.js, jquery.ui.datepicker-hr.js, jquery.ui.datepicker-hu.js, jquery.ui.datepicker-hy.js, jquery.ui.datepicker-id.js, jquery.ui.datepicker-is.js, jquery.ui.datepicker-it.js, jquery.ui.datepicker-ja.js, jquery.ui.datepicker-ka.js, jquery.ui.datepicker-kk.js, jquery.ui.datepicker-km.js, jquery.ui.datepicker-ko.js, jquery.ui.datepicker-lb.js, jquery.ui.datepicker-lt.js, jquery.ui.datepicker-lv.js, jquery.ui.datepicker-mk.js, jquery.ui.datepicker-ml.js, jquery.ui.datepicker-ms.js, jquery.ui.datepicker-nl-BE.js, jquery.ui.datepicker-nl.js, jquery.ui.datepicker-no.js, jquery.ui.datepicker-pl.js, jquery.ui.datepicker-pt-BR.js, jquery.ui.datepicker-pt.js, jquery.ui.datepicker-rm.js, jquery.ui.datepicker-ro.js, jquery.ui.datepicker-ru.js, jquery.ui.datepicker-sk.js, jquery.ui.datepicker-sl.js, jquery.ui.datepicker-sq.js, jquery.ui.datepicker-sr-SR.js, jquery.ui.datepicker-sr.js, jquery.ui.datepicker-sv.js, jquery.ui.datepicker-ta.js, jquery.ui.datepicker-th.js, jquery.ui.datepicker-tj.js, jquery.ui.datepicker-tr.js, jquery.ui.datepicker-uk.js, jquery.ui.datepicker-vi.js, jquery.ui.datepicker-zh-CN.js, jquery.ui.datepicker-zh-HK.js, jquery.ui.datepicker-zh-TW.js, jquery.ui.datepicker-be.js, jquery.ui.datepicker-fr-CA.js, jquery.ui.datepicker-ky.js, jquery.ui.datepicker-nb.js, jquery.ui.datepicker-nn.js
    +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
    +
    +/* Written by Renier Pretorius. */
    +jQuery(function($){
    +	$.datepicker.regional['af'] = {
    +		closeText: 'Selekteer',
    +		prevText: 'Vorige',
    +		nextText: 'Volgende',
    +		currentText: 'Vandag',
    +		monthNames: ['Januarie','Februarie','Maart','April','Mei','Junie',
    +		'Julie','Augustus','September','Oktober','November','Desember'],
    +		monthNamesShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun',
    +		'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'],
    +		dayNames: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'],
    +		dayNamesShort: ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'],
    +		dayNamesMin: ['So','Ma','Di','Wo','Do','Vr','Sa'],
    +		weekHeader: 'Wk',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['af']);
    +});
    +/* Mohamed Cherif BOUCHELAGHEM -- cherifbouchelaghem@yahoo.fr */
    +
    +jQuery(function($){
    +	$.datepicker.regional['ar-DZ'] = {
    +		closeText: 'إغلاق',
    +		prevText: '<السابق',
    +		nextText: 'التالي>',
    +		currentText: 'اليوم',
    +		monthNames: ['جانفي', 'فيفري', 'مارس', 'أفريل', 'ماي', 'جوان',
    +		'جويلية', 'أوت', 'سبتمبر','أكتوبر', 'نوفمبر', 'ديسمبر'],
    +		monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
    +		dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
    +		dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
    +		dayNamesMin: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
    +		weekHeader: 'أسبوع',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 6,
    +  		isRTL: true,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['ar-DZ']);
    +});
    +/* Khaled Alhourani -- me@khaledalhourani.com */
    +/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name فبراير - يناير and there isn't any Arabic roots for these months */
    +jQuery(function($){
    +	$.datepicker.regional['ar'] = {
    +		closeText: 'إغلاق',
    +		prevText: '<السابق',
    +		nextText: 'التالي>',
    +		currentText: 'اليوم',
    +		monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'مايو', 'حزيران',
    +		'تموز', 'آب', 'أيلول',	'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],
    +		monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
    +		dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
    +		dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
    +		dayNamesMin: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],
    +		weekHeader: 'أسبوع',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 6,
    +  		isRTL: true,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['ar']);
    +});
    +/* Written by Jamil Najafov (necefov33@gmail.com). */
    +jQuery(function($) {
    +	$.datepicker.regional['az'] = {
    +		closeText: 'Bağla',
    +		prevText: '<Geri',
    +		nextText: 'İrəli>',
    +		currentText: 'Bugün',
    +		monthNames: ['Yanvar','Fevral','Mart','Aprel','May','İyun',
    +		'İyul','Avqust','Sentyabr','Oktyabr','Noyabr','Dekabr'],
    +		monthNamesShort: ['Yan','Fev','Mar','Apr','May','İyun',
    +		'İyul','Avq','Sen','Okt','Noy','Dek'],
    +		dayNames: ['Bazar','Bazar ertəsi','Çərşənbə axşamı','Çərşənbə','Cümə axşamı','Cümə','Şənbə'],
    +		dayNamesShort: ['B','Be','Ça','Ç','Ca','C','Ş'],
    +		dayNamesMin: ['B','B','Ç','С','Ç','C','Ş'],
    +		weekHeader: 'Hf',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['az']);
    +});
    +/* Written by Stoyan Kyosev (http://svest.org). */
    +jQuery(function($){
    +	$.datepicker.regional['bg'] = {
    +		closeText: 'затвори',
    +		prevText: '<назад',
    +		nextText: 'напред>',
    +		nextBigText: '>>',
    +		currentText: 'днес',
    +		monthNames: ['Януари','Февруари','Март','Април','Май','Юни',
    +		'Юли','Август','Септември','Октомври','Ноември','Декември'],
    +		monthNamesShort: ['Яну','Фев','Мар','Апр','Май','Юни',
    +		'Юли','Авг','Сеп','Окт','Нов','Дек'],
    +		dayNames: ['Неделя','Понеделник','Вторник','Сряда','Четвъртък','Петък','Събота'],
    +		dayNamesShort: ['Нед','Пон','Вто','Сря','Чет','Пет','Съб'],
    +		dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Съ'],
    +		weekHeader: 'Wk',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['bg']);
    +});
    +/* Written by Kenan Konjo. */
    +jQuery(function($){
    +	$.datepicker.regional['bs'] = {
    +		closeText: 'Zatvori',
    +		prevText: '<',
    +		nextText: '>',
    +		currentText: 'Danas',
    +		monthNames: ['Januar','Februar','Mart','April','Maj','Juni',
    +		'Juli','August','Septembar','Oktobar','Novembar','Decembar'],
    +		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
    +		'Jul','Aug','Sep','Okt','Nov','Dec'],
    +		dayNames: ['Nedelja','Ponedeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'],
    +		dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'],
    +		dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
    +		weekHeader: 'Wk',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['bs']);
    +});
    +/* Writers: (joan.leon@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['ca'] = {
    +		closeText: 'Tanca',
    +		prevText: 'Anterior',
    +		nextText: 'Següent',
    +		currentText: 'Avui',
    +		monthNames: ['gener','febrer','març','abril','maig','juny',
    +		'juliol','agost','setembre','octubre','novembre','desembre'],
    +		monthNamesShort: ['gen','feb','març','abr','maig','juny',
    +		'jul','ag','set','oct','nov','des'],
    +		dayNames: ['diumenge','dilluns','dimarts','dimecres','dijous','divendres','dissabte'],
    +		dayNamesShort: ['dg','dl','dt','dc','dj','dv','ds'],
    +		dayNamesMin: ['dg','dl','dt','dc','dj','dv','ds'],
    +		weekHeader: 'Set',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['ca']);
    +});
    +/* Written by Tomas Muller (tomas@tomas-muller.net). */
    +jQuery(function($){
    +	$.datepicker.regional['cs'] = {
    +		closeText: 'Zavřít',
    +		prevText: '<Dříve',
    +		nextText: 'Později>',
    +		currentText: 'Nyní',
    +		monthNames: ['leden','únor','březen','duben','květen','červen',
    +		'červenec','srpen','září','říjen','listopad','prosinec'],
    +		monthNamesShort: ['led','úno','bře','dub','kvě','čer',
    +		'čvc','srp','zář','říj','lis','pro'],
    +		dayNames: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'],
    +		dayNamesShort: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],
    +		dayNamesMin: ['ne','po','út','st','čt','pá','so'],
    +		weekHeader: 'Týd',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['cs']);
    +});
    +/* Written by William Griffiths. */
    +jQuery(function($){
    +	$.datepicker.regional['cy-GB'] = {
    +		closeText: 'Done',
    +		prevText: 'Prev',
    +		nextText: 'Next',
    +		currentText: 'Today',
    +		monthNames: ['Ionawr','Chwefror','Mawrth','Ebrill','Mai','Mehefin',
    +		'Gorffennaf','Awst','Medi','Hydref','Tachwedd','Rhagfyr'],
    +		monthNamesShort: ['Ion', 'Chw', 'Maw', 'Ebr', 'Mai', 'Meh',
    +		'Gor', 'Aws', 'Med', 'Hyd', 'Tac', 'Rha'],
    +		dayNames: ['Dydd Sul', 'Dydd Llun', 'Dydd Mawrth', 'Dydd Mercher', 'Dydd Iau', 'Dydd Gwener', 'Dydd Sadwrn'],
    +		dayNamesShort: ['Sul', 'Llu', 'Maw', 'Mer', 'Iau', 'Gwe', 'Sad'],
    +		dayNamesMin: ['Su','Ll','Ma','Me','Ia','Gw','Sa'],
    +		weekHeader: 'Wy',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['cy-GB']);
    +});
    +/* Written by Jan Christensen ( deletestuff@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['da'] = {
    +		closeText: 'Luk',
    +		prevText: '<Forrige',
    +		nextText: 'Næste>',
    +		currentText: 'Idag',
    +		monthNames: ['Januar','Februar','Marts','April','Maj','Juni',
    +		'Juli','August','September','Oktober','November','December'],
    +		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
    +		'Jul','Aug','Sep','Okt','Nov','Dec'],
    +		dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'],
    +		dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'],
    +		dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'],
    +		weekHeader: 'Uge',
    +		dateFormat: 'dd-mm-yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['da']);
    +});
    +/* Written by Milian Wolff (mail@milianw.de). */
    +jQuery(function($){
    +	$.datepicker.regional['de'] = {
    +		closeText: 'Schließen',
    +		prevText: '<Zurück',
    +		nextText: 'Vor>',
    +		currentText: 'Heute',
    +		monthNames: ['Januar','Februar','März','April','Mai','Juni',
    +		'Juli','August','September','Oktober','November','Dezember'],
    +		monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',
    +		'Jul','Aug','Sep','Okt','Nov','Dez'],
    +		dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
    +		dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
    +		dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
    +		weekHeader: 'KW',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['de']);
    +});
    +/* Written by Alex Cicovic (http://www.alexcicovic.com) */
    +jQuery(function($){
    +	$.datepicker.regional['el'] = {
    +		closeText: 'Κλείσιμο',
    +		prevText: 'Προηγούμενος',
    +		nextText: 'Επόμενος',
    +		currentText: 'Τρέχων Μήνας',
    +		monthNames: ['Ιανουάριος','Φεβρουάριος','Μάρτιος','Απρίλιος','Μάιος','Ιούνιος',
    +		'Ιούλιος','Αύγουστος','Σεπτέμβριος','Οκτώβριος','Νοέμβριος','Δεκέμβριος'],
    +		monthNamesShort: ['Ιαν','Φεβ','Μαρ','Απρ','Μαι','Ιουν',
    +		'Ιουλ','Αυγ','Σεπ','Οκτ','Νοε','Δεκ'],
    +		dayNames: ['Κυριακή','Δευτέρα','Τρίτη','Τετάρτη','Πέμπτη','Παρασκευή','Σάββατο'],
    +		dayNamesShort: ['Κυρ','Δευ','Τρι','Τετ','Πεμ','Παρ','Σαβ'],
    +		dayNamesMin: ['Κυ','Δε','Τρ','Τε','Πε','Πα','Σα'],
    +		weekHeader: 'Εβδ',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['el']);
    +});
    +/* Based on the en-GB initialisation. */
    +jQuery(function($){
    +	$.datepicker.regional['en-AU'] = {
    +		closeText: 'Done',
    +		prevText: 'Prev',
    +		nextText: 'Next',
    +		currentText: 'Today',
    +		monthNames: ['January','February','March','April','May','June',
    +		'July','August','September','October','November','December'],
    +		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
    +		'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
    +		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
    +		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
    +		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
    +		weekHeader: 'Wk',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['en-AU']);
    +});
    +/* Written by Stuart. */
    +jQuery(function($){
    +	$.datepicker.regional['en-GB'] = {
    +		closeText: 'Done',
    +		prevText: 'Prev',
    +		nextText: 'Next',
    +		currentText: 'Today',
    +		monthNames: ['January','February','March','April','May','June',
    +		'July','August','September','October','November','December'],
    +		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
    +		'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
    +		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
    +		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
    +		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
    +		weekHeader: 'Wk',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['en-GB']);
    +});
    +/* Based on the en-GB initialisation. */
    +jQuery(function($){
    +	$.datepicker.regional['en-NZ'] = {
    +		closeText: 'Done',
    +		prevText: 'Prev',
    +		nextText: 'Next',
    +		currentText: 'Today',
    +		monthNames: ['January','February','March','April','May','June',
    +		'July','August','September','October','November','December'],
    +		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
    +		'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
    +		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
    +		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
    +		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
    +		weekHeader: 'Wk',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['en-NZ']);
    +});
    +/* Written by Olivier M. (olivierweb@ifrance.com). */
    +jQuery(function($){
    +	$.datepicker.regional['eo'] = {
    +		closeText: 'Fermi',
    +		prevText: '<Anta',
    +		nextText: 'Sekv>',
    +		currentText: 'Nuna',
    +		monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio',
    +		'Julio','Aŭgusto','Septembro','Oktobro','Novembro','Decembro'],
    +		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
    +		'Jul','Aŭg','Sep','Okt','Nov','Dec'],
    +		dayNames: ['Dimanĉo','Lundo','Mardo','Merkredo','Ĵaŭdo','Vendredo','Sabato'],
    +		dayNamesShort: ['Dim','Lun','Mar','Mer','Ĵaŭ','Ven','Sab'],
    +		dayNamesMin: ['Di','Lu','Ma','Me','Ĵa','Ve','Sa'],
    +		weekHeader: 'Sb',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['eo']);
    +});
    +/* Traducido por Vester (xvester@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['es'] = {
    +		closeText: 'Cerrar',
    +		prevText: '<Ant',
    +		nextText: 'Sig>',
    +		currentText: 'Hoy',
    +		monthNames: ['enero','febrero','marzo','abril','mayo','junio',
    +		'julio','agosto','septiembre','octubre','noviembre','diciembre'],
    +		monthNamesShort: ['ene','feb','mar','abr','may','jun',
    +		'jul','ogo','sep','oct','nov','dic'],
    +		dayNames: ['domingo','lunes','martes','miércoles','jueves','viernes','sábado'],
    +		dayNamesShort: ['dom','lun','mar','mié','juv','vie','sáb'],
    +		dayNamesMin: ['D','L','M','X','J','V','S'],
    +		weekHeader: 'Sm',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['es']);
    +});
    +/* Written by Mart Sõmermaa (mrts.pydev at gmail com). */
    +jQuery(function($){
    +	$.datepicker.regional['et'] = {
    +		closeText: 'Sulge',
    +		prevText: 'Eelnev',
    +		nextText: 'Järgnev',
    +		currentText: 'Täna',
    +		monthNames: ['Jaanuar','Veebruar','Märts','Aprill','Mai','Juuni',
    +		'Juuli','August','September','Oktoober','November','Detsember'],
    +		monthNamesShort: ['Jaan', 'Veebr', 'Märts', 'Apr', 'Mai', 'Juuni',
    +		'Juuli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dets'],
    +		dayNames: ['Pühapäev', 'Esmaspäev', 'Teisipäev', 'Kolmapäev', 'Neljapäev', 'Reede', 'Laupäev'],
    +		dayNamesShort: ['Pühap', 'Esmasp', 'Teisip', 'Kolmap', 'Neljap', 'Reede', 'Laup'],
    +		dayNamesMin: ['P','E','T','K','N','R','L'],
    +		weekHeader: 'näd',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['et']);
    +});
    +/* Karrikas-ek itzulia (karrikas@karrikas.com) */
    +jQuery(function($){
    +	$.datepicker.regional['eu'] = {
    +		closeText: 'Egina',
    +		prevText: '<Aur',
    +		nextText: 'Hur>',
    +		currentText: 'Gaur',
    +		monthNames: ['urtarrila','otsaila','martxoa','apirila','maiatza','ekaina',
    +			'uztaila','abuztua','iraila','urria','azaroa','abendua'],
    +		monthNamesShort: ['urt.','ots.','mar.','api.','mai.','eka.',
    +			'uzt.','abu.','ira.','urr.','aza.','abe.'],
    +		dayNames: ['igandea','astelehena','asteartea','asteazkena','osteguna','ostirala','larunbata'],
    +		dayNamesShort: ['ig.','al.','ar.','az.','og.','ol.','lr.'],
    +		dayNamesMin: ['ig','al','ar','az','og','ol','lr'],
    +		weekHeader: 'As',
    +		dateFormat: 'yy-mm-dd',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['eu']);
    +});
    +/* Javad Mowlanezhad -- jmowla@gmail.com */
    +/* Jalali calendar should supported soon! (Its implemented but I have to test it) */
    +jQuery(function($) {
    +	$.datepicker.regional['fa'] = {
    +		closeText: 'بستن',
    +		prevText: '<قبلی',
    +		nextText: 'بعدی>',
    +		currentText: 'امروز',
    +		monthNames: [
    +			'فروردين',
    +			'ارديبهشت',
    +			'خرداد',
    +			'تير',
    +			'مرداد',
    +			'شهريور',
    +			'مهر',
    +			'آبان',
    +			'آذر',
    +			'دی',
    +			'بهمن',
    +			'اسفند'
    +		],
    +		monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],
    +		dayNames: [
    +			'يکشنبه',
    +			'دوشنبه',
    +			'سه‌شنبه',
    +			'چهارشنبه',
    +			'پنجشنبه',
    +			'جمعه',
    +			'شنبه'
    +		],
    +		dayNamesShort: [
    +			'ی',
    +			'د',
    +			'س',
    +			'چ',
    +			'پ',
    +			'ج',
    +			'ش'
    +		],
    +		dayNamesMin: [
    +			'ی',
    +			'د',
    +			'س',
    +			'چ',
    +			'پ',
    +			'ج',
    +			'ش'
    +		],
    +		weekHeader: 'هف',
    +		dateFormat: 'yy/mm/dd',
    +		firstDay: 6,
    +		isRTL: true,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['fa']);
    +});
    +/* Written by Harri Kilpiö (harrikilpio@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['fi'] = {
    +		closeText: 'Sulje',
    +		prevText: '«Edellinen',
    +		nextText: 'Seuraava»',
    +		currentText: 'Tänään',
    +		monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kesäkuu',
    +		'Heinäkuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
    +		monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kesä',
    +		'Heinä','Elo','Syys','Loka','Marras','Joulu'],
    +		dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','La'],
    +		dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'],
    +		dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'],
    +		weekHeader: 'Vk',
    +		dateFormat: 'd.m.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['fi']);
    +});
    +/* Written by Sverri Mohr Olsen, sverrimo@gmail.com */
    +jQuery(function($){
    +	$.datepicker.regional['fo'] = {
    +		closeText: 'Lat aftur',
    +		prevText: '<Fyrra',
    +		nextText: 'Næsta>',
    +		currentText: 'Í dag',
    +		monthNames: ['Januar','Februar','Mars','Apríl','Mei','Juni',
    +		'Juli','August','September','Oktober','November','Desember'],
    +		monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
    +		'Jul','Aug','Sep','Okt','Nov','Des'],
    +		dayNames: ['Sunnudagur','Mánadagur','Týsdagur','Mikudagur','Hósdagur','Fríggjadagur','Leyardagur'],
    +		dayNamesShort: ['Sun','Mán','Týs','Mik','Hós','Frí','Ley'],
    +		dayNamesMin: ['Su','Má','Tý','Mi','Hó','Fr','Le'],
    +		weekHeader: 'Vk',
    +		dateFormat: 'dd-mm-yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['fo']);
    +});
    +/* Written Martin Voelkle (martin.voelkle@e-tc.ch). */
    +jQuery(function($){
    +	$.datepicker.regional['fr-CH'] = {
    +		closeText: 'Fermer',
    +		prevText: '<Préc',
    +		nextText: 'Suiv>',
    +		currentText: 'Courant',
    +		monthNames: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin',
    +			'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],
    +		monthNamesShort: ['janv.', 'févr.', 'mars', 'avril', 'mai', 'juin',
    +			'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],
    +		dayNames: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],
    +		dayNamesShort: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],
    +		dayNamesMin: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
    +		weekHeader: 'Sm',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['fr-CH']);
    +});
    +/* Written by Keith Wood (kbwood{at}iinet.com.au),
    +			  Stéphane Nahmani (sholby@sholby.net),
    +			  Stéphane Raimbault  */
    +jQuery(function($){
    +	$.datepicker.regional['fr'] = {
    +		closeText: 'Fermer',
    +		prevText: 'Précédent',
    +		nextText: 'Suivant',
    +		currentText: 'Aujourd\'hui',
    +		monthNames: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin',
    +			'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],
    +		monthNamesShort: ['janv.', 'févr.', 'mars', 'avril', 'mai', 'juin',
    +			'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],
    +		dayNames: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],
    +		dayNamesShort: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],
    +		dayNamesMin: ['D','L','M','M','J','V','S'],
    +		weekHeader: 'Sem.',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['fr']);
    +});
    +/* Translated by Jorge Barreiro . */
    +jQuery(function($){
    +	$.datepicker.regional['gl'] = {
    +		closeText: 'Pechar',
    +		prevText: '<Ant',
    +		nextText: 'Seg>',
    +		currentText: 'Hoxe',
    +		monthNames: ['Xaneiro','Febreiro','Marzo','Abril','Maio','Xuño',
    +		'Xullo','Agosto','Setembro','Outubro','Novembro','Decembro'],
    +		monthNamesShort: ['Xan','Feb','Mar','Abr','Mai','Xuñ',
    +		'Xul','Ago','Set','Out','Nov','Dec'],
    +		dayNames: ['Domingo','Luns','Martes','Mércores','Xoves','Venres','Sábado'],
    +		dayNamesShort: ['Dom','Lun','Mar','Mér','Xov','Ven','Sáb'],
    +		dayNamesMin: ['Do','Lu','Ma','Mé','Xo','Ve','Sá'],
    +		weekHeader: 'Sm',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['gl']);
    +});
    +/* Written by Amir Hardon (ahardon at gmail dot com). */
    +jQuery(function($){
    +	$.datepicker.regional['he'] = {
    +		closeText: 'סגור',
    +		prevText: '<הקודם',
    +		nextText: 'הבא>',
    +		currentText: 'היום',
    +		monthNames: ['ינואר','פברואר','מרץ','אפריל','מאי','יוני',
    +		'יולי','אוגוסט','ספטמבר','אוקטובר','נובמבר','דצמבר'],
    +		monthNamesShort: ['ינו','פבר','מרץ','אפר','מאי','יוני',
    +		'יולי','אוג','ספט','אוק','נוב','דצמ'],
    +		dayNames: ['ראשון','שני','שלישי','רביעי','חמישי','שישי','שבת'],
    +		dayNamesShort: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'],
    +		dayNamesMin: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'],
    +		weekHeader: 'Wk',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 0,
    +		isRTL: true,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['he']);
    +});
    +/* Written by Michael Dawart. */
    +jQuery(function($){
    +	$.datepicker.regional['hi'] = {
    +		closeText: 'बंद',
    +		prevText: 'पिछला',
    +		nextText: 'अगला',
    +		currentText: 'आज',
    +		monthNames: ['जनवरी ','फरवरी','मार्च','अप्रेल','मई','जून',
    +		'जूलाई','अगस्त ','सितम्बर','अक्टूबर','नवम्बर','दिसम्बर'],
    +		monthNamesShort: ['जन', 'फर', 'मार्च', 'अप्रेल', 'मई', 'जून',
    +		'जूलाई', 'अग', 'सित', 'अक्ट', 'नव', 'दि'],
    +		dayNames: ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'गुरुवार', 'शुक्रवार', 'शनिवार'],
    +		dayNamesShort: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'],
    +		dayNamesMin: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'],
    +		weekHeader: 'हफ्ता',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['hi']);
    +});
    +/* Written by Vjekoslav Nesek. */
    +jQuery(function($){
    +	$.datepicker.regional['hr'] = {
    +		closeText: 'Zatvori',
    +		prevText: '<',
    +		nextText: '>',
    +		currentText: 'Danas',
    +		monthNames: ['Siječanj','Veljača','Ožujak','Travanj','Svibanj','Lipanj',
    +		'Srpanj','Kolovoz','Rujan','Listopad','Studeni','Prosinac'],
    +		monthNamesShort: ['Sij','Velj','Ožu','Tra','Svi','Lip',
    +		'Srp','Kol','Ruj','Lis','Stu','Pro'],
    +		dayNames: ['Nedjelja','Ponedjeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'],
    +		dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'],
    +		dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
    +		weekHeader: 'Tje',
    +		dateFormat: 'dd.mm.yy.',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['hr']);
    +});
    +/* Written by Istvan Karaszi (jquery@spam.raszi.hu). */
    +jQuery(function($){
    +	$.datepicker.regional['hu'] = {
    +		closeText: 'bezár',
    +		prevText: 'vissza',
    +		nextText: 'előre',
    +		currentText: 'ma',
    +		monthNames: ['Január', 'Február', 'Március', 'Április', 'Május', 'Június',
    +		'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'],
    +		monthNamesShort: ['Jan', 'Feb', 'Már', 'Ápr', 'Máj', 'Jún',
    +		'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'],
    +		dayNames: ['Vasárnap', 'Hétfő', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'],
    +		dayNamesShort: ['Vas', 'Hét', 'Ked', 'Sze', 'Csü', 'Pén', 'Szo'],
    +		dayNamesMin: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],
    +		weekHeader: 'Hét',
    +		dateFormat: 'yy.mm.dd.',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: true,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['hu']);
    +});
    +/* Written by Levon Zakaryan (levon.zakaryan@gmail.com)*/
    +jQuery(function($){
    +	$.datepicker.regional['hy'] = {
    +		closeText: 'Փակել',
    +		prevText: '<Նախ.',
    +		nextText: 'Հաջ.>',
    +		currentText: 'Այսօր',
    +		monthNames: ['Հունվար','Փետրվար','Մարտ','Ապրիլ','Մայիս','Հունիս',
    +		'Հուլիս','Օգոստոս','Սեպտեմբեր','Հոկտեմբեր','Նոյեմբեր','Դեկտեմբեր'],
    +		monthNamesShort: ['Հունվ','Փետր','Մարտ','Ապր','Մայիս','Հունիս',
    +		'Հուլ','Օգս','Սեպ','Հոկ','Նոյ','Դեկ'],
    +		dayNames: ['կիրակի','եկուշաբթի','երեքշաբթի','չորեքշաբթի','հինգշաբթի','ուրբաթ','շաբաթ'],
    +		dayNamesShort: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'],
    +		dayNamesMin: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'],
    +		weekHeader: 'ՇԲՏ',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['hy']);
    +});
    +/* Written by Deden Fathurahman (dedenf@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['id'] = {
    +		closeText: 'Tutup',
    +		prevText: '<mundur',
    +		nextText: 'maju>',
    +		currentText: 'hari ini',
    +		monthNames: ['Januari','Februari','Maret','April','Mei','Juni',
    +		'Juli','Agustus','September','Oktober','Nopember','Desember'],
    +		monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
    +		'Jul','Agus','Sep','Okt','Nop','Des'],
    +		dayNames: ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu'],
    +		dayNamesShort: ['Min','Sen','Sel','Rab','kam','Jum','Sab'],
    +		dayNamesMin: ['Mg','Sn','Sl','Rb','Km','jm','Sb'],
    +		weekHeader: 'Mg',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['id']);
    +});
    +/* Written by Haukur H. Thorsson (haukur@eskill.is). */
    +jQuery(function($){
    +	$.datepicker.regional['is'] = {
    +		closeText: 'Loka',
    +		prevText: '< Fyrri',
    +		nextText: 'Næsti >',
    +		currentText: 'Í dag',
    +		monthNames: ['Janúar','Febrúar','Mars','Apríl','Maí','Júní',
    +		'Júlí','Ágúst','September','Október','Nóvember','Desember'],
    +		monthNamesShort: ['Jan','Feb','Mar','Apr','Maí','Jún',
    +		'Júl','Ágú','Sep','Okt','Nóv','Des'],
    +		dayNames: ['Sunnudagur','Mánudagur','Þriðjudagur','Miðvikudagur','Fimmtudagur','Föstudagur','Laugardagur'],
    +		dayNamesShort: ['Sun','Mán','Þri','Mið','Fim','Fös','Lau'],
    +		dayNamesMin: ['Su','Má','Þr','Mi','Fi','Fö','La'],
    +		weekHeader: 'Vika',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['is']);
    +});
    +/* Written by Antonello Pasella (antonello.pasella@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['it'] = {
    +		closeText: 'Chiudi',
    +		prevText: '<Prec',
    +		nextText: 'Succ>',
    +		currentText: 'Oggi',
    +		monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno',
    +			'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'],
    +		monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu',
    +			'Lug','Ago','Set','Ott','Nov','Dic'],
    +		dayNames: ['Domenica','Lunedì','Martedì','Mercoledì','Giovedì','Venerdì','Sabato'],
    +		dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'],
    +		dayNamesMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'],
    +		weekHeader: 'Sm',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['it']);
    +});
    +/* Written by Kentaro SATO (kentaro@ranvis.com). */
    +jQuery(function($){
    +	$.datepicker.regional['ja'] = {
    +		closeText: '閉じる',
    +		prevText: '<前',
    +		nextText: '次>',
    +		currentText: '今日',
    +		monthNames: ['1月','2月','3月','4月','5月','6月',
    +		'7月','8月','9月','10月','11月','12月'],
    +		monthNamesShort: ['1月','2月','3月','4月','5月','6月',
    +		'7月','8月','9月','10月','11月','12月'],
    +		dayNames: ['日曜日','月曜日','火曜日','水曜日','木曜日','金曜日','土曜日'],
    +		dayNamesShort: ['日','月','火','水','木','金','土'],
    +		dayNamesMin: ['日','月','火','水','木','金','土'],
    +		weekHeader: '週',
    +		dateFormat: 'yy/mm/dd',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: true,
    +		yearSuffix: '年'};
    +	$.datepicker.setDefaults($.datepicker.regional['ja']);
    +});
    +/* Written by Lado Lomidze (lado.lomidze@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['ka'] = {
    +		closeText: 'დახურვა',
    +		prevText: '< წინა',
    +		nextText: 'შემდეგი >',
    +		currentText: 'დღეს',
    +		monthNames: ['იანვარი','თებერვალი','მარტი','აპრილი','მაისი','ივნისი', 'ივლისი','აგვისტო','სექტემბერი','ოქტომბერი','ნოემბერი','დეკემბერი'],
    +		monthNamesShort: ['იან','თებ','მარ','აპრ','მაი','ივნ', 'ივლ','აგვ','სექ','ოქტ','ნოე','დეკ'],
    +		dayNames: ['კვირა','ორშაბათი','სამშაბათი','ოთხშაბათი','ხუთშაბათი','პარასკევი','შაბათი'],
    +		dayNamesShort: ['კვ','ორშ','სამ','ოთხ','ხუთ','პარ','შაბ'],
    +		dayNamesMin: ['კვ','ორშ','სამ','ოთხ','ხუთ','პარ','შაბ'],
    +		weekHeader: 'კვირა',
    +		dateFormat: 'dd-mm-yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['ka']);
    +});
    +/* Written by Dmitriy Karasyov (dmitriy.karasyov@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['kk'] = {
    +		closeText: 'Жабу',
    +		prevText: '<Алдыңғы',
    +		nextText: 'Келесі>',
    +		currentText: 'Бүгін',
    +		monthNames: ['Қаңтар','Ақпан','Наурыз','Сәуір','Мамыр','Маусым',
    +		'Шілде','Тамыз','Қыркүйек','Қазан','Қараша','Желтоқсан'],
    +		monthNamesShort: ['Қаң','Ақп','Нау','Сәу','Мам','Мау',
    +		'Шіл','Там','Қыр','Қаз','Қар','Жел'],
    +		dayNames: ['Жексенбі','Дүйсенбі','Сейсенбі','Сәрсенбі','Бейсенбі','Жұма','Сенбі'],
    +		dayNamesShort: ['жкс','дсн','ссн','срс','бсн','жма','снб'],
    +		dayNamesMin: ['Жк','Дс','Сс','Ср','Бс','Жм','Сн'],
    +		weekHeader: 'Не',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['kk']);
    +});
    +/* Written by Chandara Om (chandara.teacher@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['km'] = {
    +		closeText: 'ធ្វើ​រួច',
    +		prevText: 'មុន',
    +		nextText: 'បន្ទាប់',
    +		currentText: 'ថ្ងៃ​នេះ',
    +		monthNames: ['មករា','កុម្ភៈ','មីនា','មេសា','ឧសភា','មិថុនា',
    +		'កក្កដា','សីហា','កញ្ញា','តុលា','វិច្ឆិកា','ធ្នូ'],
    +		monthNamesShort: ['មករា','កុម្ភៈ','មីនា','មេសា','ឧសភា','មិថុនា',
    +		'កក្កដា','សីហា','កញ្ញា','តុលា','វិច្ឆិកា','ធ្នូ'],
    +		dayNames: ['អាទិត្យ', 'ចន្ទ', 'អង្គារ', 'ពុធ', 'ព្រហស្បតិ៍', 'សុក្រ', 'សៅរ៍'],
    +		dayNamesShort: ['អា', 'ច', 'អ', 'ពុ', 'ព្រហ', 'សុ', 'សៅ'],
    +		dayNamesMin: ['អា', 'ច', 'អ', 'ពុ', 'ព្រហ', 'សុ', 'សៅ'],
    +		weekHeader: 'សប្ដាហ៍',
    +		dateFormat: 'dd-mm-yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['km']);
    +});
    +/* Written by DaeKwon Kang (ncrash.dk@gmail.com), Edited by Genie. */
    +jQuery(function($){
    +	$.datepicker.regional['ko'] = {
    +		closeText: '닫기',
    +		prevText: '이전달',
    +		nextText: '다음달',
    +		currentText: '오늘',
    +		monthNames: ['1월','2월','3월','4월','5월','6월',
    +		'7월','8월','9월','10월','11월','12월'],
    +		monthNamesShort: ['1월','2월','3월','4월','5월','6월',
    +		'7월','8월','9월','10월','11월','12월'],
    +		dayNames: ['일요일','월요일','화요일','수요일','목요일','금요일','토요일'],
    +		dayNamesShort: ['일','월','화','수','목','금','토'],
    +		dayNamesMin: ['일','월','화','수','목','금','토'],
    +		weekHeader: 'Wk',
    +		dateFormat: 'yy-mm-dd',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: true,
    +		yearSuffix: '년'};
    +	$.datepicker.setDefaults($.datepicker.regional['ko']);
    +});
    +/* Written by Michel Weimerskirch  */
    +jQuery(function($){
    +	$.datepicker.regional['lb'] = {
    +		closeText: 'Fäerdeg',
    +		prevText: 'Zréck',
    +		nextText: 'Weider',
    +		currentText: 'Haut',
    +		monthNames: ['Januar','Februar','Mäerz','Abrëll','Mee','Juni',
    +		'Juli','August','September','Oktober','November','Dezember'],
    +		monthNamesShort: ['Jan', 'Feb', 'Mäe', 'Abr', 'Mee', 'Jun',
    +		'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],
    +		dayNames: ['Sonndeg', 'Méindeg', 'Dënschdeg', 'Mëttwoch', 'Donneschdeg', 'Freideg', 'Samschdeg'],
    +		dayNamesShort: ['Son', 'Méi', 'Dën', 'Mët', 'Don', 'Fre', 'Sam'],
    +		dayNamesMin: ['So','Mé','Dë','Më','Do','Fr','Sa'],
    +		weekHeader: 'W',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['lb']);
    +});
    +/* @author Arturas Paleicikas  */
    +jQuery(function($){
    +	$.datepicker.regional['lt'] = {
    +		closeText: 'Uždaryti',
    +		prevText: '<Atgal',
    +		nextText: 'Pirmyn>',
    +		currentText: 'Šiandien',
    +		monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis',
    +		'Liepa','Rugpjūtis','Rugsėjis','Spalis','Lapkritis','Gruodis'],
    +		monthNamesShort: ['Sau','Vas','Kov','Bal','Geg','Bir',
    +		'Lie','Rugp','Rugs','Spa','Lap','Gru'],
    +		dayNames: ['sekmadienis','pirmadienis','antradienis','trečiadienis','ketvirtadienis','penktadienis','šeštadienis'],
    +		dayNamesShort: ['sek','pir','ant','tre','ket','pen','šeš'],
    +		dayNamesMin: ['Se','Pr','An','Tr','Ke','Pe','Še'],
    +		weekHeader: 'SAV',
    +		dateFormat: 'yy-mm-dd',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: true,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['lt']);
    +});
    +/* @author Arturas Paleicikas  */
    +jQuery(function($){
    +	$.datepicker.regional['lv'] = {
    +		closeText: 'Aizvērt',
    +		prevText: 'Iepr.',
    +		nextText: 'Nāk.',
    +		currentText: 'Šodien',
    +		monthNames: ['Janvāris','Februāris','Marts','Aprīlis','Maijs','Jūnijs',
    +		'Jūlijs','Augusts','Septembris','Oktobris','Novembris','Decembris'],
    +		monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jūn',
    +		'Jūl','Aug','Sep','Okt','Nov','Dec'],
    +		dayNames: ['svētdiena','pirmdiena','otrdiena','trešdiena','ceturtdiena','piektdiena','sestdiena'],
    +		dayNamesShort: ['svt','prm','otr','tre','ctr','pkt','sst'],
    +		dayNamesMin: ['Sv','Pr','Ot','Tr','Ct','Pk','Ss'],
    +		weekHeader: 'Ned.',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['lv']);
    +});
    +/* Written by Stojce Slavkovski. */
    +jQuery(function($){
    +	$.datepicker.regional['mk'] = {
    +		closeText: 'Затвори',
    +		prevText: '<',
    +		nextText: '>',
    +		currentText: 'Денес',
    +		monthNames: ['Јануари','Февруари','Март','Април','Мај','Јуни',
    +		'Јули','Август','Септември','Октомври','Ноември','Декември'],
    +		monthNamesShort: ['Јан','Фев','Мар','Апр','Мај','Јун',
    +		'Јул','Авг','Сеп','Окт','Ное','Дек'],
    +		dayNames: ['Недела','Понеделник','Вторник','Среда','Четврток','Петок','Сабота'],
    +		dayNamesShort: ['Нед','Пон','Вто','Сре','Чет','Пет','Саб'],
    +		dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Са'],
    +		weekHeader: 'Сед',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['mk']);
    +});
    +/* Written by Saji Nediyanchath (saji89@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['ml'] = {
    +		closeText: 'ശരി',
    +		prevText: 'മുന്നത്തെ',
    +		nextText: 'അടുത്തത് ',
    +		currentText: 'ഇന്ന്',
    +		monthNames: ['ജനുവരി','ഫെബ്രുവരി','മാര്‍ച്ച്','ഏപ്രില്‍','മേയ്','ജൂണ്‍',
    +		'ജൂലൈ','ആഗസ്റ്റ്','സെപ്റ്റംബര്‍','ഒക്ടോബര്‍','നവംബര്‍','ഡിസംബര്‍'],
    +		monthNamesShort: ['ജനു', 'ഫെബ്', 'മാര്‍', 'ഏപ്രി', 'മേയ്', 'ജൂണ്‍',
    +		'ജൂലാ', 'ആഗ', 'സെപ്', 'ഒക്ടോ', 'നവം', 'ഡിസ'],
    +		dayNames: ['ഞായര്‍', 'തിങ്കള്‍', 'ചൊവ്വ', 'ബുധന്‍', 'വ്യാഴം', 'വെള്ളി', 'ശനി'],
    +		dayNamesShort: ['ഞായ', 'തിങ്ക', 'ചൊവ്വ', 'ബുധ', 'വ്യാഴം', 'വെള്ളി', 'ശനി'],
    +		dayNamesMin: ['ഞാ','തി','ചൊ','ബു','വ്യാ','വെ','ശ'],
    +		weekHeader: 'ആ',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['ml']);
    +});
    +/* Written by Mohd Nawawi Mohamad Jamili (nawawi@ronggeng.net). */
    +jQuery(function($){
    +	$.datepicker.regional['ms'] = {
    +		closeText: 'Tutup',
    +		prevText: '<Sebelum',
    +		nextText: 'Selepas>',
    +		currentText: 'hari ini',
    +		monthNames: ['Januari','Februari','Mac','April','Mei','Jun',
    +		'Julai','Ogos','September','Oktober','November','Disember'],
    +		monthNamesShort: ['Jan','Feb','Mac','Apr','Mei','Jun',
    +		'Jul','Ogo','Sep','Okt','Nov','Dis'],
    +		dayNames: ['Ahad','Isnin','Selasa','Rabu','Khamis','Jumaat','Sabtu'],
    +		dayNamesShort: ['Aha','Isn','Sel','Rab','kha','Jum','Sab'],
    +		dayNamesMin: ['Ah','Is','Se','Ra','Kh','Ju','Sa'],
    +		weekHeader: 'Mg',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['ms']);
    +});
    +/* David De Sloovere @DavidDeSloovere */
    +jQuery(function($){
    +	$.datepicker.regional['nl-BE'] = {
    +		closeText: 'Sluiten',
    +		prevText: '←',
    +		nextText: '→',
    +		currentText: 'Vandaag',
    +		monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',
    +		'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
    +		monthNamesShort: ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun',
    +		'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
    +		dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
    +		dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],
    +		dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
    +		weekHeader: 'Wk',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['nl-BE']);
    +});
    +/* Written by Mathias Bynens  */
    +jQuery(function($){
    +	$.datepicker.regional.nl = {
    +		closeText: 'Sluiten',
    +		prevText: '←',
    +		nextText: '→',
    +		currentText: 'Vandaag',
    +		monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',
    +		'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
    +		monthNamesShort: ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun',
    +		'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
    +		dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
    +		dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],
    +		dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
    +		weekHeader: 'Wk',
    +		dateFormat: 'dd-mm-yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional.nl);
    +});
    +/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */
    +
    +jQuery(function($){
    +	$.datepicker.regional['no'] = {
    +		closeText: 'Lukk',
    +		prevText: '«Forrige',
    +		nextText: 'Neste»',
    +		currentText: 'I dag',
    +		monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'],
    +		monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'],
    +		dayNamesShort: ['søn','man','tir','ons','tor','fre','lør'],
    +		dayNames: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'],
    +		dayNamesMin: ['sø','ma','ti','on','to','fr','lø'],
    +		weekHeader: 'Uke',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''
    +	};
    +	$.datepicker.setDefaults($.datepicker.regional['no']);
    +});
    +/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['pl'] = {
    +		closeText: 'Zamknij',
    +		prevText: '<Poprzedni',
    +		nextText: 'Następny>',
    +		currentText: 'Dziś',
    +		monthNames: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec',
    +		'Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'],
    +		monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze',
    +		'Lip','Sie','Wrz','Pa','Lis','Gru'],
    +		dayNames: ['Niedziela','Poniedziałek','Wtorek','Środa','Czwartek','Piątek','Sobota'],
    +		dayNamesShort: ['Nie','Pn','Wt','Śr','Czw','Pt','So'],
    +		dayNamesMin: ['N','Pn','Wt','Śr','Cz','Pt','So'],
    +		weekHeader: 'Tydz',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['pl']);
    +});
    +/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['pt-BR'] = {
    +		closeText: 'Fechar',
    +		prevText: '<Anterior',
    +		nextText: 'Próximo>',
    +		currentText: 'Hoje',
    +		monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho',
    +		'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
    +		monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
    +		'Jul','Ago','Set','Out','Nov','Dez'],
    +		dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'],
    +		dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
    +		dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
    +		weekHeader: 'Sm',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['pt-BR']);
    +});
    +jQuery(function($){
    +	$.datepicker.regional['pt'] = {
    +		closeText: 'Fechar',
    +		prevText: 'Anterior',
    +		nextText: 'Seguinte',
    +		currentText: 'Hoje',
    +		monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho',
    +		'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
    +		monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
    +		'Jul','Ago','Set','Out','Nov','Dez'],
    +		dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'],
    +		dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
    +		dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
    +		weekHeader: 'Sem',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['pt']);
    +});
    +/* Written by Yvonne Gienal (yvonne.gienal@educa.ch). */
    +jQuery(function($){
    +	$.datepicker.regional['rm'] = {
    +		closeText: 'Serrar',
    +		prevText: '<Suandant',
    +		nextText: 'Precedent>',
    +		currentText: 'Actual',
    +		monthNames: ['Schaner','Favrer','Mars','Avrigl','Matg','Zercladur', 'Fanadur','Avust','Settember','October','November','December'],
    +		monthNamesShort: ['Scha','Fev','Mar','Avr','Matg','Zer', 'Fan','Avu','Sett','Oct','Nov','Dec'],
    +		dayNames: ['Dumengia','Glindesdi','Mardi','Mesemna','Gievgia','Venderdi','Sonda'],
    +		dayNamesShort: ['Dum','Gli','Mar','Mes','Gie','Ven','Som'],
    +		dayNamesMin: ['Du','Gl','Ma','Me','Gi','Ve','So'],
    +		weekHeader: 'emna',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['rm']);
    +});
    +jQuery(function($){
    +	$.datepicker.regional['ro'] = {
    +		closeText: 'Închide',
    +		prevText: '« Luna precedentă',
    +		nextText: 'Luna următoare »',
    +		currentText: 'Azi',
    +		monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie',
    +		'Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'],
    +		monthNamesShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun',
    +		'Iul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
    +		dayNames: ['Duminică', 'Luni', 'Marţi', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă'],
    +		dayNamesShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'],
    +		dayNamesMin: ['Du','Lu','Ma','Mi','Jo','Vi','Sâ'],
    +		weekHeader: 'Săpt',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['ro']);
    +});
    +/* Written by Andrew Stromnov (stromnov@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['ru'] = {
    +		closeText: 'Закрыть',
    +		prevText: '<Пред',
    +		nextText: 'След>',
    +		currentText: 'Сегодня',
    +		monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь',
    +		'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
    +		monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн',
    +		'Июл','Авг','Сен','Окт','Ноя','Дек'],
    +		dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'],
    +		dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'],
    +		dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'],
    +		weekHeader: 'Нед',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['ru']);
    +});
    +/* Written by Vojtech Rinik (vojto@hmm.sk). */
    +jQuery(function($){
    +	$.datepicker.regional['sk'] = {
    +		closeText: 'Zavrieť',
    +		prevText: '<Predchádzajúci',
    +		nextText: 'Nasledujúci>',
    +		currentText: 'Dnes',
    +		monthNames: ['január','február','marec','apríl','máj','jún',
    +		'júl','august','september','október','november','december'],
    +		monthNamesShort: ['Jan','Feb','Mar','Apr','Máj','Jún',
    +		'Júl','Aug','Sep','Okt','Nov','Dec'],
    +		dayNames: ['nedeľa','pondelok','utorok','streda','štvrtok','piatok','sobota'],
    +		dayNamesShort: ['Ned','Pon','Uto','Str','Štv','Pia','Sob'],
    +		dayNamesMin: ['Ne','Po','Ut','St','Št','Pia','So'],
    +		weekHeader: 'Ty',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['sk']);
    +});
    +/* Written by Jaka Jancar (jaka@kubje.org). */
    +/* c = č, s = š z = ž C = Č S = Š Z = Ž */
    +jQuery(function($){
    +	$.datepicker.regional['sl'] = {
    +		closeText: 'Zapri',
    +		prevText: '<Prejšnji',
    +		nextText: 'Naslednji>',
    +		currentText: 'Trenutni',
    +		monthNames: ['Januar','Februar','Marec','April','Maj','Junij',
    +		'Julij','Avgust','September','Oktober','November','December'],
    +		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
    +		'Jul','Avg','Sep','Okt','Nov','Dec'],
    +		dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','Četrtek','Petek','Sobota'],
    +		dayNamesShort: ['Ned','Pon','Tor','Sre','Čet','Pet','Sob'],
    +		dayNamesMin: ['Ne','Po','To','Sr','Če','Pe','So'],
    +		weekHeader: 'Teden',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['sl']);
    +});
    +/* Written by Flakron Bytyqi (flakron@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['sq'] = {
    +		closeText: 'mbylle',
    +		prevText: '<mbrapa',
    +		nextText: 'Përpara>',
    +		currentText: 'sot',
    +		monthNames: ['Janar','Shkurt','Mars','Prill','Maj','Qershor',
    +		'Korrik','Gusht','Shtator','Tetor','Nëntor','Dhjetor'],
    +		monthNamesShort: ['Jan','Shk','Mar','Pri','Maj','Qer',
    +		'Kor','Gus','Sht','Tet','Nën','Dhj'],
    +		dayNames: ['E Diel','E Hënë','E Martë','E Mërkurë','E Enjte','E Premte','E Shtune'],
    +		dayNamesShort: ['Di','Hë','Ma','Më','En','Pr','Sh'],
    +		dayNamesMin: ['Di','Hë','Ma','Më','En','Pr','Sh'],
    +		weekHeader: 'Ja',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['sq']);
    +});
    +/* Written by Dejan Dimić. */
    +jQuery(function($){
    +	$.datepicker.regional['sr-SR'] = {
    +		closeText: 'Zatvori',
    +		prevText: '<',
    +		nextText: '>',
    +		currentText: 'Danas',
    +		monthNames: ['Januar','Februar','Mart','April','Maj','Jun',
    +		'Jul','Avgust','Septembar','Oktobar','Novembar','Decembar'],
    +		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
    +		'Jul','Avg','Sep','Okt','Nov','Dec'],
    +		dayNames: ['Nedelja','Ponedeljak','Utorak','Sreda','Četvrtak','Petak','Subota'],
    +		dayNamesShort: ['Ned','Pon','Uto','Sre','Čet','Pet','Sub'],
    +		dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
    +		weekHeader: 'Sed',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['sr-SR']);
    +});
    +/* Written by Dejan Dimić. */
    +jQuery(function($){
    +	$.datepicker.regional['sr'] = {
    +		closeText: 'Затвори',
    +		prevText: '<',
    +		nextText: '>',
    +		currentText: 'Данас',
    +		monthNames: ['Јануар','Фебруар','Март','Април','Мај','Јун',
    +		'Јул','Август','Септембар','Октобар','Новембар','Децембар'],
    +		monthNamesShort: ['Јан','Феб','Мар','Апр','Мај','Јун',
    +		'Јул','Авг','Сеп','Окт','Нов','Дец'],
    +		dayNames: ['Недеља','Понедељак','Уторак','Среда','Четвртак','Петак','Субота'],
    +		dayNamesShort: ['Нед','Пон','Уто','Сре','Чет','Пет','Суб'],
    +		dayNamesMin: ['Не','По','Ут','Ср','Че','Пе','Су'],
    +		weekHeader: 'Сед',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['sr']);
    +});
    +/* Written by Anders Ekdahl ( anders@nomadiz.se). */
    +jQuery(function($){
    +	$.datepicker.regional['sv'] = {
    +		closeText: 'Stäng',
    +		prevText: '«Förra',
    +		nextText: 'Nästa»',
    +		currentText: 'Idag',
    +		monthNames: ['Januari','Februari','Mars','April','Maj','Juni',
    +		'Juli','Augusti','September','Oktober','November','December'],
    +		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
    +		'Jul','Aug','Sep','Okt','Nov','Dec'],
    +		dayNamesShort: ['Sön','Mån','Tis','Ons','Tor','Fre','Lör'],
    +		dayNames: ['Söndag','Måndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'],
    +		dayNamesMin: ['Sö','Må','Ti','On','To','Fr','Lö'],
    +		weekHeader: 'Ve',
    +		dateFormat: 'yy-mm-dd',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['sv']);
    +});
    +/* Written by S A Sureshkumar (saskumar@live.com). */
    +jQuery(function($){
    +	$.datepicker.regional['ta'] = {
    +		closeText: 'மூடு',
    +		prevText: 'முன்னையது',
    +		nextText: 'அடுத்தது',
    +		currentText: 'இன்று',
    +		monthNames: ['தை','மாசி','பங்குனி','சித்திரை','வைகாசி','ஆனி',
    +		'ஆடி','ஆவணி','புரட்டாசி','ஐப்பசி','கார்த்திகை','மார்கழி'],
    +		monthNamesShort: ['தை','மாசி','பங்','சித்','வைகா','ஆனி',
    +		'ஆடி','ஆவ','புர','ஐப்','கார்','மார்'],
    +		dayNames: ['ஞாயிற்றுக்கிழமை','திங்கட்கிழமை','செவ்வாய்க்கிழமை','புதன்கிழமை','வியாழக்கிழமை','வெள்ளிக்கிழமை','சனிக்கிழமை'],
    +		dayNamesShort: ['ஞாயிறு','திங்கள்','செவ்வாய்','புதன்','வியாழன்','வெள்ளி','சனி'],
    +		dayNamesMin: ['ஞா','தி','செ','பு','வி','வெ','ச'],
    +		weekHeader: 'Не',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['ta']);
    +});
    +/* Written by pipo (pipo@sixhead.com). */
    +jQuery(function($){
    +	$.datepicker.regional['th'] = {
    +		closeText: 'ปิด',
    +		prevText: '« ย้อน',
    +		nextText: 'ถัดไป »',
    +		currentText: 'วันนี้',
    +		monthNames: ['มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน',
    +		'กรกฎาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม'],
    +		monthNamesShort: ['ม.ค.','ก.พ.','มี.ค.','เม.ย.','พ.ค.','มิ.ย.',
    +		'ก.ค.','ส.ค.','ก.ย.','ต.ค.','พ.ย.','ธ.ค.'],
    +		dayNames: ['อาทิตย์','จันทร์','อังคาร','พุธ','พฤหัสบดี','ศุกร์','เสาร์'],
    +		dayNamesShort: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'],
    +		dayNamesMin: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'],
    +		weekHeader: 'Wk',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['th']);
    +});
    +/* Written by Abdurahmon Saidov (saidovab@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['tj'] = {
    +		closeText: 'Идома',
    +		prevText: '<Қафо',
    +		nextText: 'Пеш>',
    +		currentText: 'Имрӯз',
    +		monthNames: ['Январ','Феврал','Март','Апрел','Май','Июн',
    +		'Июл','Август','Сентябр','Октябр','Ноябр','Декабр'],
    +		monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн',
    +		'Июл','Авг','Сен','Окт','Ноя','Дек'],
    +		dayNames: ['якшанбе','душанбе','сешанбе','чоршанбе','панҷшанбе','ҷумъа','шанбе'],
    +		dayNamesShort: ['якш','душ','сеш','чор','пан','ҷум','шан'],
    +		dayNamesMin: ['Як','Дш','Сш','Чш','Пш','Ҷм','Шн'],
    +		weekHeader: 'Хф',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['tj']);
    +});
    +/* Written by Izzet Emre Erkan (kara@karalamalar.net). */
    +jQuery(function($){
    +	$.datepicker.regional['tr'] = {
    +		closeText: 'kapat',
    +		prevText: '<geri',
    +		nextText: 'ileri>',
    +		currentText: 'bugün',
    +		monthNames: ['Ocak','Şubat','Mart','Nisan','Mayıs','Haziran',
    +		'Temmuz','Ağustos','Eylül','Ekim','Kasım','Aralık'],
    +		monthNamesShort: ['Oca','Şub','Mar','Nis','May','Haz',
    +		'Tem','Ağu','Eyl','Eki','Kas','Ara'],
    +		dayNames: ['Pazar','Pazartesi','Salı','Çarşamba','Perşembe','Cuma','Cumartesi'],
    +		dayNamesShort: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'],
    +		dayNamesMin: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'],
    +		weekHeader: 'Hf',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['tr']);
    +});
    +/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */
    +/* Corrected by Igor Milla (igor.fsp.milla@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['uk'] = {
    +		closeText: 'Закрити',
    +		prevText: '<',
    +		nextText: '>',
    +		currentText: 'Сьогодні',
    +		monthNames: ['Січень','Лютий','Березень','Квітень','Травень','Червень',
    +		'Липень','Серпень','Вересень','Жовтень','Листопад','Грудень'],
    +		monthNamesShort: ['Січ','Лют','Бер','Кві','Тра','Чер',
    +		'Лип','Сер','Вер','Жов','Лис','Гру'],
    +		dayNames: ['неділя','понеділок','вівторок','середа','четвер','п’ятниця','субота'],
    +		dayNamesShort: ['нед','пнд','вів','срд','чтв','птн','сбт'],
    +		dayNamesMin: ['Нд','Пн','Вт','Ср','Чт','Пт','Сб'],
    +		weekHeader: 'Тиж',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['uk']);
    +});
    +/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */
    +jQuery(function($){
    +	$.datepicker.regional['vi'] = {
    +		closeText: 'Đóng',
    +		prevText: '<Trước',
    +		nextText: 'Tiếp>',
    +		currentText: 'Hôm nay',
    +		monthNames: ['Tháng Một', 'Tháng Hai', 'Tháng Ba', 'Tháng Tư', 'Tháng Năm', 'Tháng Sáu',
    +		'Tháng Bảy', 'Tháng Tám', 'Tháng Chín', 'Tháng Mười', 'Tháng Mười Một', 'Tháng Mười Hai'],
    +		monthNamesShort: ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6',
    +		'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'],
    +		dayNames: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'],
    +		dayNamesShort: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
    +		dayNamesMin: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
    +		weekHeader: 'Tu',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['vi']);
    +});
    +/* Written by Cloudream (cloudream@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['zh-CN'] = {
    +		closeText: '关闭',
    +		prevText: '<上月',
    +		nextText: '下月>',
    +		currentText: '今天',
    +		monthNames: ['一月','二月','三月','四月','五月','六月',
    +		'七月','八月','九月','十月','十一月','十二月'],
    +		monthNamesShort: ['一月','二月','三月','四月','五月','六月',
    +		'七月','八月','九月','十月','十一月','十二月'],
    +		dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
    +		dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
    +		dayNamesMin: ['日','一','二','三','四','五','六'],
    +		weekHeader: '周',
    +		dateFormat: 'yy-mm-dd',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: true,
    +		yearSuffix: '年'};
    +	$.datepicker.setDefaults($.datepicker.regional['zh-CN']);
    +});
    +/* Written by SCCY (samuelcychan@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['zh-HK'] = {
    +		closeText: '關閉',
    +		prevText: '<上月',
    +		nextText: '下月>',
    +		currentText: '今天',
    +		monthNames: ['一月','二月','三月','四月','五月','六月',
    +		'七月','八月','九月','十月','十一月','十二月'],
    +		monthNamesShort: ['一月','二月','三月','四月','五月','六月',
    +		'七月','八月','九月','十月','十一月','十二月'],
    +		dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
    +		dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
    +		dayNamesMin: ['日','一','二','三','四','五','六'],
    +		weekHeader: '周',
    +		dateFormat: 'dd-mm-yy',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: true,
    +		yearSuffix: '年'};
    +	$.datepicker.setDefaults($.datepicker.regional['zh-HK']);
    +});
    +/* Written by Ressol (ressol@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['zh-TW'] = {
    +		closeText: '關閉',
    +		prevText: '<上月',
    +		nextText: '下月>',
    +		currentText: '今天',
    +		monthNames: ['一月','二月','三月','四月','五月','六月',
    +		'七月','八月','九月','十月','十一月','十二月'],
    +		monthNamesShort: ['一月','二月','三月','四月','五月','六月',
    +		'七月','八月','九月','十月','十一月','十二月'],
    +		dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
    +		dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
    +		dayNamesMin: ['日','一','二','三','四','五','六'],
    +		weekHeader: '周',
    +		dateFormat: 'yy/mm/dd',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: true,
    +		yearSuffix: '年'};
    +	$.datepicker.setDefaults($.datepicker.regional['zh-TW']);
    +});
    +/* Written by Pavel Selitskas  */
    +jQuery(function($){
    +	$.datepicker.regional['be'] = {
    +		closeText: 'Зачыніць',
    +		prevText: '←Папяр.',
    +		nextText: 'Наст.→',
    +		currentText: 'Сёньня',
    +		monthNames: ['Студзень','Люты','Сакавік','Красавік','Травень','Чэрвень',
    +		'Ліпень','Жнівень','Верасень','Кастрычнік','Лістапад','Сьнежань'],
    +		monthNamesShort: ['Сту','Лют','Сак','Кра','Тра','Чэр',
    +		'Ліп','Жні','Вер','Кас','Ліс','Сьн'],
    +		dayNames: ['нядзеля','панядзелак','аўторак','серада','чацьвер','пятніца','субота'],
    +		dayNamesShort: ['ндз','пнд','аўт','срд','чцв','птн','сбт'],
    +		dayNamesMin: ['Нд','Пн','Аў','Ср','Чц','Пт','Сб'],
    +		weekHeader: 'Тд',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['be']);
    +});
    +jQuery(function ($) {
    +	$.datepicker.regional['fr-CA'] = {
    +		closeText: 'Fermer',
    +		prevText: 'Précédent',
    +		nextText: 'Suivant',
    +		currentText: 'Aujourd\'hui',
    +		monthNames: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin',
    +			'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],
    +		monthNamesShort: ['janv.', 'févr.', 'mars', 'avril', 'mai', 'juin',
    +			'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],
    +		dayNames: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],
    +		dayNamesShort: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],
    +		dayNamesMin: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
    +		weekHeader: 'Sem.',
    +		dateFormat: 'yy-mm-dd',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''
    +	};
    +	$.datepicker.setDefaults($.datepicker.regional['fr-CA']);
    +});
    +/* Written by Sergey Kartashov (ebishkek@yandex.ru). */
    +jQuery(function($){
    +	$.datepicker.regional['ky'] = {
    +		closeText: 'Жабуу',
    +		prevText: '<Мур',
    +		nextText: 'Кий>',
    +		currentText: 'Бүгүн',
    +		monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь',
    +		'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
    +		monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн',
    +		'Июл','Авг','Сен','Окт','Ноя','Дек'],
    +		dayNames: ['жекшемби', 'дүйшөмбү', 'шейшемби', 'шаршемби', 'бейшемби', 'жума', 'ишемби'],
    +		dayNamesShort: ['жек', 'дүй', 'шей', 'шар', 'бей', 'жум', 'ише'],
    +		dayNamesMin: ['Жк','Дш','Шш','Шр','Бш','Жм','Иш'],
    +		weekHeader: 'Жум',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''
    +	};
    +	$.datepicker.setDefaults($.datepicker.regional['ky']);
    +});
    +/* Written by Bjørn Johansen (post@bjornjohansen.no). */
    +jQuery(function($){
    +	$.datepicker.regional['nb'] = {
    +		closeText: 'Lukk',
    +		prevText: '«Forrige',
    +		nextText: 'Neste»',
    +		currentText: 'I dag',
    +		monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'],
    +		monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'],
    +		dayNamesShort: ['søn','man','tir','ons','tor','fre','lør'],
    +		dayNames: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'],
    +		dayNamesMin: ['sø','ma','ti','on','to','fr','lø'],
    +		weekHeader: 'Uke',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''
    +	};
    +	$.datepicker.setDefaults($.datepicker.regional['nb']);
    +});
    +/* Written by Bjørn Johansen (post@bjornjohansen.no). */
    +jQuery(function($){
    +	$.datepicker.regional['nn'] = {
    +		closeText: 'Lukk',
    +		prevText: '«Førre',
    +		nextText: 'Neste»',
    +		currentText: 'I dag',
    +		monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'],
    +		monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'],
    +		dayNamesShort: ['sun','mån','tys','ons','tor','fre','lau'],
    +		dayNames: ['sundag','måndag','tysdag','onsdag','torsdag','fredag','laurdag'],
    +		dayNamesMin: ['su','må','ty','on','to','fr','la'],
    +		weekHeader: 'Veke',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''
    +	};
    +	$.datepicker.setDefaults($.datepicker.regional['nn']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-af.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-af.js
    new file mode 100644
    index 000000000..0922ef7a1
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-af.js
    @@ -0,0 +1,23 @@
    +/* Afrikaans initialisation for the jQuery UI date picker plugin. */
    +/* Written by Renier Pretorius. */
    +jQuery(function($){
    +	$.datepicker.regional['af'] = {
    +		closeText: 'Selekteer',
    +		prevText: 'Vorige',
    +		nextText: 'Volgende',
    +		currentText: 'Vandag',
    +		monthNames: ['Januarie','Februarie','Maart','April','Mei','Junie',
    +		'Julie','Augustus','September','Oktober','November','Desember'],
    +		monthNamesShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun',
    +		'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'],
    +		dayNames: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'],
    +		dayNamesShort: ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'],
    +		dayNamesMin: ['So','Ma','Di','Wo','Do','Vr','Sa'],
    +		weekHeader: 'Wk',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['af']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ar-DZ.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ar-DZ.js
    new file mode 100644
    index 000000000..7b175af40
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ar-DZ.js
    @@ -0,0 +1,23 @@
    +/* Algerian Arabic Translation for jQuery UI date picker plugin. (can be used for Tunisia)*/
    +/* Mohamed Cherif BOUCHELAGHEM -- cherifbouchelaghem@yahoo.fr */
    +
    +jQuery(function($){
    +	$.datepicker.regional['ar-DZ'] = {
    +		closeText: 'إغلاق',
    +		prevText: '<السابق',
    +		nextText: 'التالي>',
    +		currentText: 'اليوم',
    +		monthNames: ['جانفي', 'فيفري', 'مارس', 'أفريل', 'ماي', 'جوان',
    +		'جويلية', 'أوت', 'سبتمبر','أكتوبر', 'نوفمبر', 'ديسمبر'],
    +		monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
    +		dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
    +		dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
    +		dayNamesMin: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
    +		weekHeader: 'أسبوع',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 6,
    +  		isRTL: true,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['ar-DZ']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ar.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ar.js
    new file mode 100644
    index 000000000..cef0f08fd
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ar.js
    @@ -0,0 +1,23 @@
    +/* Arabic Translation for jQuery UI date picker plugin. */
    +/* Khaled Alhourani -- me@khaledalhourani.com */
    +/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name فبراير - يناير and there isn't any Arabic roots for these months */
    +jQuery(function($){
    +	$.datepicker.regional['ar'] = {
    +		closeText: 'إغلاق',
    +		prevText: '<السابق',
    +		nextText: 'التالي>',
    +		currentText: 'اليوم',
    +		monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'مايو', 'حزيران',
    +		'تموز', 'آب', 'أيلول',	'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],
    +		monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
    +		dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
    +		dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
    +		dayNamesMin: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],
    +		weekHeader: 'أسبوع',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 6,
    +  		isRTL: true,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['ar']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-az.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-az.js
    new file mode 100644
    index 000000000..a133a9eb2
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-az.js
    @@ -0,0 +1,23 @@
    +/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */
    +/* Written by Jamil Najafov (necefov33@gmail.com). */
    +jQuery(function($) {
    +	$.datepicker.regional['az'] = {
    +		closeText: 'Bağla',
    +		prevText: '<Geri',
    +		nextText: 'İrəli>',
    +		currentText: 'Bugün',
    +		monthNames: ['Yanvar','Fevral','Mart','Aprel','May','İyun',
    +		'İyul','Avqust','Sentyabr','Oktyabr','Noyabr','Dekabr'],
    +		monthNamesShort: ['Yan','Fev','Mar','Apr','May','İyun',
    +		'İyul','Avq','Sen','Okt','Noy','Dek'],
    +		dayNames: ['Bazar','Bazar ertəsi','Çərşənbə axşamı','Çərşənbə','Cümə axşamı','Cümə','Şənbə'],
    +		dayNamesShort: ['B','Be','Ça','Ç','Ca','C','Ş'],
    +		dayNamesMin: ['B','B','Ç','С','Ç','C','Ş'],
    +		weekHeader: 'Hf',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['az']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-be.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-be.js
    new file mode 100644
    index 000000000..6ea12f725
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-be.js
    @@ -0,0 +1,23 @@
    +/* Belarusian initialisation for the jQuery UI date picker plugin. */
    +/* Written by Pavel Selitskas  */
    +jQuery(function($){
    +	$.datepicker.regional['be'] = {
    +		closeText: 'Зачыніць',
    +		prevText: '←Папяр.',
    +		nextText: 'Наст.→',
    +		currentText: 'Сёньня',
    +		monthNames: ['Студзень','Люты','Сакавік','Красавік','Травень','Чэрвень',
    +		'Ліпень','Жнівень','Верасень','Кастрычнік','Лістапад','Сьнежань'],
    +		monthNamesShort: ['Сту','Лют','Сак','Кра','Тра','Чэр',
    +		'Ліп','Жні','Вер','Кас','Ліс','Сьн'],
    +		dayNames: ['нядзеля','панядзелак','аўторак','серада','чацьвер','пятніца','субота'],
    +		dayNamesShort: ['ндз','пнд','аўт','срд','чцв','птн','сбт'],
    +		dayNamesMin: ['Нд','Пн','Аў','Ср','Чц','Пт','Сб'],
    +		weekHeader: 'Тд',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['be']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-bg.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-bg.js
    new file mode 100644
    index 000000000..86ab88582
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-bg.js
    @@ -0,0 +1,24 @@
    +/* Bulgarian initialisation for the jQuery UI date picker plugin. */
    +/* Written by Stoyan Kyosev (http://svest.org). */
    +jQuery(function($){
    +	$.datepicker.regional['bg'] = {
    +		closeText: 'затвори',
    +		prevText: '<назад',
    +		nextText: 'напред>',
    +		nextBigText: '>>',
    +		currentText: 'днес',
    +		monthNames: ['Януари','Февруари','Март','Април','Май','Юни',
    +		'Юли','Август','Септември','Октомври','Ноември','Декември'],
    +		monthNamesShort: ['Яну','Фев','Мар','Апр','Май','Юни',
    +		'Юли','Авг','Сеп','Окт','Нов','Дек'],
    +		dayNames: ['Неделя','Понеделник','Вторник','Сряда','Четвъртък','Петък','Събота'],
    +		dayNamesShort: ['Нед','Пон','Вто','Сря','Чет','Пет','Съб'],
    +		dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Съ'],
    +		weekHeader: 'Wk',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['bg']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-bs.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-bs.js
    new file mode 100644
    index 000000000..f08870ffe
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-bs.js
    @@ -0,0 +1,23 @@
    +/* Bosnian i18n for the jQuery UI date picker plugin. */
    +/* Written by Kenan Konjo. */
    +jQuery(function($){
    +	$.datepicker.regional['bs'] = {
    +		closeText: 'Zatvori',
    +		prevText: '<',
    +		nextText: '>',
    +		currentText: 'Danas',
    +		monthNames: ['Januar','Februar','Mart','April','Maj','Juni',
    +		'Juli','August','Septembar','Oktobar','Novembar','Decembar'],
    +		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
    +		'Jul','Aug','Sep','Okt','Nov','Dec'],
    +		dayNames: ['Nedelja','Ponedeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'],
    +		dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'],
    +		dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
    +		weekHeader: 'Wk',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['bs']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ca.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ca.js
    new file mode 100644
    index 000000000..a10b549c2
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ca.js
    @@ -0,0 +1,23 @@
    +/* Inicialització en català per a l'extensió 'UI date picker' per jQuery. */
    +/* Writers: (joan.leon@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['ca'] = {
    +		closeText: 'Tanca',
    +		prevText: 'Anterior',
    +		nextText: 'Següent',
    +		currentText: 'Avui',
    +		monthNames: ['gener','febrer','març','abril','maig','juny',
    +		'juliol','agost','setembre','octubre','novembre','desembre'],
    +		monthNamesShort: ['gen','feb','març','abr','maig','juny',
    +		'jul','ag','set','oct','nov','des'],
    +		dayNames: ['diumenge','dilluns','dimarts','dimecres','dijous','divendres','dissabte'],
    +		dayNamesShort: ['dg','dl','dt','dc','dj','dv','ds'],
    +		dayNamesMin: ['dg','dl','dt','dc','dj','dv','ds'],
    +		weekHeader: 'Set',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['ca']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-cs.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-cs.js
    new file mode 100644
    index 000000000..b96b1a51c
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-cs.js
    @@ -0,0 +1,23 @@
    +/* Czech initialisation for the jQuery UI date picker plugin. */
    +/* Written by Tomas Muller (tomas@tomas-muller.net). */
    +jQuery(function($){
    +	$.datepicker.regional['cs'] = {
    +		closeText: 'Zavřít',
    +		prevText: '<Dříve',
    +		nextText: 'Později>',
    +		currentText: 'Nyní',
    +		monthNames: ['leden','únor','březen','duben','květen','červen',
    +		'červenec','srpen','září','říjen','listopad','prosinec'],
    +		monthNamesShort: ['led','úno','bře','dub','kvě','čer',
    +		'čvc','srp','zář','říj','lis','pro'],
    +		dayNames: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'],
    +		dayNamesShort: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],
    +		dayNamesMin: ['ne','po','út','st','čt','pá','so'],
    +		weekHeader: 'Týd',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['cs']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-cy-GB.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-cy-GB.js
    new file mode 100644
    index 000000000..cf3a38e6c
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-cy-GB.js
    @@ -0,0 +1,23 @@
    +/* Welsh/UK initialisation for the jQuery UI date picker plugin. */
    +/* Written by William Griffiths. */
    +jQuery(function($){
    +	$.datepicker.regional['cy-GB'] = {
    +		closeText: 'Done',
    +		prevText: 'Prev',
    +		nextText: 'Next',
    +		currentText: 'Today',
    +		monthNames: ['Ionawr','Chwefror','Mawrth','Ebrill','Mai','Mehefin',
    +		'Gorffennaf','Awst','Medi','Hydref','Tachwedd','Rhagfyr'],
    +		monthNamesShort: ['Ion', 'Chw', 'Maw', 'Ebr', 'Mai', 'Meh',
    +		'Gor', 'Aws', 'Med', 'Hyd', 'Tac', 'Rha'],
    +		dayNames: ['Dydd Sul', 'Dydd Llun', 'Dydd Mawrth', 'Dydd Mercher', 'Dydd Iau', 'Dydd Gwener', 'Dydd Sadwrn'],
    +		dayNamesShort: ['Sul', 'Llu', 'Maw', 'Mer', 'Iau', 'Gwe', 'Sad'],
    +		dayNamesMin: ['Su','Ll','Ma','Me','Ia','Gw','Sa'],
    +		weekHeader: 'Wy',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['cy-GB']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-da.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-da.js
    new file mode 100644
    index 000000000..7e42948b3
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-da.js
    @@ -0,0 +1,23 @@
    +/* Danish initialisation for the jQuery UI date picker plugin. */
    +/* Written by Jan Christensen ( deletestuff@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['da'] = {
    +		closeText: 'Luk',
    +		prevText: '<Forrige',
    +		nextText: 'Næste>',
    +		currentText: 'Idag',
    +		monthNames: ['Januar','Februar','Marts','April','Maj','Juni',
    +		'Juli','August','September','Oktober','November','December'],
    +		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
    +		'Jul','Aug','Sep','Okt','Nov','Dec'],
    +		dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'],
    +		dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'],
    +		dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'],
    +		weekHeader: 'Uge',
    +		dateFormat: 'dd-mm-yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['da']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-de.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-de.js
    new file mode 100644
    index 000000000..abe75c4e4
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-de.js
    @@ -0,0 +1,23 @@
    +/* German initialisation for the jQuery UI date picker plugin. */
    +/* Written by Milian Wolff (mail@milianw.de). */
    +jQuery(function($){
    +	$.datepicker.regional['de'] = {
    +		closeText: 'Schließen',
    +		prevText: '<Zurück',
    +		nextText: 'Vor>',
    +		currentText: 'Heute',
    +		monthNames: ['Januar','Februar','März','April','Mai','Juni',
    +		'Juli','August','September','Oktober','November','Dezember'],
    +		monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',
    +		'Jul','Aug','Sep','Okt','Nov','Dez'],
    +		dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
    +		dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
    +		dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
    +		weekHeader: 'KW',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['de']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-el.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-el.js
    new file mode 100644
    index 000000000..1ac47561a
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-el.js
    @@ -0,0 +1,23 @@
    +/* Greek (el) initialisation for the jQuery UI date picker plugin. */
    +/* Written by Alex Cicovic (http://www.alexcicovic.com) */
    +jQuery(function($){
    +	$.datepicker.regional['el'] = {
    +		closeText: 'Κλείσιμο',
    +		prevText: 'Προηγούμενος',
    +		nextText: 'Επόμενος',
    +		currentText: 'Τρέχων Μήνας',
    +		monthNames: ['Ιανουάριος','Φεβρουάριος','Μάρτιος','Απρίλιος','Μάιος','Ιούνιος',
    +		'Ιούλιος','Αύγουστος','Σεπτέμβριος','Οκτώβριος','Νοέμβριος','Δεκέμβριος'],
    +		monthNamesShort: ['Ιαν','Φεβ','Μαρ','Απρ','Μαι','Ιουν',
    +		'Ιουλ','Αυγ','Σεπ','Οκτ','Νοε','Δεκ'],
    +		dayNames: ['Κυριακή','Δευτέρα','Τρίτη','Τετάρτη','Πέμπτη','Παρασκευή','Σάββατο'],
    +		dayNamesShort: ['Κυρ','Δευ','Τρι','Τετ','Πεμ','Παρ','Σαβ'],
    +		dayNamesMin: ['Κυ','Δε','Τρ','Τε','Πε','Πα','Σα'],
    +		weekHeader: 'Εβδ',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['el']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-en-AU.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-en-AU.js
    new file mode 100644
    index 000000000..c1a1020a1
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-en-AU.js
    @@ -0,0 +1,23 @@
    +/* English/Australia initialisation for the jQuery UI date picker plugin. */
    +/* Based on the en-GB initialisation. */
    +jQuery(function($){
    +	$.datepicker.regional['en-AU'] = {
    +		closeText: 'Done',
    +		prevText: 'Prev',
    +		nextText: 'Next',
    +		currentText: 'Today',
    +		monthNames: ['January','February','March','April','May','June',
    +		'July','August','September','October','November','December'],
    +		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
    +		'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
    +		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
    +		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
    +		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
    +		weekHeader: 'Wk',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['en-AU']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-en-GB.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-en-GB.js
    new file mode 100644
    index 000000000..16a096e75
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-en-GB.js
    @@ -0,0 +1,23 @@
    +/* English/UK initialisation for the jQuery UI date picker plugin. */
    +/* Written by Stuart. */
    +jQuery(function($){
    +	$.datepicker.regional['en-GB'] = {
    +		closeText: 'Done',
    +		prevText: 'Prev',
    +		nextText: 'Next',
    +		currentText: 'Today',
    +		monthNames: ['January','February','March','April','May','June',
    +		'July','August','September','October','November','December'],
    +		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
    +		'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
    +		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
    +		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
    +		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
    +		weekHeader: 'Wk',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['en-GB']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-en-NZ.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-en-NZ.js
    new file mode 100644
    index 000000000..7819df052
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-en-NZ.js
    @@ -0,0 +1,23 @@
    +/* English/New Zealand initialisation for the jQuery UI date picker plugin. */
    +/* Based on the en-GB initialisation. */
    +jQuery(function($){
    +	$.datepicker.regional['en-NZ'] = {
    +		closeText: 'Done',
    +		prevText: 'Prev',
    +		nextText: 'Next',
    +		currentText: 'Today',
    +		monthNames: ['January','February','March','April','May','June',
    +		'July','August','September','October','November','December'],
    +		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
    +		'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
    +		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
    +		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
    +		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
    +		weekHeader: 'Wk',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['en-NZ']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-eo.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-eo.js
    new file mode 100644
    index 000000000..39e44fc57
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-eo.js
    @@ -0,0 +1,23 @@
    +/* Esperanto initialisation for the jQuery UI date picker plugin. */
    +/* Written by Olivier M. (olivierweb@ifrance.com). */
    +jQuery(function($){
    +	$.datepicker.regional['eo'] = {
    +		closeText: 'Fermi',
    +		prevText: '<Anta',
    +		nextText: 'Sekv>',
    +		currentText: 'Nuna',
    +		monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio',
    +		'Julio','Aŭgusto','Septembro','Oktobro','Novembro','Decembro'],
    +		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
    +		'Jul','Aŭg','Sep','Okt','Nov','Dec'],
    +		dayNames: ['Dimanĉo','Lundo','Mardo','Merkredo','Ĵaŭdo','Vendredo','Sabato'],
    +		dayNamesShort: ['Dim','Lun','Mar','Mer','Ĵaŭ','Ven','Sab'],
    +		dayNamesMin: ['Di','Lu','Ma','Me','Ĵa','Ve','Sa'],
    +		weekHeader: 'Sb',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['eo']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-es.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-es.js
    new file mode 100644
    index 000000000..763d4cedd
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-es.js
    @@ -0,0 +1,23 @@
    +/* Inicialización en español para la extensión 'UI date picker' para jQuery. */
    +/* Traducido por Vester (xvester@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['es'] = {
    +		closeText: 'Cerrar',
    +		prevText: '<Ant',
    +		nextText: 'Sig>',
    +		currentText: 'Hoy',
    +		monthNames: ['enero','febrero','marzo','abril','mayo','junio',
    +		'julio','agosto','septiembre','octubre','noviembre','diciembre'],
    +		monthNamesShort: ['ene','feb','mar','abr','may','jun',
    +		'jul','ogo','sep','oct','nov','dic'],
    +		dayNames: ['domingo','lunes','martes','miércoles','jueves','viernes','sábado'],
    +		dayNamesShort: ['dom','lun','mar','mié','juv','vie','sáb'],
    +		dayNamesMin: ['D','L','M','X','J','V','S'],
    +		weekHeader: 'Sm',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['es']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-et.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-et.js
    new file mode 100644
    index 000000000..62cbea8fa
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-et.js
    @@ -0,0 +1,23 @@
    +/* Estonian initialisation for the jQuery UI date picker plugin. */
    +/* Written by Mart Sõmermaa (mrts.pydev at gmail com). */
    +jQuery(function($){
    +	$.datepicker.regional['et'] = {
    +		closeText: 'Sulge',
    +		prevText: 'Eelnev',
    +		nextText: 'Järgnev',
    +		currentText: 'Täna',
    +		monthNames: ['Jaanuar','Veebruar','Märts','Aprill','Mai','Juuni',
    +		'Juuli','August','September','Oktoober','November','Detsember'],
    +		monthNamesShort: ['Jaan', 'Veebr', 'Märts', 'Apr', 'Mai', 'Juuni',
    +		'Juuli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dets'],
    +		dayNames: ['Pühapäev', 'Esmaspäev', 'Teisipäev', 'Kolmapäev', 'Neljapäev', 'Reede', 'Laupäev'],
    +		dayNamesShort: ['Pühap', 'Esmasp', 'Teisip', 'Kolmap', 'Neljap', 'Reede', 'Laup'],
    +		dayNamesMin: ['P','E','T','K','N','R','L'],
    +		weekHeader: 'näd',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['et']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-eu.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-eu.js
    new file mode 100644
    index 000000000..a71db2c72
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-eu.js
    @@ -0,0 +1,23 @@
    +/* Euskarako oinarria 'UI date picker' jquery-ko extentsioarentzat */
    +/* Karrikas-ek itzulia (karrikas@karrikas.com) */
    +jQuery(function($){
    +	$.datepicker.regional['eu'] = {
    +		closeText: 'Egina',
    +		prevText: '<Aur',
    +		nextText: 'Hur>',
    +		currentText: 'Gaur',
    +		monthNames: ['urtarrila','otsaila','martxoa','apirila','maiatza','ekaina',
    +			'uztaila','abuztua','iraila','urria','azaroa','abendua'],
    +		monthNamesShort: ['urt.','ots.','mar.','api.','mai.','eka.',
    +			'uzt.','abu.','ira.','urr.','aza.','abe.'],
    +		dayNames: ['igandea','astelehena','asteartea','asteazkena','osteguna','ostirala','larunbata'],
    +		dayNamesShort: ['ig.','al.','ar.','az.','og.','ol.','lr.'],
    +		dayNamesMin: ['ig','al','ar','az','og','ol','lr'],
    +		weekHeader: 'As',
    +		dateFormat: 'yy-mm-dd',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['eu']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-fa.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-fa.js
    new file mode 100644
    index 000000000..bb957f6d8
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-fa.js
    @@ -0,0 +1,59 @@
    +/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */
    +/* Javad Mowlanezhad -- jmowla@gmail.com */
    +/* Jalali calendar should supported soon! (Its implemented but I have to test it) */
    +jQuery(function($) {
    +	$.datepicker.regional['fa'] = {
    +		closeText: 'بستن',
    +		prevText: '<قبلی',
    +		nextText: 'بعدی>',
    +		currentText: 'امروز',
    +		monthNames: [
    +			'فروردين',
    +			'ارديبهشت',
    +			'خرداد',
    +			'تير',
    +			'مرداد',
    +			'شهريور',
    +			'مهر',
    +			'آبان',
    +			'آذر',
    +			'دی',
    +			'بهمن',
    +			'اسفند'
    +		],
    +		monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],
    +		dayNames: [
    +			'يکشنبه',
    +			'دوشنبه',
    +			'سه‌شنبه',
    +			'چهارشنبه',
    +			'پنجشنبه',
    +			'جمعه',
    +			'شنبه'
    +		],
    +		dayNamesShort: [
    +			'ی',
    +			'د',
    +			'س',
    +			'چ',
    +			'پ',
    +			'ج',
    +			'ش'
    +		],
    +		dayNamesMin: [
    +			'ی',
    +			'د',
    +			'س',
    +			'چ',
    +			'پ',
    +			'ج',
    +			'ش'
    +		],
    +		weekHeader: 'هف',
    +		dateFormat: 'yy/mm/dd',
    +		firstDay: 6,
    +		isRTL: true,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['fa']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-fi.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-fi.js
    new file mode 100644
    index 000000000..e5c554aba
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-fi.js
    @@ -0,0 +1,23 @@
    +/* Finnish initialisation for the jQuery UI date picker plugin. */
    +/* Written by Harri Kilpiö (harrikilpio@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['fi'] = {
    +		closeText: 'Sulje',
    +		prevText: '«Edellinen',
    +		nextText: 'Seuraava»',
    +		currentText: 'Tänään',
    +		monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kesäkuu',
    +		'Heinäkuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
    +		monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kesä',
    +		'Heinä','Elo','Syys','Loka','Marras','Joulu'],
    +		dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','La'],
    +		dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'],
    +		dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'],
    +		weekHeader: 'Vk',
    +		dateFormat: 'd.m.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['fi']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-fo.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-fo.js
    new file mode 100644
    index 000000000..cb0e3def7
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-fo.js
    @@ -0,0 +1,23 @@
    +/* Faroese initialisation for the jQuery UI date picker plugin */
    +/* Written by Sverri Mohr Olsen, sverrimo@gmail.com */
    +jQuery(function($){
    +	$.datepicker.regional['fo'] = {
    +		closeText: 'Lat aftur',
    +		prevText: '<Fyrra',
    +		nextText: 'Næsta>',
    +		currentText: 'Í dag',
    +		monthNames: ['Januar','Februar','Mars','Apríl','Mei','Juni',
    +		'Juli','August','September','Oktober','November','Desember'],
    +		monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
    +		'Jul','Aug','Sep','Okt','Nov','Des'],
    +		dayNames: ['Sunnudagur','Mánadagur','Týsdagur','Mikudagur','Hósdagur','Fríggjadagur','Leyardagur'],
    +		dayNamesShort: ['Sun','Mán','Týs','Mik','Hós','Frí','Ley'],
    +		dayNamesMin: ['Su','Má','Tý','Mi','Hó','Fr','Le'],
    +		weekHeader: 'Vk',
    +		dateFormat: 'dd-mm-yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['fo']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-fr-CA.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-fr-CA.js
    new file mode 100644
    index 000000000..e20822185
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-fr-CA.js
    @@ -0,0 +1,23 @@
    +/* Canadian-French initialisation for the jQuery UI date picker plugin. */
    +jQuery(function ($) {
    +	$.datepicker.regional['fr-CA'] = {
    +		closeText: 'Fermer',
    +		prevText: 'Précédent',
    +		nextText: 'Suivant',
    +		currentText: 'Aujourd\'hui',
    +		monthNames: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin',
    +			'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],
    +		monthNamesShort: ['janv.', 'févr.', 'mars', 'avril', 'mai', 'juin',
    +			'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],
    +		dayNames: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],
    +		dayNamesShort: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],
    +		dayNamesMin: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
    +		weekHeader: 'Sem.',
    +		dateFormat: 'yy-mm-dd',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''
    +	};
    +	$.datepicker.setDefaults($.datepicker.regional['fr-CA']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-fr-CH.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-fr-CH.js
    new file mode 100644
    index 000000000..744fe1c3d
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-fr-CH.js
    @@ -0,0 +1,23 @@
    +/* Swiss-French initialisation for the jQuery UI date picker plugin. */
    +/* Written Martin Voelkle (martin.voelkle@e-tc.ch). */
    +jQuery(function($){
    +	$.datepicker.regional['fr-CH'] = {
    +		closeText: 'Fermer',
    +		prevText: '<Préc',
    +		nextText: 'Suiv>',
    +		currentText: 'Courant',
    +		monthNames: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin',
    +			'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],
    +		monthNamesShort: ['janv.', 'févr.', 'mars', 'avril', 'mai', 'juin',
    +			'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],
    +		dayNames: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],
    +		dayNamesShort: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],
    +		dayNamesMin: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
    +		weekHeader: 'Sm',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['fr-CH']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-fr.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-fr.js
    new file mode 100644
    index 000000000..2d06743a6
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-fr.js
    @@ -0,0 +1,25 @@
    +/* French initialisation for the jQuery UI date picker plugin. */
    +/* Written by Keith Wood (kbwood{at}iinet.com.au),
    +			  Stéphane Nahmani (sholby@sholby.net),
    +			  Stéphane Raimbault  */
    +jQuery(function($){
    +	$.datepicker.regional['fr'] = {
    +		closeText: 'Fermer',
    +		prevText: 'Précédent',
    +		nextText: 'Suivant',
    +		currentText: 'Aujourd\'hui',
    +		monthNames: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin',
    +			'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],
    +		monthNamesShort: ['janv.', 'févr.', 'mars', 'avril', 'mai', 'juin',
    +			'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],
    +		dayNames: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],
    +		dayNamesShort: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],
    +		dayNamesMin: ['D','L','M','M','J','V','S'],
    +		weekHeader: 'Sem.',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['fr']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-gl.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-gl.js
    new file mode 100644
    index 000000000..59b989a6d
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-gl.js
    @@ -0,0 +1,23 @@
    +/* Galician localization for 'UI date picker' jQuery extension. */
    +/* Translated by Jorge Barreiro . */
    +jQuery(function($){
    +	$.datepicker.regional['gl'] = {
    +		closeText: 'Pechar',
    +		prevText: '<Ant',
    +		nextText: 'Seg>',
    +		currentText: 'Hoxe',
    +		monthNames: ['Xaneiro','Febreiro','Marzo','Abril','Maio','Xuño',
    +		'Xullo','Agosto','Setembro','Outubro','Novembro','Decembro'],
    +		monthNamesShort: ['Xan','Feb','Mar','Abr','Mai','Xuñ',
    +		'Xul','Ago','Set','Out','Nov','Dec'],
    +		dayNames: ['Domingo','Luns','Martes','Mércores','Xoves','Venres','Sábado'],
    +		dayNamesShort: ['Dom','Lun','Mar','Mér','Xov','Ven','Sáb'],
    +		dayNamesMin: ['Do','Lu','Ma','Mé','Xo','Ve','Sá'],
    +		weekHeader: 'Sm',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['gl']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-he.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-he.js
    new file mode 100644
    index 000000000..b9e8deec5
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-he.js
    @@ -0,0 +1,23 @@
    +/* Hebrew initialisation for the UI Datepicker extension. */
    +/* Written by Amir Hardon (ahardon at gmail dot com). */
    +jQuery(function($){
    +	$.datepicker.regional['he'] = {
    +		closeText: 'סגור',
    +		prevText: '<הקודם',
    +		nextText: 'הבא>',
    +		currentText: 'היום',
    +		monthNames: ['ינואר','פברואר','מרץ','אפריל','מאי','יוני',
    +		'יולי','אוגוסט','ספטמבר','אוקטובר','נובמבר','דצמבר'],
    +		monthNamesShort: ['ינו','פבר','מרץ','אפר','מאי','יוני',
    +		'יולי','אוג','ספט','אוק','נוב','דצמ'],
    +		dayNames: ['ראשון','שני','שלישי','רביעי','חמישי','שישי','שבת'],
    +		dayNamesShort: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'],
    +		dayNamesMin: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'],
    +		weekHeader: 'Wk',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 0,
    +		isRTL: true,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['he']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-hi.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-hi.js
    new file mode 100644
    index 000000000..6c563b997
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-hi.js
    @@ -0,0 +1,23 @@
    +/* Hindi initialisation for the jQuery UI date picker plugin. */
    +/* Written by Michael Dawart. */
    +jQuery(function($){
    +	$.datepicker.regional['hi'] = {
    +		closeText: 'बंद',
    +		prevText: 'पिछला',
    +		nextText: 'अगला',
    +		currentText: 'आज',
    +		monthNames: ['जनवरी ','फरवरी','मार्च','अप्रेल','मई','जून',
    +		'जूलाई','अगस्त ','सितम्बर','अक्टूबर','नवम्बर','दिसम्बर'],
    +		monthNamesShort: ['जन', 'फर', 'मार्च', 'अप्रेल', 'मई', 'जून',
    +		'जूलाई', 'अग', 'सित', 'अक्ट', 'नव', 'दि'],
    +		dayNames: ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'गुरुवार', 'शुक्रवार', 'शनिवार'],
    +		dayNamesShort: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'],
    +		dayNamesMin: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'],
    +		weekHeader: 'हफ्ता',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['hi']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-hr.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-hr.js
    new file mode 100644
    index 000000000..2fe37b64b
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-hr.js
    @@ -0,0 +1,23 @@
    +/* Croatian i18n for the jQuery UI date picker plugin. */
    +/* Written by Vjekoslav Nesek. */
    +jQuery(function($){
    +	$.datepicker.regional['hr'] = {
    +		closeText: 'Zatvori',
    +		prevText: '<',
    +		nextText: '>',
    +		currentText: 'Danas',
    +		monthNames: ['Siječanj','Veljača','Ožujak','Travanj','Svibanj','Lipanj',
    +		'Srpanj','Kolovoz','Rujan','Listopad','Studeni','Prosinac'],
    +		monthNamesShort: ['Sij','Velj','Ožu','Tra','Svi','Lip',
    +		'Srp','Kol','Ruj','Lis','Stu','Pro'],
    +		dayNames: ['Nedjelja','Ponedjeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'],
    +		dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'],
    +		dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
    +		weekHeader: 'Tje',
    +		dateFormat: 'dd.mm.yy.',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['hr']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-hu.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-hu.js
    new file mode 100644
    index 000000000..b28c268c1
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-hu.js
    @@ -0,0 +1,23 @@
    +/* Hungarian initialisation for the jQuery UI date picker plugin. */
    +/* Written by Istvan Karaszi (jquery@spam.raszi.hu). */
    +jQuery(function($){
    +	$.datepicker.regional['hu'] = {
    +		closeText: 'bezár',
    +		prevText: 'vissza',
    +		nextText: 'előre',
    +		currentText: 'ma',
    +		monthNames: ['Január', 'Február', 'Március', 'Április', 'Május', 'Június',
    +		'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'],
    +		monthNamesShort: ['Jan', 'Feb', 'Már', 'Ápr', 'Máj', 'Jún',
    +		'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'],
    +		dayNames: ['Vasárnap', 'Hétfő', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'],
    +		dayNamesShort: ['Vas', 'Hét', 'Ked', 'Sze', 'Csü', 'Pén', 'Szo'],
    +		dayNamesMin: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],
    +		weekHeader: 'Hét',
    +		dateFormat: 'yy.mm.dd.',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: true,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['hu']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-hy.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-hy.js
    new file mode 100644
    index 000000000..6d4eca555
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-hy.js
    @@ -0,0 +1,23 @@
    +/* Armenian(UTF-8) initialisation for the jQuery UI date picker plugin. */
    +/* Written by Levon Zakaryan (levon.zakaryan@gmail.com)*/
    +jQuery(function($){
    +	$.datepicker.regional['hy'] = {
    +		closeText: 'Փակել',
    +		prevText: '<Նախ.',
    +		nextText: 'Հաջ.>',
    +		currentText: 'Այսօր',
    +		monthNames: ['Հունվար','Փետրվար','Մարտ','Ապրիլ','Մայիս','Հունիս',
    +		'Հուլիս','Օգոստոս','Սեպտեմբեր','Հոկտեմբեր','Նոյեմբեր','Դեկտեմբեր'],
    +		monthNamesShort: ['Հունվ','Փետր','Մարտ','Ապր','Մայիս','Հունիս',
    +		'Հուլ','Օգս','Սեպ','Հոկ','Նոյ','Դեկ'],
    +		dayNames: ['կիրակի','եկուշաբթի','երեքշաբթի','չորեքշաբթի','հինգշաբթի','ուրբաթ','շաբաթ'],
    +		dayNamesShort: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'],
    +		dayNamesMin: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'],
    +		weekHeader: 'ՇԲՏ',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['hy']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-id.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-id.js
    new file mode 100644
    index 000000000..6327fa60c
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-id.js
    @@ -0,0 +1,23 @@
    +/* Indonesian initialisation for the jQuery UI date picker plugin. */
    +/* Written by Deden Fathurahman (dedenf@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['id'] = {
    +		closeText: 'Tutup',
    +		prevText: '<mundur',
    +		nextText: 'maju>',
    +		currentText: 'hari ini',
    +		monthNames: ['Januari','Februari','Maret','April','Mei','Juni',
    +		'Juli','Agustus','September','Oktober','Nopember','Desember'],
    +		monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
    +		'Jul','Agus','Sep','Okt','Nop','Des'],
    +		dayNames: ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu'],
    +		dayNamesShort: ['Min','Sen','Sel','Rab','kam','Jum','Sab'],
    +		dayNamesMin: ['Mg','Sn','Sl','Rb','Km','jm','Sb'],
    +		weekHeader: 'Mg',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['id']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-is.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-is.js
    new file mode 100644
    index 000000000..4fc429888
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-is.js
    @@ -0,0 +1,23 @@
    +/* Icelandic initialisation for the jQuery UI date picker plugin. */
    +/* Written by Haukur H. Thorsson (haukur@eskill.is). */
    +jQuery(function($){
    +	$.datepicker.regional['is'] = {
    +		closeText: 'Loka',
    +		prevText: '< Fyrri',
    +		nextText: 'Næsti >',
    +		currentText: 'Í dag',
    +		monthNames: ['Janúar','Febrúar','Mars','Apríl','Maí','Júní',
    +		'Júlí','Ágúst','September','Október','Nóvember','Desember'],
    +		monthNamesShort: ['Jan','Feb','Mar','Apr','Maí','Jún',
    +		'Júl','Ágú','Sep','Okt','Nóv','Des'],
    +		dayNames: ['Sunnudagur','Mánudagur','Þriðjudagur','Miðvikudagur','Fimmtudagur','Föstudagur','Laugardagur'],
    +		dayNamesShort: ['Sun','Mán','Þri','Mið','Fim','Fös','Lau'],
    +		dayNamesMin: ['Su','Má','Þr','Mi','Fi','Fö','La'],
    +		weekHeader: 'Vika',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['is']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-it.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-it.js
    new file mode 100644
    index 000000000..a01f043f8
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-it.js
    @@ -0,0 +1,23 @@
    +/* Italian initialisation for the jQuery UI date picker plugin. */
    +/* Written by Antonello Pasella (antonello.pasella@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['it'] = {
    +		closeText: 'Chiudi',
    +		prevText: '<Prec',
    +		nextText: 'Succ>',
    +		currentText: 'Oggi',
    +		monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno',
    +			'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'],
    +		monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu',
    +			'Lug','Ago','Set','Ott','Nov','Dic'],
    +		dayNames: ['Domenica','Lunedì','Martedì','Mercoledì','Giovedì','Venerdì','Sabato'],
    +		dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'],
    +		dayNamesMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'],
    +		weekHeader: 'Sm',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['it']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ja.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ja.js
    new file mode 100644
    index 000000000..4d0b63c77
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ja.js
    @@ -0,0 +1,23 @@
    +/* Japanese initialisation for the jQuery UI date picker plugin. */
    +/* Written by Kentaro SATO (kentaro@ranvis.com). */
    +jQuery(function($){
    +	$.datepicker.regional['ja'] = {
    +		closeText: '閉じる',
    +		prevText: '<前',
    +		nextText: '次>',
    +		currentText: '今日',
    +		monthNames: ['1月','2月','3月','4月','5月','6月',
    +		'7月','8月','9月','10月','11月','12月'],
    +		monthNamesShort: ['1月','2月','3月','4月','5月','6月',
    +		'7月','8月','9月','10月','11月','12月'],
    +		dayNames: ['日曜日','月曜日','火曜日','水曜日','木曜日','金曜日','土曜日'],
    +		dayNamesShort: ['日','月','火','水','木','金','土'],
    +		dayNamesMin: ['日','月','火','水','木','金','土'],
    +		weekHeader: '週',
    +		dateFormat: 'yy/mm/dd',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: true,
    +		yearSuffix: '年'};
    +	$.datepicker.setDefaults($.datepicker.regional['ja']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ka.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ka.js
    new file mode 100644
    index 000000000..c10658d79
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ka.js
    @@ -0,0 +1,21 @@
    +/* Georgian (UTF-8) initialisation for the jQuery UI date picker plugin. */
    +/* Written by Lado Lomidze (lado.lomidze@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['ka'] = {
    +		closeText: 'დახურვა',
    +		prevText: '< წინა',
    +		nextText: 'შემდეგი >',
    +		currentText: 'დღეს',
    +		monthNames: ['იანვარი','თებერვალი','მარტი','აპრილი','მაისი','ივნისი', 'ივლისი','აგვისტო','სექტემბერი','ოქტომბერი','ნოემბერი','დეკემბერი'],
    +		monthNamesShort: ['იან','თებ','მარ','აპრ','მაი','ივნ', 'ივლ','აგვ','სექ','ოქტ','ნოე','დეკ'],
    +		dayNames: ['კვირა','ორშაბათი','სამშაბათი','ოთხშაბათი','ხუთშაბათი','პარასკევი','შაბათი'],
    +		dayNamesShort: ['კვ','ორშ','სამ','ოთხ','ხუთ','პარ','შაბ'],
    +		dayNamesMin: ['კვ','ორშ','სამ','ოთხ','ხუთ','პარ','შაბ'],
    +		weekHeader: 'კვირა',
    +		dateFormat: 'dd-mm-yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['ka']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-kk.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-kk.js
    new file mode 100644
    index 000000000..dcd6a65df
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-kk.js
    @@ -0,0 +1,23 @@
    +/* Kazakh (UTF-8) initialisation for the jQuery UI date picker plugin. */
    +/* Written by Dmitriy Karasyov (dmitriy.karasyov@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['kk'] = {
    +		closeText: 'Жабу',
    +		prevText: '<Алдыңғы',
    +		nextText: 'Келесі>',
    +		currentText: 'Бүгін',
    +		monthNames: ['Қаңтар','Ақпан','Наурыз','Сәуір','Мамыр','Маусым',
    +		'Шілде','Тамыз','Қыркүйек','Қазан','Қараша','Желтоқсан'],
    +		monthNamesShort: ['Қаң','Ақп','Нау','Сәу','Мам','Мау',
    +		'Шіл','Там','Қыр','Қаз','Қар','Жел'],
    +		dayNames: ['Жексенбі','Дүйсенбі','Сейсенбі','Сәрсенбі','Бейсенбі','Жұма','Сенбі'],
    +		dayNamesShort: ['жкс','дсн','ссн','срс','бсн','жма','снб'],
    +		dayNamesMin: ['Жк','Дс','Сс','Ср','Бс','Жм','Сн'],
    +		weekHeader: 'Не',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['kk']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-km.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-km.js
    new file mode 100644
    index 000000000..f9c4e3a02
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-km.js
    @@ -0,0 +1,23 @@
    +/* Khmer initialisation for the jQuery calendar extension. */
    +/* Written by Chandara Om (chandara.teacher@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['km'] = {
    +		closeText: 'ធ្វើ​រួច',
    +		prevText: 'មុន',
    +		nextText: 'បន្ទាប់',
    +		currentText: 'ថ្ងៃ​នេះ',
    +		monthNames: ['មករា','កុម្ភៈ','មីនា','មេសា','ឧសភា','មិថុនា',
    +		'កក្កដា','សីហា','កញ្ញា','តុលា','វិច្ឆិកា','ធ្នូ'],
    +		monthNamesShort: ['មករា','កុម្ភៈ','មីនា','មេសា','ឧសភា','មិថុនា',
    +		'កក្កដា','សីហា','កញ្ញា','តុលា','វិច្ឆិកា','ធ្នូ'],
    +		dayNames: ['អាទិត្យ', 'ចន្ទ', 'អង្គារ', 'ពុធ', 'ព្រហស្បតិ៍', 'សុក្រ', 'សៅរ៍'],
    +		dayNamesShort: ['អា', 'ច', 'អ', 'ពុ', 'ព្រហ', 'សុ', 'សៅ'],
    +		dayNamesMin: ['អា', 'ច', 'អ', 'ពុ', 'ព្រហ', 'សុ', 'សៅ'],
    +		weekHeader: 'សប្ដាហ៍',
    +		dateFormat: 'dd-mm-yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['km']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ko.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ko.js
    new file mode 100644
    index 000000000..af36f3d6b
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ko.js
    @@ -0,0 +1,23 @@
    +/* Korean initialisation for the jQuery calendar extension. */
    +/* Written by DaeKwon Kang (ncrash.dk@gmail.com), Edited by Genie. */
    +jQuery(function($){
    +	$.datepicker.regional['ko'] = {
    +		closeText: '닫기',
    +		prevText: '이전달',
    +		nextText: '다음달',
    +		currentText: '오늘',
    +		monthNames: ['1월','2월','3월','4월','5월','6월',
    +		'7월','8월','9월','10월','11월','12월'],
    +		monthNamesShort: ['1월','2월','3월','4월','5월','6월',
    +		'7월','8월','9월','10월','11월','12월'],
    +		dayNames: ['일요일','월요일','화요일','수요일','목요일','금요일','토요일'],
    +		dayNamesShort: ['일','월','화','수','목','금','토'],
    +		dayNamesMin: ['일','월','화','수','목','금','토'],
    +		weekHeader: 'Wk',
    +		dateFormat: 'yy-mm-dd',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: true,
    +		yearSuffix: '년'};
    +	$.datepicker.setDefaults($.datepicker.regional['ko']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ky.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ky.js
    new file mode 100644
    index 000000000..d4466b12e
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ky.js
    @@ -0,0 +1,24 @@
    +/* Kyrgyz (UTF-8) initialisation for the jQuery UI date picker plugin. */
    +/* Written by Sergey Kartashov (ebishkek@yandex.ru). */
    +jQuery(function($){
    +	$.datepicker.regional['ky'] = {
    +		closeText: 'Жабуу',
    +		prevText: '<Мур',
    +		nextText: 'Кий>',
    +		currentText: 'Бүгүн',
    +		monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь',
    +		'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
    +		monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн',
    +		'Июл','Авг','Сен','Окт','Ноя','Дек'],
    +		dayNames: ['жекшемби', 'дүйшөмбү', 'шейшемби', 'шаршемби', 'бейшемби', 'жума', 'ишемби'],
    +		dayNamesShort: ['жек', 'дүй', 'шей', 'шар', 'бей', 'жум', 'ише'],
    +		dayNamesMin: ['Жк','Дш','Шш','Шр','Бш','Жм','Иш'],
    +		weekHeader: 'Жум',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''
    +	};
    +	$.datepicker.setDefaults($.datepicker.regional['ky']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-lb.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-lb.js
    new file mode 100644
    index 000000000..87c79d594
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-lb.js
    @@ -0,0 +1,23 @@
    +/* Luxembourgish initialisation for the jQuery UI date picker plugin. */
    +/* Written by Michel Weimerskirch  */
    +jQuery(function($){
    +	$.datepicker.regional['lb'] = {
    +		closeText: 'Fäerdeg',
    +		prevText: 'Zréck',
    +		nextText: 'Weider',
    +		currentText: 'Haut',
    +		monthNames: ['Januar','Februar','Mäerz','Abrëll','Mee','Juni',
    +		'Juli','August','September','Oktober','November','Dezember'],
    +		monthNamesShort: ['Jan', 'Feb', 'Mäe', 'Abr', 'Mee', 'Jun',
    +		'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],
    +		dayNames: ['Sonndeg', 'Méindeg', 'Dënschdeg', 'Mëttwoch', 'Donneschdeg', 'Freideg', 'Samschdeg'],
    +		dayNamesShort: ['Son', 'Méi', 'Dën', 'Mët', 'Don', 'Fre', 'Sam'],
    +		dayNamesMin: ['So','Mé','Dë','Më','Do','Fr','Sa'],
    +		weekHeader: 'W',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['lb']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-lt.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-lt.js
    new file mode 100644
    index 000000000..54eb523b3
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-lt.js
    @@ -0,0 +1,23 @@
    +/* Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. */
    +/* @author Arturas Paleicikas  */
    +jQuery(function($){
    +	$.datepicker.regional['lt'] = {
    +		closeText: 'Uždaryti',
    +		prevText: '<Atgal',
    +		nextText: 'Pirmyn>',
    +		currentText: 'Šiandien',
    +		monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis',
    +		'Liepa','Rugpjūtis','Rugsėjis','Spalis','Lapkritis','Gruodis'],
    +		monthNamesShort: ['Sau','Vas','Kov','Bal','Geg','Bir',
    +		'Lie','Rugp','Rugs','Spa','Lap','Gru'],
    +		dayNames: ['sekmadienis','pirmadienis','antradienis','trečiadienis','ketvirtadienis','penktadienis','šeštadienis'],
    +		dayNamesShort: ['sek','pir','ant','tre','ket','pen','šeš'],
    +		dayNamesMin: ['Se','Pr','An','Tr','Ke','Pe','Še'],
    +		weekHeader: 'SAV',
    +		dateFormat: 'yy-mm-dd',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: true,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['lt']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-lv.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-lv.js
    new file mode 100644
    index 000000000..3fdf8565b
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-lv.js
    @@ -0,0 +1,23 @@
    +/* Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. */
    +/* @author Arturas Paleicikas  */
    +jQuery(function($){
    +	$.datepicker.regional['lv'] = {
    +		closeText: 'Aizvērt',
    +		prevText: 'Iepr.',
    +		nextText: 'Nāk.',
    +		currentText: 'Šodien',
    +		monthNames: ['Janvāris','Februāris','Marts','Aprīlis','Maijs','Jūnijs',
    +		'Jūlijs','Augusts','Septembris','Oktobris','Novembris','Decembris'],
    +		monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jūn',
    +		'Jūl','Aug','Sep','Okt','Nov','Dec'],
    +		dayNames: ['svētdiena','pirmdiena','otrdiena','trešdiena','ceturtdiena','piektdiena','sestdiena'],
    +		dayNamesShort: ['svt','prm','otr','tre','ctr','pkt','sst'],
    +		dayNamesMin: ['Sv','Pr','Ot','Tr','Ct','Pk','Ss'],
    +		weekHeader: 'Ned.',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['lv']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-mk.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-mk.js
    new file mode 100644
    index 000000000..028532551
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-mk.js
    @@ -0,0 +1,23 @@
    +/* Macedonian i18n for the jQuery UI date picker plugin. */
    +/* Written by Stojce Slavkovski. */
    +jQuery(function($){
    +	$.datepicker.regional['mk'] = {
    +		closeText: 'Затвори',
    +		prevText: '<',
    +		nextText: '>',
    +		currentText: 'Денес',
    +		monthNames: ['Јануари','Февруари','Март','Април','Мај','Јуни',
    +		'Јули','Август','Септември','Октомври','Ноември','Декември'],
    +		monthNamesShort: ['Јан','Фев','Мар','Апр','Мај','Јун',
    +		'Јул','Авг','Сеп','Окт','Ное','Дек'],
    +		dayNames: ['Недела','Понеделник','Вторник','Среда','Четврток','Петок','Сабота'],
    +		dayNamesShort: ['Нед','Пон','Вто','Сре','Чет','Пет','Саб'],
    +		dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Са'],
    +		weekHeader: 'Сед',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['mk']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ml.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ml.js
    new file mode 100644
    index 000000000..9b8f460db
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ml.js
    @@ -0,0 +1,23 @@
    +/* Malayalam (UTF-8) initialisation for the jQuery UI date picker plugin. */
    +/* Written by Saji Nediyanchath (saji89@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['ml'] = {
    +		closeText: 'ശരി',
    +		prevText: 'മുന്നത്തെ',
    +		nextText: 'അടുത്തത് ',
    +		currentText: 'ഇന്ന്',
    +		monthNames: ['ജനുവരി','ഫെബ്രുവരി','മാര്‍ച്ച്','ഏപ്രില്‍','മേയ്','ജൂണ്‍',
    +		'ജൂലൈ','ആഗസ്റ്റ്','സെപ്റ്റംബര്‍','ഒക്ടോബര്‍','നവംബര്‍','ഡിസംബര്‍'],
    +		monthNamesShort: ['ജനു', 'ഫെബ്', 'മാര്‍', 'ഏപ്രി', 'മേയ്', 'ജൂണ്‍',
    +		'ജൂലാ', 'ആഗ', 'സെപ്', 'ഒക്ടോ', 'നവം', 'ഡിസ'],
    +		dayNames: ['ഞായര്‍', 'തിങ്കള്‍', 'ചൊവ്വ', 'ബുധന്‍', 'വ്യാഴം', 'വെള്ളി', 'ശനി'],
    +		dayNamesShort: ['ഞായ', 'തിങ്ക', 'ചൊവ്വ', 'ബുധ', 'വ്യാഴം', 'വെള്ളി', 'ശനി'],
    +		dayNamesMin: ['ഞാ','തി','ചൊ','ബു','വ്യാ','വെ','ശ'],
    +		weekHeader: 'ആ',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['ml']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ms.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ms.js
    new file mode 100644
    index 000000000..e70de7299
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ms.js
    @@ -0,0 +1,23 @@
    +/* Malaysian initialisation for the jQuery UI date picker plugin. */
    +/* Written by Mohd Nawawi Mohamad Jamili (nawawi@ronggeng.net). */
    +jQuery(function($){
    +	$.datepicker.regional['ms'] = {
    +		closeText: 'Tutup',
    +		prevText: '<Sebelum',
    +		nextText: 'Selepas>',
    +		currentText: 'hari ini',
    +		monthNames: ['Januari','Februari','Mac','April','Mei','Jun',
    +		'Julai','Ogos','September','Oktober','November','Disember'],
    +		monthNamesShort: ['Jan','Feb','Mac','Apr','Mei','Jun',
    +		'Jul','Ogo','Sep','Okt','Nov','Dis'],
    +		dayNames: ['Ahad','Isnin','Selasa','Rabu','Khamis','Jumaat','Sabtu'],
    +		dayNamesShort: ['Aha','Isn','Sel','Rab','kha','Jum','Sab'],
    +		dayNamesMin: ['Ah','Is','Se','Ra','Kh','Ju','Sa'],
    +		weekHeader: 'Mg',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['ms']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-nb.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-nb.js
    new file mode 100644
    index 000000000..845a5052d
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-nb.js
    @@ -0,0 +1,22 @@
    +/* Norwegian Bokmål initialisation for the jQuery UI date picker plugin. */
    +/* Written by Bjørn Johansen (post@bjornjohansen.no). */
    +jQuery(function($){
    +	$.datepicker.regional['nb'] = {
    +		closeText: 'Lukk',
    +		prevText: '«Forrige',
    +		nextText: 'Neste»',
    +		currentText: 'I dag',
    +		monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'],
    +		monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'],
    +		dayNamesShort: ['søn','man','tir','ons','tor','fre','lør'],
    +		dayNames: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'],
    +		dayNamesMin: ['sø','ma','ti','on','to','fr','lø'],
    +		weekHeader: 'Uke',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''
    +	};
    +	$.datepicker.setDefaults($.datepicker.regional['nb']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-nl-BE.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-nl-BE.js
    new file mode 100644
    index 000000000..7b3cdf425
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-nl-BE.js
    @@ -0,0 +1,23 @@
    +/* Dutch (Belgium) initialisation for the jQuery UI date picker plugin. */
    +/* David De Sloovere @DavidDeSloovere */
    +jQuery(function($){
    +	$.datepicker.regional['nl-BE'] = {
    +		closeText: 'Sluiten',
    +		prevText: '←',
    +		nextText: '→',
    +		currentText: 'Vandaag',
    +		monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',
    +		'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
    +		monthNamesShort: ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun',
    +		'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
    +		dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
    +		dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],
    +		dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
    +		weekHeader: 'Wk',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['nl-BE']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-nl.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-nl.js
    new file mode 100644
    index 000000000..203f16069
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-nl.js
    @@ -0,0 +1,23 @@
    +/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */
    +/* Written by Mathias Bynens  */
    +jQuery(function($){
    +	$.datepicker.regional.nl = {
    +		closeText: 'Sluiten',
    +		prevText: '←',
    +		nextText: '→',
    +		currentText: 'Vandaag',
    +		monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',
    +		'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
    +		monthNamesShort: ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun',
    +		'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
    +		dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
    +		dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],
    +		dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
    +		weekHeader: 'Wk',
    +		dateFormat: 'dd-mm-yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional.nl);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-nn.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-nn.js
    new file mode 100644
    index 000000000..b55245ee6
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-nn.js
    @@ -0,0 +1,22 @@
    +/* Norwegian Nynorsk initialisation for the jQuery UI date picker plugin. */
    +/* Written by Bjørn Johansen (post@bjornjohansen.no). */
    +jQuery(function($){
    +	$.datepicker.regional['nn'] = {
    +		closeText: 'Lukk',
    +		prevText: '«Førre',
    +		nextText: 'Neste»',
    +		currentText: 'I dag',
    +		monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'],
    +		monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'],
    +		dayNamesShort: ['sun','mån','tys','ons','tor','fre','lau'],
    +		dayNames: ['sundag','måndag','tysdag','onsdag','torsdag','fredag','laurdag'],
    +		dayNamesMin: ['su','må','ty','on','to','fr','la'],
    +		weekHeader: 'Veke',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''
    +	};
    +	$.datepicker.setDefaults($.datepicker.regional['nn']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-no.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-no.js
    new file mode 100644
    index 000000000..d36e430be
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-no.js
    @@ -0,0 +1,23 @@
    +/* Norwegian initialisation for the jQuery UI date picker plugin. */
    +/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */
    +
    +jQuery(function($){
    +	$.datepicker.regional['no'] = {
    +		closeText: 'Lukk',
    +		prevText: '«Forrige',
    +		nextText: 'Neste»',
    +		currentText: 'I dag',
    +		monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'],
    +		monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'],
    +		dayNamesShort: ['søn','man','tir','ons','tor','fre','lør'],
    +		dayNames: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'],
    +		dayNamesMin: ['sø','ma','ti','on','to','fr','lø'],
    +		weekHeader: 'Uke',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''
    +	};
    +	$.datepicker.setDefaults($.datepicker.regional['no']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-pl.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-pl.js
    new file mode 100644
    index 000000000..0ffc515b9
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-pl.js
    @@ -0,0 +1,23 @@
    +/* Polish initialisation for the jQuery UI date picker plugin. */
    +/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['pl'] = {
    +		closeText: 'Zamknij',
    +		prevText: '<Poprzedni',
    +		nextText: 'Następny>',
    +		currentText: 'Dziś',
    +		monthNames: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec',
    +		'Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'],
    +		monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze',
    +		'Lip','Sie','Wrz','Pa','Lis','Gru'],
    +		dayNames: ['Niedziela','Poniedziałek','Wtorek','Środa','Czwartek','Piątek','Sobota'],
    +		dayNamesShort: ['Nie','Pn','Wt','Śr','Czw','Pt','So'],
    +		dayNamesMin: ['N','Pn','Wt','Śr','Cz','Pt','So'],
    +		weekHeader: 'Tydz',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['pl']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-pt-BR.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-pt-BR.js
    new file mode 100644
    index 000000000..521967ec3
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-pt-BR.js
    @@ -0,0 +1,23 @@
    +/* Brazilian initialisation for the jQuery UI date picker plugin. */
    +/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['pt-BR'] = {
    +		closeText: 'Fechar',
    +		prevText: '<Anterior',
    +		nextText: 'Próximo>',
    +		currentText: 'Hoje',
    +		monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho',
    +		'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
    +		monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
    +		'Jul','Ago','Set','Out','Nov','Dez'],
    +		dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'],
    +		dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
    +		dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
    +		weekHeader: 'Sm',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['pt-BR']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-pt.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-pt.js
    new file mode 100644
    index 000000000..4fb16f032
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-pt.js
    @@ -0,0 +1,22 @@
    +/* Portuguese initialisation for the jQuery UI date picker plugin. */
    +jQuery(function($){
    +	$.datepicker.regional['pt'] = {
    +		closeText: 'Fechar',
    +		prevText: 'Anterior',
    +		nextText: 'Seguinte',
    +		currentText: 'Hoje',
    +		monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho',
    +		'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
    +		monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
    +		'Jul','Ago','Set','Out','Nov','Dez'],
    +		dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'],
    +		dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
    +		dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
    +		weekHeader: 'Sem',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['pt']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-rm.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-rm.js
    new file mode 100644
    index 000000000..22ed21685
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-rm.js
    @@ -0,0 +1,21 @@
    +/* Romansh initialisation for the jQuery UI date picker plugin. */
    +/* Written by Yvonne Gienal (yvonne.gienal@educa.ch). */
    +jQuery(function($){
    +	$.datepicker.regional['rm'] = {
    +		closeText: 'Serrar',
    +		prevText: '<Suandant',
    +		nextText: 'Precedent>',
    +		currentText: 'Actual',
    +		monthNames: ['Schaner','Favrer','Mars','Avrigl','Matg','Zercladur', 'Fanadur','Avust','Settember','October','November','December'],
    +		monthNamesShort: ['Scha','Fev','Mar','Avr','Matg','Zer', 'Fan','Avu','Sett','Oct','Nov','Dec'],
    +		dayNames: ['Dumengia','Glindesdi','Mardi','Mesemna','Gievgia','Venderdi','Sonda'],
    +		dayNamesShort: ['Dum','Gli','Mar','Mes','Gie','Ven','Som'],
    +		dayNamesMin: ['Du','Gl','Ma','Me','Gi','Ve','So'],
    +		weekHeader: 'emna',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['rm']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ro.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ro.js
    new file mode 100644
    index 000000000..a988270d7
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ro.js
    @@ -0,0 +1,26 @@
    +/* Romanian initialisation for the jQuery UI date picker plugin.
    + *
    + * Written by Edmond L. (ll_edmond@walla.com)
    + * and Ionut G. Stan (ionut.g.stan@gmail.com)
    + */
    +jQuery(function($){
    +	$.datepicker.regional['ro'] = {
    +		closeText: 'Închide',
    +		prevText: '« Luna precedentă',
    +		nextText: 'Luna următoare »',
    +		currentText: 'Azi',
    +		monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie',
    +		'Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'],
    +		monthNamesShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun',
    +		'Iul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
    +		dayNames: ['Duminică', 'Luni', 'Marţi', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă'],
    +		dayNamesShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'],
    +		dayNamesMin: ['Du','Lu','Ma','Mi','Jo','Vi','Sâ'],
    +		weekHeader: 'Săpt',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['ro']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ru.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ru.js
    new file mode 100644
    index 000000000..a51971405
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ru.js
    @@ -0,0 +1,23 @@
    +/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */
    +/* Written by Andrew Stromnov (stromnov@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['ru'] = {
    +		closeText: 'Закрыть',
    +		prevText: '<Пред',
    +		nextText: 'След>',
    +		currentText: 'Сегодня',
    +		monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь',
    +		'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
    +		monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн',
    +		'Июл','Авг','Сен','Окт','Ноя','Дек'],
    +		dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'],
    +		dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'],
    +		dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'],
    +		weekHeader: 'Нед',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['ru']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-sk.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-sk.js
    new file mode 100644
    index 000000000..0cb76c4e8
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-sk.js
    @@ -0,0 +1,23 @@
    +/* Slovak initialisation for the jQuery UI date picker plugin. */
    +/* Written by Vojtech Rinik (vojto@hmm.sk). */
    +jQuery(function($){
    +	$.datepicker.regional['sk'] = {
    +		closeText: 'Zavrieť',
    +		prevText: '<Predchádzajúci',
    +		nextText: 'Nasledujúci>',
    +		currentText: 'Dnes',
    +		monthNames: ['január','február','marec','apríl','máj','jún',
    +		'júl','august','september','október','november','december'],
    +		monthNamesShort: ['Jan','Feb','Mar','Apr','Máj','Jún',
    +		'Júl','Aug','Sep','Okt','Nov','Dec'],
    +		dayNames: ['nedeľa','pondelok','utorok','streda','štvrtok','piatok','sobota'],
    +		dayNamesShort: ['Ned','Pon','Uto','Str','Štv','Pia','Sob'],
    +		dayNamesMin: ['Ne','Po','Ut','St','Št','Pia','So'],
    +		weekHeader: 'Ty',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['sk']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-sl.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-sl.js
    new file mode 100644
    index 000000000..048a47af7
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-sl.js
    @@ -0,0 +1,24 @@
    +/* Slovenian initialisation for the jQuery UI date picker plugin. */
    +/* Written by Jaka Jancar (jaka@kubje.org). */
    +/* c = č, s = š z = ž C = Č S = Š Z = Ž */
    +jQuery(function($){
    +	$.datepicker.regional['sl'] = {
    +		closeText: 'Zapri',
    +		prevText: '<Prejšnji',
    +		nextText: 'Naslednji>',
    +		currentText: 'Trenutni',
    +		monthNames: ['Januar','Februar','Marec','April','Maj','Junij',
    +		'Julij','Avgust','September','Oktober','November','December'],
    +		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
    +		'Jul','Avg','Sep','Okt','Nov','Dec'],
    +		dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','Četrtek','Petek','Sobota'],
    +		dayNamesShort: ['Ned','Pon','Tor','Sre','Čet','Pet','Sob'],
    +		dayNamesMin: ['Ne','Po','To','Sr','Če','Pe','So'],
    +		weekHeader: 'Teden',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['sl']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-sq.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-sq.js
    new file mode 100644
    index 000000000..d6086a789
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-sq.js
    @@ -0,0 +1,23 @@
    +/* Albanian initialisation for the jQuery UI date picker plugin. */
    +/* Written by Flakron Bytyqi (flakron@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['sq'] = {
    +		closeText: 'mbylle',
    +		prevText: '<mbrapa',
    +		nextText: 'Përpara>',
    +		currentText: 'sot',
    +		monthNames: ['Janar','Shkurt','Mars','Prill','Maj','Qershor',
    +		'Korrik','Gusht','Shtator','Tetor','Nëntor','Dhjetor'],
    +		monthNamesShort: ['Jan','Shk','Mar','Pri','Maj','Qer',
    +		'Kor','Gus','Sht','Tet','Nën','Dhj'],
    +		dayNames: ['E Diel','E Hënë','E Martë','E Mërkurë','E Enjte','E Premte','E Shtune'],
    +		dayNamesShort: ['Di','Hë','Ma','Më','En','Pr','Sh'],
    +		dayNamesMin: ['Di','Hë','Ma','Më','En','Pr','Sh'],
    +		weekHeader: 'Ja',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['sq']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-sr-SR.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-sr-SR.js
    new file mode 100644
    index 000000000..810d21daa
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-sr-SR.js
    @@ -0,0 +1,23 @@
    +/* Serbian i18n for the jQuery UI date picker plugin. */
    +/* Written by Dejan Dimić. */
    +jQuery(function($){
    +	$.datepicker.regional['sr-SR'] = {
    +		closeText: 'Zatvori',
    +		prevText: '<',
    +		nextText: '>',
    +		currentText: 'Danas',
    +		monthNames: ['Januar','Februar','Mart','April','Maj','Jun',
    +		'Jul','Avgust','Septembar','Oktobar','Novembar','Decembar'],
    +		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
    +		'Jul','Avg','Sep','Okt','Nov','Dec'],
    +		dayNames: ['Nedelja','Ponedeljak','Utorak','Sreda','Četvrtak','Petak','Subota'],
    +		dayNamesShort: ['Ned','Pon','Uto','Sre','Čet','Pet','Sub'],
    +		dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
    +		weekHeader: 'Sed',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['sr-SR']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-sr.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-sr.js
    new file mode 100644
    index 000000000..1349a26cf
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-sr.js
    @@ -0,0 +1,23 @@
    +/* Serbian i18n for the jQuery UI date picker plugin. */
    +/* Written by Dejan Dimić. */
    +jQuery(function($){
    +	$.datepicker.regional['sr'] = {
    +		closeText: 'Затвори',
    +		prevText: '<',
    +		nextText: '>',
    +		currentText: 'Данас',
    +		monthNames: ['Јануар','Фебруар','Март','Април','Мај','Јун',
    +		'Јул','Август','Септембар','Октобар','Новембар','Децембар'],
    +		monthNamesShort: ['Јан','Феб','Мар','Апр','Мај','Јун',
    +		'Јул','Авг','Сеп','Окт','Нов','Дец'],
    +		dayNames: ['Недеља','Понедељак','Уторак','Среда','Четвртак','Петак','Субота'],
    +		dayNamesShort: ['Нед','Пон','Уто','Сре','Чет','Пет','Суб'],
    +		dayNamesMin: ['Не','По','Ут','Ср','Че','Пе','Су'],
    +		weekHeader: 'Сед',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['sr']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-sv.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-sv.js
    new file mode 100644
    index 000000000..cbb5ad135
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-sv.js
    @@ -0,0 +1,23 @@
    +/* Swedish initialisation for the jQuery UI date picker plugin. */
    +/* Written by Anders Ekdahl ( anders@nomadiz.se). */
    +jQuery(function($){
    +	$.datepicker.regional['sv'] = {
    +		closeText: 'Stäng',
    +		prevText: '«Förra',
    +		nextText: 'Nästa»',
    +		currentText: 'Idag',
    +		monthNames: ['Januari','Februari','Mars','April','Maj','Juni',
    +		'Juli','Augusti','September','Oktober','November','December'],
    +		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
    +		'Jul','Aug','Sep','Okt','Nov','Dec'],
    +		dayNamesShort: ['Sön','Mån','Tis','Ons','Tor','Fre','Lör'],
    +		dayNames: ['Söndag','Måndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'],
    +		dayNamesMin: ['Sö','Må','Ti','On','To','Fr','Lö'],
    +		weekHeader: 'Ve',
    +		dateFormat: 'yy-mm-dd',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['sv']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ta.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ta.js
    new file mode 100644
    index 000000000..40431ed8e
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-ta.js
    @@ -0,0 +1,23 @@
    +/* Tamil (UTF-8) initialisation for the jQuery UI date picker plugin. */
    +/* Written by S A Sureshkumar (saskumar@live.com). */
    +jQuery(function($){
    +	$.datepicker.regional['ta'] = {
    +		closeText: 'மூடு',
    +		prevText: 'முன்னையது',
    +		nextText: 'அடுத்தது',
    +		currentText: 'இன்று',
    +		monthNames: ['தை','மாசி','பங்குனி','சித்திரை','வைகாசி','ஆனி',
    +		'ஆடி','ஆவணி','புரட்டாசி','ஐப்பசி','கார்த்திகை','மார்கழி'],
    +		monthNamesShort: ['தை','மாசி','பங்','சித்','வைகா','ஆனி',
    +		'ஆடி','ஆவ','புர','ஐப்','கார்','மார்'],
    +		dayNames: ['ஞாயிற்றுக்கிழமை','திங்கட்கிழமை','செவ்வாய்க்கிழமை','புதன்கிழமை','வியாழக்கிழமை','வெள்ளிக்கிழமை','சனிக்கிழமை'],
    +		dayNamesShort: ['ஞாயிறு','திங்கள்','செவ்வாய்','புதன்','வியாழன்','வெள்ளி','சனி'],
    +		dayNamesMin: ['ஞா','தி','செ','பு','வி','வெ','ச'],
    +		weekHeader: 'Не',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['ta']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-th.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-th.js
    new file mode 100644
    index 000000000..aecfd27cc
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-th.js
    @@ -0,0 +1,23 @@
    +/* Thai initialisation for the jQuery UI date picker plugin. */
    +/* Written by pipo (pipo@sixhead.com). */
    +jQuery(function($){
    +	$.datepicker.regional['th'] = {
    +		closeText: 'ปิด',
    +		prevText: '« ย้อน',
    +		nextText: 'ถัดไป »',
    +		currentText: 'วันนี้',
    +		monthNames: ['มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน',
    +		'กรกฎาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม'],
    +		monthNamesShort: ['ม.ค.','ก.พ.','มี.ค.','เม.ย.','พ.ค.','มิ.ย.',
    +		'ก.ค.','ส.ค.','ก.ย.','ต.ค.','พ.ย.','ธ.ค.'],
    +		dayNames: ['อาทิตย์','จันทร์','อังคาร','พุธ','พฤหัสบดี','ศุกร์','เสาร์'],
    +		dayNamesShort: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'],
    +		dayNamesMin: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'],
    +		weekHeader: 'Wk',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['th']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-tj.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-tj.js
    new file mode 100644
    index 000000000..9a20e4d37
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-tj.js
    @@ -0,0 +1,23 @@
    +/* Tajiki (UTF-8) initialisation for the jQuery UI date picker plugin. */
    +/* Written by Abdurahmon Saidov (saidovab@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['tj'] = {
    +		closeText: 'Идома',
    +		prevText: '<Қафо',
    +		nextText: 'Пеш>',
    +		currentText: 'Имрӯз',
    +		monthNames: ['Январ','Феврал','Март','Апрел','Май','Июн',
    +		'Июл','Август','Сентябр','Октябр','Ноябр','Декабр'],
    +		monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн',
    +		'Июл','Авг','Сен','Окт','Ноя','Дек'],
    +		dayNames: ['якшанбе','душанбе','сешанбе','чоршанбе','панҷшанбе','ҷумъа','шанбе'],
    +		dayNamesShort: ['якш','душ','сеш','чор','пан','ҷум','шан'],
    +		dayNamesMin: ['Як','Дш','Сш','Чш','Пш','Ҷм','Шн'],
    +		weekHeader: 'Хф',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['tj']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-tr.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-tr.js
    new file mode 100644
    index 000000000..75b583a77
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-tr.js
    @@ -0,0 +1,23 @@
    +/* Turkish initialisation for the jQuery UI date picker plugin. */
    +/* Written by Izzet Emre Erkan (kara@karalamalar.net). */
    +jQuery(function($){
    +	$.datepicker.regional['tr'] = {
    +		closeText: 'kapat',
    +		prevText: '<geri',
    +		nextText: 'ileri>',
    +		currentText: 'bugün',
    +		monthNames: ['Ocak','Şubat','Mart','Nisan','Mayıs','Haziran',
    +		'Temmuz','Ağustos','Eylül','Ekim','Kasım','Aralık'],
    +		monthNamesShort: ['Oca','Şub','Mar','Nis','May','Haz',
    +		'Tem','Ağu','Eyl','Eki','Kas','Ara'],
    +		dayNames: ['Pazar','Pazartesi','Salı','Çarşamba','Perşembe','Cuma','Cumartesi'],
    +		dayNamesShort: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'],
    +		dayNamesMin: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'],
    +		weekHeader: 'Hf',
    +		dateFormat: 'dd.mm.yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['tr']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-uk.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-uk.js
    new file mode 100644
    index 000000000..2bdc82ff7
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-uk.js
    @@ -0,0 +1,24 @@
    +/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */
    +/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */
    +/* Corrected by Igor Milla (igor.fsp.milla@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['uk'] = {
    +		closeText: 'Закрити',
    +		prevText: '<',
    +		nextText: '>',
    +		currentText: 'Сьогодні',
    +		monthNames: ['Січень','Лютий','Березень','Квітень','Травень','Червень',
    +		'Липень','Серпень','Вересень','Жовтень','Листопад','Грудень'],
    +		monthNamesShort: ['Січ','Лют','Бер','Кві','Тра','Чер',
    +		'Лип','Сер','Вер','Жов','Лис','Гру'],
    +		dayNames: ['неділя','понеділок','вівторок','середа','четвер','п’ятниця','субота'],
    +		dayNamesShort: ['нед','пнд','вів','срд','чтв','птн','сбт'],
    +		dayNamesMin: ['Нд','Пн','Вт','Ср','Чт','Пт','Сб'],
    +		weekHeader: 'Тиж',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['uk']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-vi.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-vi.js
    new file mode 100644
    index 000000000..b49e7eb13
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-vi.js
    @@ -0,0 +1,23 @@
    +/* Vietnamese initialisation for the jQuery UI date picker plugin. */
    +/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */
    +jQuery(function($){
    +	$.datepicker.regional['vi'] = {
    +		closeText: 'Đóng',
    +		prevText: '<Trước',
    +		nextText: 'Tiếp>',
    +		currentText: 'Hôm nay',
    +		monthNames: ['Tháng Một', 'Tháng Hai', 'Tháng Ba', 'Tháng Tư', 'Tháng Năm', 'Tháng Sáu',
    +		'Tháng Bảy', 'Tháng Tám', 'Tháng Chín', 'Tháng Mười', 'Tháng Mười Một', 'Tháng Mười Hai'],
    +		monthNamesShort: ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6',
    +		'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'],
    +		dayNames: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'],
    +		dayNamesShort: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
    +		dayNamesMin: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
    +		weekHeader: 'Tu',
    +		dateFormat: 'dd/mm/yy',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: false,
    +		yearSuffix: ''};
    +	$.datepicker.setDefaults($.datepicker.regional['vi']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-zh-CN.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-zh-CN.js
    new file mode 100644
    index 000000000..d337e4a99
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-zh-CN.js
    @@ -0,0 +1,23 @@
    +/* Chinese initialisation for the jQuery UI date picker plugin. */
    +/* Written by Cloudream (cloudream@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['zh-CN'] = {
    +		closeText: '关闭',
    +		prevText: '<上月',
    +		nextText: '下月>',
    +		currentText: '今天',
    +		monthNames: ['一月','二月','三月','四月','五月','六月',
    +		'七月','八月','九月','十月','十一月','十二月'],
    +		monthNamesShort: ['一月','二月','三月','四月','五月','六月',
    +		'七月','八月','九月','十月','十一月','十二月'],
    +		dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
    +		dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
    +		dayNamesMin: ['日','一','二','三','四','五','六'],
    +		weekHeader: '周',
    +		dateFormat: 'yy-mm-dd',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: true,
    +		yearSuffix: '年'};
    +	$.datepicker.setDefaults($.datepicker.regional['zh-CN']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-zh-HK.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-zh-HK.js
    new file mode 100644
    index 000000000..ef6f4e715
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-zh-HK.js
    @@ -0,0 +1,23 @@
    +/* Chinese initialisation for the jQuery UI date picker plugin. */
    +/* Written by SCCY (samuelcychan@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['zh-HK'] = {
    +		closeText: '關閉',
    +		prevText: '<上月',
    +		nextText: '下月>',
    +		currentText: '今天',
    +		monthNames: ['一月','二月','三月','四月','五月','六月',
    +		'七月','八月','九月','十月','十一月','十二月'],
    +		monthNamesShort: ['一月','二月','三月','四月','五月','六月',
    +		'七月','八月','九月','十月','十一月','十二月'],
    +		dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
    +		dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
    +		dayNamesMin: ['日','一','二','三','四','五','六'],
    +		weekHeader: '周',
    +		dateFormat: 'dd-mm-yy',
    +		firstDay: 0,
    +		isRTL: false,
    +		showMonthAfterYear: true,
    +		yearSuffix: '年'};
    +	$.datepicker.setDefaults($.datepicker.regional['zh-HK']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-zh-TW.js b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-zh-TW.js
    new file mode 100644
    index 000000000..b9105ea50
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/i18n/jquery.ui.datepicker-zh-TW.js
    @@ -0,0 +1,23 @@
    +/* Chinese initialisation for the jQuery UI date picker plugin. */
    +/* Written by Ressol (ressol@gmail.com). */
    +jQuery(function($){
    +	$.datepicker.regional['zh-TW'] = {
    +		closeText: '關閉',
    +		prevText: '<上月',
    +		nextText: '下月>',
    +		currentText: '今天',
    +		monthNames: ['一月','二月','三月','四月','五月','六月',
    +		'七月','八月','九月','十月','十一月','十二月'],
    +		monthNamesShort: ['一月','二月','三月','四月','五月','六月',
    +		'七月','八月','九月','十月','十一月','十二月'],
    +		dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
    +		dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
    +		dayNamesMin: ['日','一','二','三','四','五','六'],
    +		weekHeader: '周',
    +		dateFormat: 'yy/mm/dd',
    +		firstDay: 1,
    +		isRTL: false,
    +		showMonthAfterYear: true,
    +		yearSuffix: '年'};
    +	$.datepicker.setDefaults($.datepicker.regional['zh-TW']);
    +});
    diff --git a/src/main/webapp/vendors/jquery-ui/ui/jquery-ui.custom.js b/src/main/webapp/vendors/jquery-ui/ui/jquery-ui.custom.js
    new file mode 100644
    index 000000000..c6fe31922
    --- /dev/null
    +++ b/src/main/webapp/vendors/jquery-ui/ui/jquery-ui.custom.js
    @@ -0,0 +1,15008 @@
    +/*! jQuery UI - v1.10.4 - 2014-02-16
    +* http://jqueryui.com
    +* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.sortable.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js, jquery.ui.dialog.js, jquery.ui.menu.js, jquery.ui.progressbar.js, jquery.ui.slider.js, jquery.ui.spinner.js, jquery.ui.tabs.js, jquery.ui.tooltip.js, jquery.ui.effect.js, jquery.ui.effect-blind.js, jquery.ui.effect-bounce.js, jquery.ui.effect-clip.js, jquery.ui.effect-drop.js, jquery.ui.effect-explode.js, jquery.ui.effect-fade.js, jquery.ui.effect-fold.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-scale.js, jquery.ui.effect-shake.js, jquery.ui.effect-slide.js, jquery.ui.effect-transfer.js
    +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
    +
    +(function( $, undefined ) {
    +
    +var uuid = 0,
    +	runiqueId = /^ui-id-\d+$/;
    +
    +// $.ui might exist from components with no dependencies, e.g., $.ui.position
    +$.ui = $.ui || {};
    +
    +$.extend( $.ui, {
    +	version: "1.10.4",
    +
    +	keyCode: {
    +		BACKSPACE: 8,
    +		COMMA: 188,
    +		DELETE: 46,
    +		DOWN: 40,
    +		END: 35,
    +		ENTER: 13,
    +		ESCAPE: 27,
    +		HOME: 36,
    +		LEFT: 37,
    +		NUMPAD_ADD: 107,
    +		NUMPAD_DECIMAL: 110,
    +		NUMPAD_DIVIDE: 111,
    +		NUMPAD_ENTER: 108,
    +		NUMPAD_MULTIPLY: 106,
    +		NUMPAD_SUBTRACT: 109,
    +		PAGE_DOWN: 34,
    +		PAGE_UP: 33,
    +		PERIOD: 190,
    +		RIGHT: 39,
    +		SPACE: 32,
    +		TAB: 9,
    +		UP: 38
    +	}
    +});
    +
    +// plugins
    +$.fn.extend({
    +	focus: (function( orig ) {
    +		return function( delay, fn ) {
    +			return typeof delay === "number" ?
    +				this.each(function() {
    +					var elem = this;
    +					setTimeout(function() {
    +						$( elem ).focus();
    +						if ( fn ) {
    +							fn.call( elem );
    +						}
    +					}, delay );
    +				}) :
    +				orig.apply( this, arguments );
    +		};
    +	})( $.fn.focus ),
    +
    +	scrollParent: function() {
    +		var scrollParent;
    +		if (($.ui.ie && (/(static|relative)/).test(this.css("position"))) || (/absolute/).test(this.css("position"))) {
    +			scrollParent = this.parents().filter(function() {
    +				return (/(relative|absolute|fixed)/).test($.css(this,"position")) && (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x"));
    +			}).eq(0);
    +		} else {
    +			scrollParent = this.parents().filter(function() {
    +				return (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x"));
    +			}).eq(0);
    +		}
    +
    +		return (/fixed/).test(this.css("position")) || !scrollParent.length ? $(document) : scrollParent;
    +	},
    +
    +	zIndex: function( zIndex ) {
    +		if ( zIndex !== undefined ) {
    +			return this.css( "zIndex", zIndex );
    +		}
    +
    +		if ( this.length ) {
    +			var elem = $( this[ 0 ] ), position, value;
    +			while ( elem.length && elem[ 0 ] !== document ) {
    +				// Ignore z-index if position is set to a value where z-index is ignored by the browser
    +				// This makes behavior of this function consistent across browsers
    +				// WebKit always returns auto if the element is positioned
    +				position = elem.css( "position" );
    +				if ( position === "absolute" || position === "relative" || position === "fixed" ) {
    +					// IE returns 0 when zIndex is not specified
    +					// other browsers return a string
    +					// we ignore the case of nested elements with an explicit value of 0
    +					// 
    + value = parseInt( elem.css( "zIndex" ), 10 ); + if ( !isNaN( value ) && value !== 0 ) { + return value; + } + } + elem = elem.parent(); + } + } + + return 0; + }, + + uniqueId: function() { + return this.each(function() { + if ( !this.id ) { + this.id = "ui-id-" + (++uuid); + } + }); + }, + + removeUniqueId: function() { + return this.each(function() { + if ( runiqueId.test( this.id ) ) { + $( this ).removeAttr( "id" ); + } + }); + } +}); + +// selectors +function focusable( element, isTabIndexNotNaN ) { + var map, mapName, img, + nodeName = element.nodeName.toLowerCase(); + if ( "area" === nodeName ) { + map = element.parentNode; + mapName = map.name; + if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) { + return false; + } + img = $( "img[usemap=#" + mapName + "]" )[0]; + return !!img && visible( img ); + } + return ( /input|select|textarea|button|object/.test( nodeName ) ? + !element.disabled : + "a" === nodeName ? + element.href || isTabIndexNotNaN : + isTabIndexNotNaN) && + // the element and all of its ancestors must be visible + visible( element ); +} + +function visible( element ) { + return $.expr.filters.visible( element ) && + !$( element ).parents().addBack().filter(function() { + return $.css( this, "visibility" ) === "hidden"; + }).length; +} + +$.extend( $.expr[ ":" ], { + data: $.expr.createPseudo ? + $.expr.createPseudo(function( dataName ) { + return function( elem ) { + return !!$.data( elem, dataName ); + }; + }) : + // support: jQuery <1.8 + function( elem, i, match ) { + return !!$.data( elem, match[ 3 ] ); + }, + + focusable: function( element ) { + return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) ); + }, + + tabbable: function( element ) { + var tabIndex = $.attr( element, "tabindex" ), + isTabIndexNaN = isNaN( tabIndex ); + return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN ); + } +}); + +// support: jQuery <1.8 +if ( !$( "
    " ).outerWidth( 1 ).jquery ) { + $.each( [ "Width", "Height" ], function( i, name ) { + var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ], + type = name.toLowerCase(), + orig = { + innerWidth: $.fn.innerWidth, + innerHeight: $.fn.innerHeight, + outerWidth: $.fn.outerWidth, + outerHeight: $.fn.outerHeight + }; + + function reduce( elem, size, border, margin ) { + $.each( side, function() { + size -= parseFloat( $.css( elem, "padding" + this ) ) || 0; + if ( border ) { + size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0; + } + if ( margin ) { + size -= parseFloat( $.css( elem, "margin" + this ) ) || 0; + } + }); + return size; + } + + $.fn[ "inner" + name ] = function( size ) { + if ( size === undefined ) { + return orig[ "inner" + name ].call( this ); + } + + return this.each(function() { + $( this ).css( type, reduce( this, size ) + "px" ); + }); + }; + + $.fn[ "outer" + name] = function( size, margin ) { + if ( typeof size !== "number" ) { + return orig[ "outer" + name ].call( this, size ); + } + + return this.each(function() { + $( this).css( type, reduce( this, size, true, margin ) + "px" ); + }); + }; + }); +} + +// support: jQuery <1.8 +if ( !$.fn.addBack ) { + $.fn.addBack = function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + }; +} + +// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413) +if ( $( "" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) { + $.fn.removeData = (function( removeData ) { + return function( key ) { + if ( arguments.length ) { + return removeData.call( this, $.camelCase( key ) ); + } else { + return removeData.call( this ); + } + }; + })( $.fn.removeData ); +} + + + + + +// deprecated +$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() ); + +$.support.selectstart = "onselectstart" in document.createElement( "div" ); +$.fn.extend({ + disableSelection: function() { + return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) + + ".ui-disableSelection", function( event ) { + event.preventDefault(); + }); + }, + + enableSelection: function() { + return this.unbind( ".ui-disableSelection" ); + } +}); + +$.extend( $.ui, { + // $.ui.plugin is deprecated. Use $.widget() extensions instead. + plugin: { + add: function( module, option, set ) { + var i, + proto = $.ui[ module ].prototype; + for ( i in set ) { + proto.plugins[ i ] = proto.plugins[ i ] || []; + proto.plugins[ i ].push( [ option, set[ i ] ] ); + } + }, + call: function( instance, name, args ) { + var i, + set = instance.plugins[ name ]; + if ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) { + return; + } + + for ( i = 0; i < set.length; i++ ) { + if ( instance.options[ set[ i ][ 0 ] ] ) { + set[ i ][ 1 ].apply( instance.element, args ); + } + } + } + }, + + // only used by resizable + hasScroll: function( el, a ) { + + //If overflow is hidden, the element might have extra content, but the user wants to hide it + if ( $( el ).css( "overflow" ) === "hidden") { + return false; + } + + var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop", + has = false; + + if ( el[ scroll ] > 0 ) { + return true; + } + + // TODO: determine which cases actually cause this to happen + // if the element doesn't have the scroll set, see if it's possible to + // set the scroll + el[ scroll ] = 1; + has = ( el[ scroll ] > 0 ); + el[ scroll ] = 0; + return has; + } +}); + +})( jQuery ); +(function( $, undefined ) { + +var uuid = 0, + slice = Array.prototype.slice, + _cleanData = $.cleanData; +$.cleanData = function( elems ) { + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + try { + $( elem ).triggerHandler( "remove" ); + // http://bugs.jquery.com/ticket/8235 + } catch( e ) {} + } + _cleanData( elems ); +}; + +$.widget = function( name, base, prototype ) { + var fullName, existingConstructor, constructor, basePrototype, + // proxiedPrototype allows the provided prototype to remain unmodified + // so that it can be used as a mixin for multiple widgets (#8876) + proxiedPrototype = {}, + namespace = name.split( "." )[ 0 ]; + + name = name.split( "." )[ 1 ]; + fullName = namespace + "-" + name; + + if ( !prototype ) { + prototype = base; + base = $.Widget; + } + + // create selector for plugin + $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) { + return !!$.data( elem, fullName ); + }; + + $[ namespace ] = $[ namespace ] || {}; + existingConstructor = $[ namespace ][ name ]; + constructor = $[ namespace ][ name ] = function( options, element ) { + // allow instantiation without "new" keyword + if ( !this._createWidget ) { + return new constructor( options, element ); + } + + // allow instantiation without initializing for simple inheritance + // must use "new" keyword (the code above always passes args) + if ( arguments.length ) { + this._createWidget( options, element ); + } + }; + // extend with the existing constructor to carry over any static properties + $.extend( constructor, existingConstructor, { + version: prototype.version, + // copy the object used to create the prototype in case we need to + // redefine the widget later + _proto: $.extend( {}, prototype ), + // track widgets that inherit from this widget in case this widget is + // redefined after a widget inherits from it + _childConstructors: [] + }); + + basePrototype = new base(); + // we need to make the options hash a property directly on the new instance + // otherwise we'll modify the options hash on the prototype that we're + // inheriting from + basePrototype.options = $.widget.extend( {}, basePrototype.options ); + $.each( prototype, function( prop, value ) { + if ( !$.isFunction( value ) ) { + proxiedPrototype[ prop ] = value; + return; + } + proxiedPrototype[ prop ] = (function() { + var _super = function() { + return base.prototype[ prop ].apply( this, arguments ); + }, + _superApply = function( args ) { + return base.prototype[ prop ].apply( this, args ); + }; + return function() { + var __super = this._super, + __superApply = this._superApply, + returnValue; + + this._super = _super; + this._superApply = _superApply; + + returnValue = value.apply( this, arguments ); + + this._super = __super; + this._superApply = __superApply; + + return returnValue; + }; + })(); + }); + constructor.prototype = $.widget.extend( basePrototype, { + // TODO: remove support for widgetEventPrefix + // always use the name + a colon as the prefix, e.g., draggable:start + // don't prefix for widgets that aren't DOM-based + widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name + }, proxiedPrototype, { + constructor: constructor, + namespace: namespace, + widgetName: name, + widgetFullName: fullName + }); + + // If this widget is being redefined then we need to find all widgets that + // are inheriting from it and redefine all of them so that they inherit from + // the new version of this widget. We're essentially trying to replace one + // level in the prototype chain. + if ( existingConstructor ) { + $.each( existingConstructor._childConstructors, function( i, child ) { + var childPrototype = child.prototype; + + // redefine the child widget using the same prototype that was + // originally used, but inherit from the new version of the base + $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto ); + }); + // remove the list of existing child constructors from the old constructor + // so the old child constructors can be garbage collected + delete existingConstructor._childConstructors; + } else { + base._childConstructors.push( constructor ); + } + + $.widget.bridge( name, constructor ); +}; + +$.widget.extend = function( target ) { + var input = slice.call( arguments, 1 ), + inputIndex = 0, + inputLength = input.length, + key, + value; + for ( ; inputIndex < inputLength; inputIndex++ ) { + for ( key in input[ inputIndex ] ) { + value = input[ inputIndex ][ key ]; + if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) { + // Clone objects + if ( $.isPlainObject( value ) ) { + target[ key ] = $.isPlainObject( target[ key ] ) ? + $.widget.extend( {}, target[ key ], value ) : + // Don't extend strings, arrays, etc. with objects + $.widget.extend( {}, value ); + // Copy everything else by reference + } else { + target[ key ] = value; + } + } + } + } + return target; +}; + +$.widget.bridge = function( name, object ) { + var fullName = object.prototype.widgetFullName || name; + $.fn[ name ] = function( options ) { + var isMethodCall = typeof options === "string", + args = slice.call( arguments, 1 ), + returnValue = this; + + // allow multiple hashes to be passed on init + options = !isMethodCall && args.length ? + $.widget.extend.apply( null, [ options ].concat(args) ) : + options; + + if ( isMethodCall ) { + this.each(function() { + var methodValue, + instance = $.data( this, fullName ); + if ( !instance ) { + return $.error( "cannot call methods on " + name + " prior to initialization; " + + "attempted to call method '" + options + "'" ); + } + if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) { + return $.error( "no such method '" + options + "' for " + name + " widget instance" ); + } + methodValue = instance[ options ].apply( instance, args ); + if ( methodValue !== instance && methodValue !== undefined ) { + returnValue = methodValue && methodValue.jquery ? + returnValue.pushStack( methodValue.get() ) : + methodValue; + return false; + } + }); + } else { + this.each(function() { + var instance = $.data( this, fullName ); + if ( instance ) { + instance.option( options || {} )._init(); + } else { + $.data( this, fullName, new object( options, this ) ); + } + }); + } + + return returnValue; + }; +}; + +$.Widget = function( /* options, element */ ) {}; +$.Widget._childConstructors = []; + +$.Widget.prototype = { + widgetName: "widget", + widgetEventPrefix: "", + defaultElement: "
    ", + options: { + disabled: false, + + // callbacks + create: null + }, + _createWidget: function( options, element ) { + element = $( element || this.defaultElement || this )[ 0 ]; + this.element = $( element ); + this.uuid = uuid++; + this.eventNamespace = "." + this.widgetName + this.uuid; + this.options = $.widget.extend( {}, + this.options, + this._getCreateOptions(), + options ); + + this.bindings = $(); + this.hoverable = $(); + this.focusable = $(); + + if ( element !== this ) { + $.data( element, this.widgetFullName, this ); + this._on( true, this.element, { + remove: function( event ) { + if ( event.target === element ) { + this.destroy(); + } + } + }); + this.document = $( element.style ? + // element within the document + element.ownerDocument : + // element is window or document + element.document || element ); + this.window = $( this.document[0].defaultView || this.document[0].parentWindow ); + } + + this._create(); + this._trigger( "create", null, this._getCreateEventData() ); + this._init(); + }, + _getCreateOptions: $.noop, + _getCreateEventData: $.noop, + _create: $.noop, + _init: $.noop, + + destroy: function() { + this._destroy(); + // we can probably remove the unbind calls in 2.0 + // all event bindings should go through this._on() + this.element + .unbind( this.eventNamespace ) + // 1.9 BC for #7810 + // TODO remove dual storage + .removeData( this.widgetName ) + .removeData( this.widgetFullName ) + // support: jquery <1.6.3 + // http://bugs.jquery.com/ticket/9413 + .removeData( $.camelCase( this.widgetFullName ) ); + this.widget() + .unbind( this.eventNamespace ) + .removeAttr( "aria-disabled" ) + .removeClass( + this.widgetFullName + "-disabled " + + "ui-state-disabled" ); + + // clean up events and states + this.bindings.unbind( this.eventNamespace ); + this.hoverable.removeClass( "ui-state-hover" ); + this.focusable.removeClass( "ui-state-focus" ); + }, + _destroy: $.noop, + + widget: function() { + return this.element; + }, + + option: function( key, value ) { + var options = key, + parts, + curOption, + i; + + if ( arguments.length === 0 ) { + // don't return a reference to the internal hash + return $.widget.extend( {}, this.options ); + } + + if ( typeof key === "string" ) { + // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } + options = {}; + parts = key.split( "." ); + key = parts.shift(); + if ( parts.length ) { + curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] ); + for ( i = 0; i < parts.length - 1; i++ ) { + curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {}; + curOption = curOption[ parts[ i ] ]; + } + key = parts.pop(); + if ( arguments.length === 1 ) { + return curOption[ key ] === undefined ? null : curOption[ key ]; + } + curOption[ key ] = value; + } else { + if ( arguments.length === 1 ) { + return this.options[ key ] === undefined ? null : this.options[ key ]; + } + options[ key ] = value; + } + } + + this._setOptions( options ); + + return this; + }, + _setOptions: function( options ) { + var key; + + for ( key in options ) { + this._setOption( key, options[ key ] ); + } + + return this; + }, + _setOption: function( key, value ) { + this.options[ key ] = value; + + if ( key === "disabled" ) { + this.widget() + .toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value ) + .attr( "aria-disabled", value ); + this.hoverable.removeClass( "ui-state-hover" ); + this.focusable.removeClass( "ui-state-focus" ); + } + + return this; + }, + + enable: function() { + return this._setOption( "disabled", false ); + }, + disable: function() { + return this._setOption( "disabled", true ); + }, + + _on: function( suppressDisabledCheck, element, handlers ) { + var delegateElement, + instance = this; + + // no suppressDisabledCheck flag, shuffle arguments + if ( typeof suppressDisabledCheck !== "boolean" ) { + handlers = element; + element = suppressDisabledCheck; + suppressDisabledCheck = false; + } + + // no element argument, shuffle and use this.element + if ( !handlers ) { + handlers = element; + element = this.element; + delegateElement = this.widget(); + } else { + // accept selectors, DOM elements + element = delegateElement = $( element ); + this.bindings = this.bindings.add( element ); + } + + $.each( handlers, function( event, handler ) { + function handlerProxy() { + // allow widgets to customize the disabled handling + // - disabled as an array instead of boolean + // - disabled class as method for disabling individual parts + if ( !suppressDisabledCheck && + ( instance.options.disabled === true || + $( this ).hasClass( "ui-state-disabled" ) ) ) { + return; + } + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + + // copy the guid so direct unbinding works + if ( typeof handler !== "string" ) { + handlerProxy.guid = handler.guid = + handler.guid || handlerProxy.guid || $.guid++; + } + + var match = event.match( /^(\w+)\s*(.*)$/ ), + eventName = match[1] + instance.eventNamespace, + selector = match[2]; + if ( selector ) { + delegateElement.delegate( selector, eventName, handlerProxy ); + } else { + element.bind( eventName, handlerProxy ); + } + }); + }, + + _off: function( element, eventName ) { + eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace; + element.unbind( eventName ).undelegate( eventName ); + }, + + _delay: function( handler, delay ) { + function handlerProxy() { + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + var instance = this; + return setTimeout( handlerProxy, delay || 0 ); + }, + + _hoverable: function( element ) { + this.hoverable = this.hoverable.add( element ); + this._on( element, { + mouseenter: function( event ) { + $( event.currentTarget ).addClass( "ui-state-hover" ); + }, + mouseleave: function( event ) { + $( event.currentTarget ).removeClass( "ui-state-hover" ); + } + }); + }, + + _focusable: function( element ) { + this.focusable = this.focusable.add( element ); + this._on( element, { + focusin: function( event ) { + $( event.currentTarget ).addClass( "ui-state-focus" ); + }, + focusout: function( event ) { + $( event.currentTarget ).removeClass( "ui-state-focus" ); + } + }); + }, + + _trigger: function( type, event, data ) { + var prop, orig, + callback = this.options[ type ]; + + data = data || {}; + event = $.Event( event ); + event.type = ( type === this.widgetEventPrefix ? + type : + this.widgetEventPrefix + type ).toLowerCase(); + // the original event may come from any element + // so we need to reset the target on the new event + event.target = this.element[ 0 ]; + + // copy original event properties over to the new event + orig = event.originalEvent; + if ( orig ) { + for ( prop in orig ) { + if ( !( prop in event ) ) { + event[ prop ] = orig[ prop ]; + } + } + } + + this.element.trigger( event, data ); + return !( $.isFunction( callback ) && + callback.apply( this.element[0], [ event ].concat( data ) ) === false || + event.isDefaultPrevented() ); + } +}; + +$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { + $.Widget.prototype[ "_" + method ] = function( element, options, callback ) { + if ( typeof options === "string" ) { + options = { effect: options }; + } + var hasOptions, + effectName = !options ? + method : + options === true || typeof options === "number" ? + defaultEffect : + options.effect || defaultEffect; + options = options || {}; + if ( typeof options === "number" ) { + options = { duration: options }; + } + hasOptions = !$.isEmptyObject( options ); + options.complete = callback; + if ( options.delay ) { + element.delay( options.delay ); + } + if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) { + element[ method ]( options ); + } else if ( effectName !== method && element[ effectName ] ) { + element[ effectName ]( options.duration, options.easing, callback ); + } else { + element.queue(function( next ) { + $( this )[ method ](); + if ( callback ) { + callback.call( element[ 0 ] ); + } + next(); + }); + } + }; +}); + +})( jQuery ); +(function( $, undefined ) { + +var mouseHandled = false; +$( document ).mouseup( function() { + mouseHandled = false; +}); + +$.widget("ui.mouse", { + version: "1.10.4", + options: { + cancel: "input,textarea,button,select,option", + distance: 1, + delay: 0 + }, + _mouseInit: function() { + var that = this; + + this.element + .bind("mousedown."+this.widgetName, function(event) { + return that._mouseDown(event); + }) + .bind("click."+this.widgetName, function(event) { + if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) { + $.removeData(event.target, that.widgetName + ".preventClickEvent"); + event.stopImmediatePropagation(); + return false; + } + }); + + this.started = false; + }, + + // TODO: make sure destroying one instance of mouse doesn't mess with + // other instances of mouse + _mouseDestroy: function() { + this.element.unbind("."+this.widgetName); + if ( this._mouseMoveDelegate ) { + $(document) + .unbind("mousemove."+this.widgetName, this._mouseMoveDelegate) + .unbind("mouseup."+this.widgetName, this._mouseUpDelegate); + } + }, + + _mouseDown: function(event) { + // don't let more than one widget handle mouseStart + if( mouseHandled ) { return; } + + // we may have missed mouseup (out of window) + (this._mouseStarted && this._mouseUp(event)); + + this._mouseDownEvent = event; + + var that = this, + btnIsLeft = (event.which === 1), + // event.target.nodeName works around a bug in IE 8 with + // disabled inputs (#7620) + elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false); + if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) { + return true; + } + + this.mouseDelayMet = !this.options.delay; + if (!this.mouseDelayMet) { + this._mouseDelayTimer = setTimeout(function() { + that.mouseDelayMet = true; + }, this.options.delay); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = (this._mouseStart(event) !== false); + if (!this._mouseStarted) { + event.preventDefault(); + return true; + } + } + + // Click event may never have fired (Gecko & Opera) + if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) { + $.removeData(event.target, this.widgetName + ".preventClickEvent"); + } + + // these delegates are required to keep context + this._mouseMoveDelegate = function(event) { + return that._mouseMove(event); + }; + this._mouseUpDelegate = function(event) { + return that._mouseUp(event); + }; + $(document) + .bind("mousemove."+this.widgetName, this._mouseMoveDelegate) + .bind("mouseup."+this.widgetName, this._mouseUpDelegate); + + event.preventDefault(); + + mouseHandled = true; + return true; + }, + + _mouseMove: function(event) { + // IE mouseup check - mouseup happened when mouse was out of window + if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) { + return this._mouseUp(event); + } + + if (this._mouseStarted) { + this._mouseDrag(event); + return event.preventDefault(); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = + (this._mouseStart(this._mouseDownEvent, event) !== false); + (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event)); + } + + return !this._mouseStarted; + }, + + _mouseUp: function(event) { + $(document) + .unbind("mousemove."+this.widgetName, this._mouseMoveDelegate) + .unbind("mouseup."+this.widgetName, this._mouseUpDelegate); + + if (this._mouseStarted) { + this._mouseStarted = false; + + if (event.target === this._mouseDownEvent.target) { + $.data(event.target, this.widgetName + ".preventClickEvent", true); + } + + this._mouseStop(event); + } + + return false; + }, + + _mouseDistanceMet: function(event) { + return (Math.max( + Math.abs(this._mouseDownEvent.pageX - event.pageX), + Math.abs(this._mouseDownEvent.pageY - event.pageY) + ) >= this.options.distance + ); + }, + + _mouseDelayMet: function(/* event */) { + return this.mouseDelayMet; + }, + + // These are placeholder methods, to be overriden by extending plugin + _mouseStart: function(/* event */) {}, + _mouseDrag: function(/* event */) {}, + _mouseStop: function(/* event */) {}, + _mouseCapture: function(/* event */) { return true; } +}); + +})(jQuery); +(function( $, undefined ) { + +$.ui = $.ui || {}; + +var cachedScrollbarWidth, + max = Math.max, + abs = Math.abs, + round = Math.round, + rhorizontal = /left|center|right/, + rvertical = /top|center|bottom/, + roffset = /[\+\-]\d+(\.[\d]+)?%?/, + rposition = /^\w+/, + rpercent = /%$/, + _position = $.fn.position; + +function getOffsets( offsets, width, height ) { + return [ + parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ), + parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 ) + ]; +} + +function parseCss( element, property ) { + return parseInt( $.css( element, property ), 10 ) || 0; +} + +function getDimensions( elem ) { + var raw = elem[0]; + if ( raw.nodeType === 9 ) { + return { + width: elem.width(), + height: elem.height(), + offset: { top: 0, left: 0 } + }; + } + if ( $.isWindow( raw ) ) { + return { + width: elem.width(), + height: elem.height(), + offset: { top: elem.scrollTop(), left: elem.scrollLeft() } + }; + } + if ( raw.preventDefault ) { + return { + width: 0, + height: 0, + offset: { top: raw.pageY, left: raw.pageX } + }; + } + return { + width: elem.outerWidth(), + height: elem.outerHeight(), + offset: elem.offset() + }; +} + +$.position = { + scrollbarWidth: function() { + if ( cachedScrollbarWidth !== undefined ) { + return cachedScrollbarWidth; + } + var w1, w2, + div = $( "
    " ), + innerDiv = div.children()[0]; + + $( "body" ).append( div ); + w1 = innerDiv.offsetWidth; + div.css( "overflow", "scroll" ); + + w2 = innerDiv.offsetWidth; + + if ( w1 === w2 ) { + w2 = div[0].clientWidth; + } + + div.remove(); + + return (cachedScrollbarWidth = w1 - w2); + }, + getScrollInfo: function( within ) { + var overflowX = within.isWindow || within.isDocument ? "" : + within.element.css( "overflow-x" ), + overflowY = within.isWindow || within.isDocument ? "" : + within.element.css( "overflow-y" ), + hasOverflowX = overflowX === "scroll" || + ( overflowX === "auto" && within.width < within.element[0].scrollWidth ), + hasOverflowY = overflowY === "scroll" || + ( overflowY === "auto" && within.height < within.element[0].scrollHeight ); + return { + width: hasOverflowY ? $.position.scrollbarWidth() : 0, + height: hasOverflowX ? $.position.scrollbarWidth() : 0 + }; + }, + getWithinInfo: function( element ) { + var withinElement = $( element || window ), + isWindow = $.isWindow( withinElement[0] ), + isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9; + return { + element: withinElement, + isWindow: isWindow, + isDocument: isDocument, + offset: withinElement.offset() || { left: 0, top: 0 }, + scrollLeft: withinElement.scrollLeft(), + scrollTop: withinElement.scrollTop(), + width: isWindow ? withinElement.width() : withinElement.outerWidth(), + height: isWindow ? withinElement.height() : withinElement.outerHeight() + }; + } +}; + +$.fn.position = function( options ) { + if ( !options || !options.of ) { + return _position.apply( this, arguments ); + } + + // make a copy, we don't want to modify arguments + options = $.extend( {}, options ); + + var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions, + target = $( options.of ), + within = $.position.getWithinInfo( options.within ), + scrollInfo = $.position.getScrollInfo( within ), + collision = ( options.collision || "flip" ).split( " " ), + offsets = {}; + + dimensions = getDimensions( target ); + if ( target[0].preventDefault ) { + // force left top to allow flipping + options.at = "left top"; + } + targetWidth = dimensions.width; + targetHeight = dimensions.height; + targetOffset = dimensions.offset; + // clone to reuse original targetOffset later + basePosition = $.extend( {}, targetOffset ); + + // force my and at to have valid horizontal and vertical positions + // if a value is missing or invalid, it will be converted to center + $.each( [ "my", "at" ], function() { + var pos = ( options[ this ] || "" ).split( " " ), + horizontalOffset, + verticalOffset; + + if ( pos.length === 1) { + pos = rhorizontal.test( pos[ 0 ] ) ? + pos.concat( [ "center" ] ) : + rvertical.test( pos[ 0 ] ) ? + [ "center" ].concat( pos ) : + [ "center", "center" ]; + } + pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center"; + pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center"; + + // calculate offsets + horizontalOffset = roffset.exec( pos[ 0 ] ); + verticalOffset = roffset.exec( pos[ 1 ] ); + offsets[ this ] = [ + horizontalOffset ? horizontalOffset[ 0 ] : 0, + verticalOffset ? verticalOffset[ 0 ] : 0 + ]; + + // reduce to just the positions without the offsets + options[ this ] = [ + rposition.exec( pos[ 0 ] )[ 0 ], + rposition.exec( pos[ 1 ] )[ 0 ] + ]; + }); + + // normalize collision option + if ( collision.length === 1 ) { + collision[ 1 ] = collision[ 0 ]; + } + + if ( options.at[ 0 ] === "right" ) { + basePosition.left += targetWidth; + } else if ( options.at[ 0 ] === "center" ) { + basePosition.left += targetWidth / 2; + } + + if ( options.at[ 1 ] === "bottom" ) { + basePosition.top += targetHeight; + } else if ( options.at[ 1 ] === "center" ) { + basePosition.top += targetHeight / 2; + } + + atOffset = getOffsets( offsets.at, targetWidth, targetHeight ); + basePosition.left += atOffset[ 0 ]; + basePosition.top += atOffset[ 1 ]; + + return this.each(function() { + var collisionPosition, using, + elem = $( this ), + elemWidth = elem.outerWidth(), + elemHeight = elem.outerHeight(), + marginLeft = parseCss( this, "marginLeft" ), + marginTop = parseCss( this, "marginTop" ), + collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width, + collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height, + position = $.extend( {}, basePosition ), + myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() ); + + if ( options.my[ 0 ] === "right" ) { + position.left -= elemWidth; + } else if ( options.my[ 0 ] === "center" ) { + position.left -= elemWidth / 2; + } + + if ( options.my[ 1 ] === "bottom" ) { + position.top -= elemHeight; + } else if ( options.my[ 1 ] === "center" ) { + position.top -= elemHeight / 2; + } + + position.left += myOffset[ 0 ]; + position.top += myOffset[ 1 ]; + + // if the browser doesn't support fractions, then round for consistent results + if ( !$.support.offsetFractions ) { + position.left = round( position.left ); + position.top = round( position.top ); + } + + collisionPosition = { + marginLeft: marginLeft, + marginTop: marginTop + }; + + $.each( [ "left", "top" ], function( i, dir ) { + if ( $.ui.position[ collision[ i ] ] ) { + $.ui.position[ collision[ i ] ][ dir ]( position, { + targetWidth: targetWidth, + targetHeight: targetHeight, + elemWidth: elemWidth, + elemHeight: elemHeight, + collisionPosition: collisionPosition, + collisionWidth: collisionWidth, + collisionHeight: collisionHeight, + offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ], + my: options.my, + at: options.at, + within: within, + elem : elem + }); + } + }); + + if ( options.using ) { + // adds feedback as second argument to using callback, if present + using = function( props ) { + var left = targetOffset.left - position.left, + right = left + targetWidth - elemWidth, + top = targetOffset.top - position.top, + bottom = top + targetHeight - elemHeight, + feedback = { + target: { + element: target, + left: targetOffset.left, + top: targetOffset.top, + width: targetWidth, + height: targetHeight + }, + element: { + element: elem, + left: position.left, + top: position.top, + width: elemWidth, + height: elemHeight + }, + horizontal: right < 0 ? "left" : left > 0 ? "right" : "center", + vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle" + }; + if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) { + feedback.horizontal = "center"; + } + if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) { + feedback.vertical = "middle"; + } + if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) { + feedback.important = "horizontal"; + } else { + feedback.important = "vertical"; + } + options.using.call( this, props, feedback ); + }; + } + + elem.offset( $.extend( position, { using: using } ) ); + }); +}; + +$.ui.position = { + fit: { + left: function( position, data ) { + var within = data.within, + withinOffset = within.isWindow ? within.scrollLeft : within.offset.left, + outerWidth = within.width, + collisionPosLeft = position.left - data.collisionPosition.marginLeft, + overLeft = withinOffset - collisionPosLeft, + overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset, + newOverRight; + + // element is wider than within + if ( data.collisionWidth > outerWidth ) { + // element is initially over the left side of within + if ( overLeft > 0 && overRight <= 0 ) { + newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset; + position.left += overLeft - newOverRight; + // element is initially over right side of within + } else if ( overRight > 0 && overLeft <= 0 ) { + position.left = withinOffset; + // element is initially over both left and right sides of within + } else { + if ( overLeft > overRight ) { + position.left = withinOffset + outerWidth - data.collisionWidth; + } else { + position.left = withinOffset; + } + } + // too far left -> align with left edge + } else if ( overLeft > 0 ) { + position.left += overLeft; + // too far right -> align with right edge + } else if ( overRight > 0 ) { + position.left -= overRight; + // adjust based on position and margin + } else { + position.left = max( position.left - collisionPosLeft, position.left ); + } + }, + top: function( position, data ) { + var within = data.within, + withinOffset = within.isWindow ? within.scrollTop : within.offset.top, + outerHeight = data.within.height, + collisionPosTop = position.top - data.collisionPosition.marginTop, + overTop = withinOffset - collisionPosTop, + overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset, + newOverBottom; + + // element is taller than within + if ( data.collisionHeight > outerHeight ) { + // element is initially over the top of within + if ( overTop > 0 && overBottom <= 0 ) { + newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset; + position.top += overTop - newOverBottom; + // element is initially over bottom of within + } else if ( overBottom > 0 && overTop <= 0 ) { + position.top = withinOffset; + // element is initially over both top and bottom of within + } else { + if ( overTop > overBottom ) { + position.top = withinOffset + outerHeight - data.collisionHeight; + } else { + position.top = withinOffset; + } + } + // too far up -> align with top + } else if ( overTop > 0 ) { + position.top += overTop; + // too far down -> align with bottom edge + } else if ( overBottom > 0 ) { + position.top -= overBottom; + // adjust based on position and margin + } else { + position.top = max( position.top - collisionPosTop, position.top ); + } + } + }, + flip: { + left: function( position, data ) { + var within = data.within, + withinOffset = within.offset.left + within.scrollLeft, + outerWidth = within.width, + offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left, + collisionPosLeft = position.left - data.collisionPosition.marginLeft, + overLeft = collisionPosLeft - offsetLeft, + overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft, + myOffset = data.my[ 0 ] === "left" ? + -data.elemWidth : + data.my[ 0 ] === "right" ? + data.elemWidth : + 0, + atOffset = data.at[ 0 ] === "left" ? + data.targetWidth : + data.at[ 0 ] === "right" ? + -data.targetWidth : + 0, + offset = -2 * data.offset[ 0 ], + newOverRight, + newOverLeft; + + if ( overLeft < 0 ) { + newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset; + if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) { + position.left += myOffset + atOffset + offset; + } + } + else if ( overRight > 0 ) { + newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft; + if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) { + position.left += myOffset + atOffset + offset; + } + } + }, + top: function( position, data ) { + var within = data.within, + withinOffset = within.offset.top + within.scrollTop, + outerHeight = within.height, + offsetTop = within.isWindow ? within.scrollTop : within.offset.top, + collisionPosTop = position.top - data.collisionPosition.marginTop, + overTop = collisionPosTop - offsetTop, + overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop, + top = data.my[ 1 ] === "top", + myOffset = top ? + -data.elemHeight : + data.my[ 1 ] === "bottom" ? + data.elemHeight : + 0, + atOffset = data.at[ 1 ] === "top" ? + data.targetHeight : + data.at[ 1 ] === "bottom" ? + -data.targetHeight : + 0, + offset = -2 * data.offset[ 1 ], + newOverTop, + newOverBottom; + if ( overTop < 0 ) { + newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset; + if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) { + position.top += myOffset + atOffset + offset; + } + } + else if ( overBottom > 0 ) { + newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop; + if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) { + position.top += myOffset + atOffset + offset; + } + } + } + }, + flipfit: { + left: function() { + $.ui.position.flip.left.apply( this, arguments ); + $.ui.position.fit.left.apply( this, arguments ); + }, + top: function() { + $.ui.position.flip.top.apply( this, arguments ); + $.ui.position.fit.top.apply( this, arguments ); + } + } +}; + +// fraction support test +(function () { + var testElement, testElementParent, testElementStyle, offsetLeft, i, + body = document.getElementsByTagName( "body" )[ 0 ], + div = document.createElement( "div" ); + + //Create a "fake body" for testing based on method used in jQuery.support + testElement = document.createElement( body ? "div" : "body" ); + testElementStyle = { + visibility: "hidden", + width: 0, + height: 0, + border: 0, + margin: 0, + background: "none" + }; + if ( body ) { + $.extend( testElementStyle, { + position: "absolute", + left: "-1000px", + top: "-1000px" + }); + } + for ( i in testElementStyle ) { + testElement.style[ i ] = testElementStyle[ i ]; + } + testElement.appendChild( div ); + testElementParent = body || document.documentElement; + testElementParent.insertBefore( testElement, testElementParent.firstChild ); + + div.style.cssText = "position: absolute; left: 10.7432222px;"; + + offsetLeft = $( div ).offset().left; + $.support.offsetFractions = offsetLeft > 10 && offsetLeft < 11; + + testElement.innerHTML = ""; + testElementParent.removeChild( testElement ); +})(); + +}( jQuery ) ); +(function( $, undefined ) { + +$.widget("ui.draggable", $.ui.mouse, { + version: "1.10.4", + widgetEventPrefix: "drag", + options: { + addClasses: true, + appendTo: "parent", + axis: false, + connectToSortable: false, + containment: false, + cursor: "auto", + cursorAt: false, + grid: false, + handle: false, + helper: "original", + iframeFix: false, + opacity: false, + refreshPositions: false, + revert: false, + revertDuration: 500, + scope: "default", + scroll: true, + scrollSensitivity: 20, + scrollSpeed: 20, + snap: false, + snapMode: "both", + snapTolerance: 20, + stack: false, + zIndex: false, + + // callbacks + drag: null, + start: null, + stop: null + }, + _create: function() { + + if (this.options.helper === "original" && !(/^(?:r|a|f)/).test(this.element.css("position"))) { + this.element[0].style.position = "relative"; + } + if (this.options.addClasses){ + this.element.addClass("ui-draggable"); + } + if (this.options.disabled){ + this.element.addClass("ui-draggable-disabled"); + } + + this._mouseInit(); + + }, + + _destroy: function() { + this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" ); + this._mouseDestroy(); + }, + + _mouseCapture: function(event) { + + var o = this.options; + + // among others, prevent a drag on a resizable-handle + if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) { + return false; + } + + //Quit if we're not on a valid handle + this.handle = this._getHandle(event); + if (!this.handle) { + return false; + } + + $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() { + $("
    ") + .css({ + width: this.offsetWidth+"px", height: this.offsetHeight+"px", + position: "absolute", opacity: "0.001", zIndex: 1000 + }) + .css($(this).offset()) + .appendTo("body"); + }); + + return true; + + }, + + _mouseStart: function(event) { + + var o = this.options; + + //Create and append the visible helper + this.helper = this._createHelper(event); + + this.helper.addClass("ui-draggable-dragging"); + + //Cache the helper size + this._cacheHelperProportions(); + + //If ddmanager is used for droppables, set the global draggable + if($.ui.ddmanager) { + $.ui.ddmanager.current = this; + } + + /* + * - Position generation - + * This block generates everything position related - it's the core of draggables. + */ + + //Cache the margins of the original element + this._cacheMargins(); + + //Store the helper's css position + this.cssPosition = this.helper.css( "position" ); + this.scrollParent = this.helper.scrollParent(); + this.offsetParent = this.helper.offsetParent(); + this.offsetParentCssPosition = this.offsetParent.css( "position" ); + + //The element's absolute position on the page minus margins + this.offset = this.positionAbs = this.element.offset(); + this.offset = { + top: this.offset.top - this.margins.top, + left: this.offset.left - this.margins.left + }; + + //Reset scroll cache + this.offset.scroll = false; + + $.extend(this.offset, { + click: { //Where the click happened, relative to the element + left: event.pageX - this.offset.left, + top: event.pageY - this.offset.top + }, + parent: this._getParentOffset(), + relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper + }); + + //Generate the original position + this.originalPosition = this.position = this._generatePosition(event); + this.originalPageX = event.pageX; + this.originalPageY = event.pageY; + + //Adjust the mouse offset relative to the helper if "cursorAt" is supplied + (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt)); + + //Set a containment if given in the options + this._setContainment(); + + //Trigger event + callbacks + if(this._trigger("start", event) === false) { + this._clear(); + return false; + } + + //Recache the helper size + this._cacheHelperProportions(); + + //Prepare the droppable offsets + if ($.ui.ddmanager && !o.dropBehaviour) { + $.ui.ddmanager.prepareOffsets(this, event); + } + + + this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position + + //If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003) + if ( $.ui.ddmanager ) { + $.ui.ddmanager.dragStart(this, event); + } + + return true; + }, + + _mouseDrag: function(event, noPropagation) { + // reset any necessary cached properties (see #5009) + if ( this.offsetParentCssPosition === "fixed" ) { + this.offset.parent = this._getParentOffset(); + } + + //Compute the helpers position + this.position = this._generatePosition(event); + this.positionAbs = this._convertPositionTo("absolute"); + + //Call plugins and callbacks and use the resulting position if something is returned + if (!noPropagation) { + var ui = this._uiHash(); + if(this._trigger("drag", event, ui) === false) { + this._mouseUp({}); + return false; + } + this.position = ui.position; + } + + if(!this.options.axis || this.options.axis !== "y") { + this.helper[0].style.left = this.position.left+"px"; + } + if(!this.options.axis || this.options.axis !== "x") { + this.helper[0].style.top = this.position.top+"px"; + } + if($.ui.ddmanager) { + $.ui.ddmanager.drag(this, event); + } + + return false; + }, + + _mouseStop: function(event) { + + //If we are using droppables, inform the manager about the drop + var that = this, + dropped = false; + if ($.ui.ddmanager && !this.options.dropBehaviour) { + dropped = $.ui.ddmanager.drop(this, event); + } + + //if a drop comes from outside (a sortable) + if(this.dropped) { + dropped = this.dropped; + this.dropped = false; + } + + //if the original element is no longer in the DOM don't bother to continue (see #8269) + if ( this.options.helper === "original" && !$.contains( this.element[ 0 ].ownerDocument, this.element[ 0 ] ) ) { + return false; + } + + if((this.options.revert === "invalid" && !dropped) || (this.options.revert === "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) { + $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() { + if(that._trigger("stop", event) !== false) { + that._clear(); + } + }); + } else { + if(this._trigger("stop", event) !== false) { + this._clear(); + } + } + + return false; + }, + + _mouseUp: function(event) { + //Remove frame helpers + $("div.ui-draggable-iframeFix").each(function() { + this.parentNode.removeChild(this); + }); + + //If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003) + if( $.ui.ddmanager ) { + $.ui.ddmanager.dragStop(this, event); + } + + return $.ui.mouse.prototype._mouseUp.call(this, event); + }, + + cancel: function() { + + if(this.helper.is(".ui-draggable-dragging")) { + this._mouseUp({}); + } else { + this._clear(); + } + + return this; + + }, + + _getHandle: function(event) { + return this.options.handle ? + !!$( event.target ).closest( this.element.find( this.options.handle ) ).length : + true; + }, + + _createHelper: function(event) { + + var o = this.options, + helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper === "clone" ? this.element.clone().removeAttr("id") : this.element); + + if(!helper.parents("body").length) { + helper.appendTo((o.appendTo === "parent" ? this.element[0].parentNode : o.appendTo)); + } + + if(helper[0] !== this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) { + helper.css("position", "absolute"); + } + + return helper; + + }, + + _adjustOffsetFromHelper: function(obj) { + if (typeof obj === "string") { + obj = obj.split(" "); + } + if ($.isArray(obj)) { + obj = {left: +obj[0], top: +obj[1] || 0}; + } + if ("left" in obj) { + this.offset.click.left = obj.left + this.margins.left; + } + if ("right" in obj) { + this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; + } + if ("top" in obj) { + this.offset.click.top = obj.top + this.margins.top; + } + if ("bottom" in obj) { + this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; + } + }, + + _getParentOffset: function() { + + //Get the offsetParent and cache its position + var po = this.offsetParent.offset(); + + // This is a special case where we need to modify a offset calculated on start, since the following happened: + // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent + // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that + // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag + if(this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) { + po.left += this.scrollParent.scrollLeft(); + po.top += this.scrollParent.scrollTop(); + } + + //This needs to be actually done for all browsers, since pageX/pageY includes this information + //Ugly IE fix + if((this.offsetParent[0] === document.body) || + (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) { + po = { top: 0, left: 0 }; + } + + return { + top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0), + left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0) + }; + + }, + + _getRelativeOffset: function() { + + if(this.cssPosition === "relative") { + var p = this.element.position(); + return { + top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(), + left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft() + }; + } else { + return { top: 0, left: 0 }; + } + + }, + + _cacheMargins: function() { + this.margins = { + left: (parseInt(this.element.css("marginLeft"),10) || 0), + top: (parseInt(this.element.css("marginTop"),10) || 0), + right: (parseInt(this.element.css("marginRight"),10) || 0), + bottom: (parseInt(this.element.css("marginBottom"),10) || 0) + }; + }, + + _cacheHelperProportions: function() { + this.helperProportions = { + width: this.helper.outerWidth(), + height: this.helper.outerHeight() + }; + }, + + _setContainment: function() { + + var over, c, ce, + o = this.options; + + if ( !o.containment ) { + this.containment = null; + return; + } + + if ( o.containment === "window" ) { + this.containment = [ + $( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left, + $( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top, + $( window ).scrollLeft() + $( window ).width() - this.helperProportions.width - this.margins.left, + $( window ).scrollTop() + ( $( window ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top + ]; + return; + } + + if ( o.containment === "document") { + this.containment = [ + 0, + 0, + $( document ).width() - this.helperProportions.width - this.margins.left, + ( $( document ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top + ]; + return; + } + + if ( o.containment.constructor === Array ) { + this.containment = o.containment; + return; + } + + if ( o.containment === "parent" ) { + o.containment = this.helper[ 0 ].parentNode; + } + + c = $( o.containment ); + ce = c[ 0 ]; + + if( !ce ) { + return; + } + + over = c.css( "overflow" ) !== "hidden"; + + this.containment = [ + ( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ), + ( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingTop" ), 10 ) || 0 ) , + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) - ( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) - ( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) - this.helperProportions.width - this.margins.left - this.margins.right, + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) - ( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) - ( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) - this.helperProportions.height - this.margins.top - this.margins.bottom + ]; + this.relative_container = c; + }, + + _convertPositionTo: function(d, pos) { + + if(!pos) { + pos = this.position; + } + + var mod = d === "absolute" ? 1 : -1, + scroll = this.cssPosition === "absolute" && !( this.scrollParent[ 0 ] !== document && $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ? this.offsetParent : this.scrollParent; + + //Cache the scroll + if (!this.offset.scroll) { + this.offset.scroll = {top : scroll.scrollTop(), left : scroll.scrollLeft()}; + } + + return { + top: ( + pos.top + // The absolute mouse position + this.offset.relative.top * mod + // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.top * mod - // The offsetParent's offset without borders (offset + border) + ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : this.offset.scroll.top ) * mod ) + ), + left: ( + pos.left + // The absolute mouse position + this.offset.relative.left * mod + // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.left * mod - // The offsetParent's offset without borders (offset + border) + ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : this.offset.scroll.left ) * mod ) + ) + }; + + }, + + _generatePosition: function(event) { + + var containment, co, top, left, + o = this.options, + scroll = this.cssPosition === "absolute" && !( this.scrollParent[ 0 ] !== document && $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ? this.offsetParent : this.scrollParent, + pageX = event.pageX, + pageY = event.pageY; + + //Cache the scroll + if (!this.offset.scroll) { + this.offset.scroll = {top : scroll.scrollTop(), left : scroll.scrollLeft()}; + } + + /* + * - Position constraining - + * Constrain the position to a mix of grid, containment. + */ + + // If we are not dragging yet, we won't check for options + if ( this.originalPosition ) { + if ( this.containment ) { + if ( this.relative_container ){ + co = this.relative_container.offset(); + containment = [ + this.containment[ 0 ] + co.left, + this.containment[ 1 ] + co.top, + this.containment[ 2 ] + co.left, + this.containment[ 3 ] + co.top + ]; + } + else { + containment = this.containment; + } + + if(event.pageX - this.offset.click.left < containment[0]) { + pageX = containment[0] + this.offset.click.left; + } + if(event.pageY - this.offset.click.top < containment[1]) { + pageY = containment[1] + this.offset.click.top; + } + if(event.pageX - this.offset.click.left > containment[2]) { + pageX = containment[2] + this.offset.click.left; + } + if(event.pageY - this.offset.click.top > containment[3]) { + pageY = containment[3] + this.offset.click.top; + } + } + + if(o.grid) { + //Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950) + top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY; + pageY = containment ? ((top - this.offset.click.top >= containment[1] || top - this.offset.click.top > containment[3]) ? top : ((top - this.offset.click.top >= containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top; + + left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX; + pageX = containment ? ((left - this.offset.click.left >= containment[0] || left - this.offset.click.left > containment[2]) ? left : ((left - this.offset.click.left >= containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left; + } + + } + + return { + top: ( + pageY - // The absolute mouse position + this.offset.click.top - // Click offset (relative to the element) + this.offset.relative.top - // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.top + // The offsetParent's offset without borders (offset + border) + ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : this.offset.scroll.top ) + ), + left: ( + pageX - // The absolute mouse position + this.offset.click.left - // Click offset (relative to the element) + this.offset.relative.left - // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.left + // The offsetParent's offset without borders (offset + border) + ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : this.offset.scroll.left ) + ) + }; + + }, + + _clear: function() { + this.helper.removeClass("ui-draggable-dragging"); + if(this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) { + this.helper.remove(); + } + this.helper = null; + this.cancelHelperRemoval = false; + }, + + // From now on bulk stuff - mainly helpers + + _trigger: function(type, event, ui) { + ui = ui || this._uiHash(); + $.ui.plugin.call(this, type, [event, ui]); + //The absolute position has to be recalculated after plugins + if(type === "drag") { + this.positionAbs = this._convertPositionTo("absolute"); + } + return $.Widget.prototype._trigger.call(this, type, event, ui); + }, + + plugins: {}, + + _uiHash: function() { + return { + helper: this.helper, + position: this.position, + originalPosition: this.originalPosition, + offset: this.positionAbs + }; + } + +}); + +$.ui.plugin.add("draggable", "connectToSortable", { + start: function(event, ui) { + + var inst = $(this).data("ui-draggable"), o = inst.options, + uiSortable = $.extend({}, ui, { item: inst.element }); + inst.sortables = []; + $(o.connectToSortable).each(function() { + var sortable = $.data(this, "ui-sortable"); + if (sortable && !sortable.options.disabled) { + inst.sortables.push({ + instance: sortable, + shouldRevert: sortable.options.revert + }); + sortable.refreshPositions(); // Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page). + sortable._trigger("activate", event, uiSortable); + } + }); + + }, + stop: function(event, ui) { + + //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper + var inst = $(this).data("ui-draggable"), + uiSortable = $.extend({}, ui, { item: inst.element }); + + $.each(inst.sortables, function() { + if(this.instance.isOver) { + + this.instance.isOver = 0; + + inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance + this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work) + + //The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: "valid/invalid" + if(this.shouldRevert) { + this.instance.options.revert = this.shouldRevert; + } + + //Trigger the stop of the sortable + this.instance._mouseStop(event); + + this.instance.options.helper = this.instance.options._helper; + + //If the helper has been the original item, restore properties in the sortable + if(inst.options.helper === "original") { + this.instance.currentItem.css({ top: "auto", left: "auto" }); + } + + } else { + this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance + this.instance._trigger("deactivate", event, uiSortable); + } + + }); + + }, + drag: function(event, ui) { + + var inst = $(this).data("ui-draggable"), that = this; + + $.each(inst.sortables, function() { + + var innermostIntersecting = false, + thisSortable = this; + + //Copy over some variables to allow calling the sortable's native _intersectsWith + this.instance.positionAbs = inst.positionAbs; + this.instance.helperProportions = inst.helperProportions; + this.instance.offset.click = inst.offset.click; + + if(this.instance._intersectsWith(this.instance.containerCache)) { + innermostIntersecting = true; + $.each(inst.sortables, function () { + this.instance.positionAbs = inst.positionAbs; + this.instance.helperProportions = inst.helperProportions; + this.instance.offset.click = inst.offset.click; + if (this !== thisSortable && + this.instance._intersectsWith(this.instance.containerCache) && + $.contains(thisSortable.instance.element[0], this.instance.element[0]) + ) { + innermostIntersecting = false; + } + return innermostIntersecting; + }); + } + + + if(innermostIntersecting) { + //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once + if(!this.instance.isOver) { + + this.instance.isOver = 1; + //Now we fake the start of dragging for the sortable instance, + //by cloning the list group item, appending it to the sortable and using it as inst.currentItem + //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one) + this.instance.currentItem = $(that).clone().removeAttr("id").appendTo(this.instance.element).data("ui-sortable-item", true); + this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it + this.instance.options.helper = function() { return ui.helper[0]; }; + + event.target = this.instance.currentItem[0]; + this.instance._mouseCapture(event, true); + this.instance._mouseStart(event, true, true); + + //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes + this.instance.offset.click.top = inst.offset.click.top; + this.instance.offset.click.left = inst.offset.click.left; + this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left; + this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top; + + inst._trigger("toSortable", event); + inst.dropped = this.instance.element; //draggable revert needs that + //hack so receive/update callbacks work (mostly) + inst.currentItem = inst.element; + this.instance.fromOutside = inst; + + } + + //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable + if(this.instance.currentItem) { + this.instance._mouseDrag(event); + } + + } else { + + //If it doesn't intersect with the sortable, and it intersected before, + //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval + if(this.instance.isOver) { + + this.instance.isOver = 0; + this.instance.cancelHelperRemoval = true; + + //Prevent reverting on this forced stop + this.instance.options.revert = false; + + // The out event needs to be triggered independently + this.instance._trigger("out", event, this.instance._uiHash(this.instance)); + + this.instance._mouseStop(event, true); + this.instance.options.helper = this.instance.options._helper; + + //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size + this.instance.currentItem.remove(); + if(this.instance.placeholder) { + this.instance.placeholder.remove(); + } + + inst._trigger("fromSortable", event); + inst.dropped = false; //draggable revert needs that + } + + } + + }); + + } +}); + +$.ui.plugin.add("draggable", "cursor", { + start: function() { + var t = $("body"), o = $(this).data("ui-draggable").options; + if (t.css("cursor")) { + o._cursor = t.css("cursor"); + } + t.css("cursor", o.cursor); + }, + stop: function() { + var o = $(this).data("ui-draggable").options; + if (o._cursor) { + $("body").css("cursor", o._cursor); + } + } +}); + +$.ui.plugin.add("draggable", "opacity", { + start: function(event, ui) { + var t = $(ui.helper), o = $(this).data("ui-draggable").options; + if(t.css("opacity")) { + o._opacity = t.css("opacity"); + } + t.css("opacity", o.opacity); + }, + stop: function(event, ui) { + var o = $(this).data("ui-draggable").options; + if(o._opacity) { + $(ui.helper).css("opacity", o._opacity); + } + } +}); + +$.ui.plugin.add("draggable", "scroll", { + start: function() { + var i = $(this).data("ui-draggable"); + if(i.scrollParent[0] !== document && i.scrollParent[0].tagName !== "HTML") { + i.overflowOffset = i.scrollParent.offset(); + } + }, + drag: function( event ) { + + var i = $(this).data("ui-draggable"), o = i.options, scrolled = false; + + if(i.scrollParent[0] !== document && i.scrollParent[0].tagName !== "HTML") { + + if(!o.axis || o.axis !== "x") { + if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) { + i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed; + } else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity) { + i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed; + } + } + + if(!o.axis || o.axis !== "y") { + if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) { + i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed; + } else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity) { + i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed; + } + } + + } else { + + if(!o.axis || o.axis !== "x") { + if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) { + scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed); + } else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) { + scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed); + } + } + + if(!o.axis || o.axis !== "y") { + if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) { + scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed); + } else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) { + scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed); + } + } + + } + + if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) { + $.ui.ddmanager.prepareOffsets(i, event); + } + + } +}); + +$.ui.plugin.add("draggable", "snap", { + start: function() { + + var i = $(this).data("ui-draggable"), + o = i.options; + + i.snapElements = []; + + $(o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap).each(function() { + var $t = $(this), + $o = $t.offset(); + if(this !== i.element[0]) { + i.snapElements.push({ + item: this, + width: $t.outerWidth(), height: $t.outerHeight(), + top: $o.top, left: $o.left + }); + } + }); + + }, + drag: function(event, ui) { + + var ts, bs, ls, rs, l, r, t, b, i, first, + inst = $(this).data("ui-draggable"), + o = inst.options, + d = o.snapTolerance, + x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width, + y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height; + + for (i = inst.snapElements.length - 1; i >= 0; i--){ + + l = inst.snapElements[i].left; + r = l + inst.snapElements[i].width; + t = inst.snapElements[i].top; + b = t + inst.snapElements[i].height; + + if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains( inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) { + if(inst.snapElements[i].snapping) { + (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item }))); + } + inst.snapElements[i].snapping = false; + continue; + } + + if(o.snapMode !== "inner") { + ts = Math.abs(t - y2) <= d; + bs = Math.abs(b - y1) <= d; + ls = Math.abs(l - x2) <= d; + rs = Math.abs(r - x1) <= d; + if(ts) { + ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top; + } + if(bs) { + ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top; + } + if(ls) { + ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left; + } + if(rs) { + ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left; + } + } + + first = (ts || bs || ls || rs); + + if(o.snapMode !== "outer") { + ts = Math.abs(t - y1) <= d; + bs = Math.abs(b - y2) <= d; + ls = Math.abs(l - x1) <= d; + rs = Math.abs(r - x2) <= d; + if(ts) { + ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top; + } + if(bs) { + ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top; + } + if(ls) { + ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left; + } + if(rs) { + ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left; + } + } + + if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) { + (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item }))); + } + inst.snapElements[i].snapping = (ts || bs || ls || rs || first); + + } + + } +}); + +$.ui.plugin.add("draggable", "stack", { + start: function() { + var min, + o = this.data("ui-draggable").options, + group = $.makeArray($(o.stack)).sort(function(a,b) { + return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0); + }); + + if (!group.length) { return; } + + min = parseInt($(group[0]).css("zIndex"), 10) || 0; + $(group).each(function(i) { + $(this).css("zIndex", min + i); + }); + this.css("zIndex", (min + group.length)); + } +}); + +$.ui.plugin.add("draggable", "zIndex", { + start: function(event, ui) { + var t = $(ui.helper), o = $(this).data("ui-draggable").options; + if(t.css("zIndex")) { + o._zIndex = t.css("zIndex"); + } + t.css("zIndex", o.zIndex); + }, + stop: function(event, ui) { + var o = $(this).data("ui-draggable").options; + if(o._zIndex) { + $(ui.helper).css("zIndex", o._zIndex); + } + } +}); + +})(jQuery); +(function( $, undefined ) { + +function isOverAxis( x, reference, size ) { + return ( x > reference ) && ( x < ( reference + size ) ); +} + +$.widget("ui.droppable", { + version: "1.10.4", + widgetEventPrefix: "drop", + options: { + accept: "*", + activeClass: false, + addClasses: true, + greedy: false, + hoverClass: false, + scope: "default", + tolerance: "intersect", + + // callbacks + activate: null, + deactivate: null, + drop: null, + out: null, + over: null + }, + _create: function() { + + var proportions, + o = this.options, + accept = o.accept; + + this.isover = false; + this.isout = true; + + this.accept = $.isFunction(accept) ? accept : function(d) { + return d.is(accept); + }; + + this.proportions = function( /* valueToWrite */ ) { + if ( arguments.length ) { + // Store the droppable's proportions + proportions = arguments[ 0 ]; + } else { + // Retrieve or derive the droppable's proportions + return proportions ? + proportions : + proportions = { + width: this.element[ 0 ].offsetWidth, + height: this.element[ 0 ].offsetHeight + }; + } + }; + + // Add the reference and positions to the manager + $.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || []; + $.ui.ddmanager.droppables[o.scope].push(this); + + (o.addClasses && this.element.addClass("ui-droppable")); + + }, + + _destroy: function() { + var i = 0, + drop = $.ui.ddmanager.droppables[this.options.scope]; + + for ( ; i < drop.length; i++ ) { + if ( drop[i] === this ) { + drop.splice(i, 1); + } + } + + this.element.removeClass("ui-droppable ui-droppable-disabled"); + }, + + _setOption: function(key, value) { + + if(key === "accept") { + this.accept = $.isFunction(value) ? value : function(d) { + return d.is(value); + }; + } + $.Widget.prototype._setOption.apply(this, arguments); + }, + + _activate: function(event) { + var draggable = $.ui.ddmanager.current; + if(this.options.activeClass) { + this.element.addClass(this.options.activeClass); + } + if(draggable){ + this._trigger("activate", event, this.ui(draggable)); + } + }, + + _deactivate: function(event) { + var draggable = $.ui.ddmanager.current; + if(this.options.activeClass) { + this.element.removeClass(this.options.activeClass); + } + if(draggable){ + this._trigger("deactivate", event, this.ui(draggable)); + } + }, + + _over: function(event) { + + var draggable = $.ui.ddmanager.current; + + // Bail if draggable and droppable are same element + if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) { + return; + } + + if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { + if(this.options.hoverClass) { + this.element.addClass(this.options.hoverClass); + } + this._trigger("over", event, this.ui(draggable)); + } + + }, + + _out: function(event) { + + var draggable = $.ui.ddmanager.current; + + // Bail if draggable and droppable are same element + if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) { + return; + } + + if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { + if(this.options.hoverClass) { + this.element.removeClass(this.options.hoverClass); + } + this._trigger("out", event, this.ui(draggable)); + } + + }, + + _drop: function(event,custom) { + + var draggable = custom || $.ui.ddmanager.current, + childrenIntersection = false; + + // Bail if draggable and droppable are same element + if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) { + return false; + } + + this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function() { + var inst = $.data(this, "ui-droppable"); + if( + inst.options.greedy && + !inst.options.disabled && + inst.options.scope === draggable.options.scope && + inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element)) && + $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance) + ) { childrenIntersection = true; return false; } + }); + if(childrenIntersection) { + return false; + } + + if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { + if(this.options.activeClass) { + this.element.removeClass(this.options.activeClass); + } + if(this.options.hoverClass) { + this.element.removeClass(this.options.hoverClass); + } + this._trigger("drop", event, this.ui(draggable)); + return this.element; + } + + return false; + + }, + + ui: function(c) { + return { + draggable: (c.currentItem || c.element), + helper: c.helper, + position: c.position, + offset: c.positionAbs + }; + } + +}); + +$.ui.intersect = function(draggable, droppable, toleranceMode) { + + if (!droppable.offset) { + return false; + } + + var draggableLeft, draggableTop, + x1 = (draggable.positionAbs || draggable.position.absolute).left, + y1 = (draggable.positionAbs || draggable.position.absolute).top, + x2 = x1 + draggable.helperProportions.width, + y2 = y1 + draggable.helperProportions.height, + l = droppable.offset.left, + t = droppable.offset.top, + r = l + droppable.proportions().width, + b = t + droppable.proportions().height; + + switch (toleranceMode) { + case "fit": + return (l <= x1 && x2 <= r && t <= y1 && y2 <= b); + case "intersect": + return (l < x1 + (draggable.helperProportions.width / 2) && // Right Half + x2 - (draggable.helperProportions.width / 2) < r && // Left Half + t < y1 + (draggable.helperProportions.height / 2) && // Bottom Half + y2 - (draggable.helperProportions.height / 2) < b ); // Top Half + case "pointer": + draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left); + draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top); + return isOverAxis( draggableTop, t, droppable.proportions().height ) && isOverAxis( draggableLeft, l, droppable.proportions().width ); + case "touch": + return ( + (y1 >= t && y1 <= b) || // Top edge touching + (y2 >= t && y2 <= b) || // Bottom edge touching + (y1 < t && y2 > b) // Surrounded vertically + ) && ( + (x1 >= l && x1 <= r) || // Left edge touching + (x2 >= l && x2 <= r) || // Right edge touching + (x1 < l && x2 > r) // Surrounded horizontally + ); + default: + return false; + } + +}; + +/* + This manager tracks offsets of draggables and droppables +*/ +$.ui.ddmanager = { + current: null, + droppables: { "default": [] }, + prepareOffsets: function(t, event) { + + var i, j, + m = $.ui.ddmanager.droppables[t.options.scope] || [], + type = event ? event.type : null, // workaround for #2317 + list = (t.currentItem || t.element).find(":data(ui-droppable)").addBack(); + + droppablesLoop: for (i = 0; i < m.length; i++) { + + //No disabled and non-accepted + if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) { + continue; + } + + // Filter out elements in the current dragged item + for (j=0; j < list.length; j++) { + if(list[j] === m[i].element[0]) { + m[i].proportions().height = 0; + continue droppablesLoop; + } + } + + m[i].visible = m[i].element.css("display") !== "none"; + if(!m[i].visible) { + continue; + } + + //Activate the droppable if used directly from draggables + if(type === "mousedown") { + m[i]._activate.call(m[i], event); + } + + m[ i ].offset = m[ i ].element.offset(); + m[ i ].proportions({ width: m[ i ].element[ 0 ].offsetWidth, height: m[ i ].element[ 0 ].offsetHeight }); + + } + + }, + drop: function(draggable, event) { + + var dropped = false; + // Create a copy of the droppables in case the list changes during the drop (#9116) + $.each(($.ui.ddmanager.droppables[draggable.options.scope] || []).slice(), function() { + + if(!this.options) { + return; + } + if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance)) { + dropped = this._drop.call(this, event) || dropped; + } + + if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { + this.isout = true; + this.isover = false; + this._deactivate.call(this, event); + } + + }); + return dropped; + + }, + dragStart: function( draggable, event ) { + //Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003) + draggable.element.parentsUntil( "body" ).bind( "scroll.droppable", function() { + if( !draggable.options.refreshPositions ) { + $.ui.ddmanager.prepareOffsets( draggable, event ); + } + }); + }, + drag: function(draggable, event) { + + //If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse. + if(draggable.options.refreshPositions) { + $.ui.ddmanager.prepareOffsets(draggable, event); + } + + //Run through all droppables and check their positions based on specific tolerance options + $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() { + + if(this.options.disabled || this.greedyChild || !this.visible) { + return; + } + + var parentInstance, scope, parent, + intersects = $.ui.intersect(draggable, this, this.options.tolerance), + c = !intersects && this.isover ? "isout" : (intersects && !this.isover ? "isover" : null); + if(!c) { + return; + } + + if (this.options.greedy) { + // find droppable parents with same scope + scope = this.options.scope; + parent = this.element.parents(":data(ui-droppable)").filter(function () { + return $.data(this, "ui-droppable").options.scope === scope; + }); + + if (parent.length) { + parentInstance = $.data(parent[0], "ui-droppable"); + parentInstance.greedyChild = (c === "isover"); + } + } + + // we just moved into a greedy child + if (parentInstance && c === "isover") { + parentInstance.isover = false; + parentInstance.isout = true; + parentInstance._out.call(parentInstance, event); + } + + this[c] = true; + this[c === "isout" ? "isover" : "isout"] = false; + this[c === "isover" ? "_over" : "_out"].call(this, event); + + // we just moved out of a greedy child + if (parentInstance && c === "isout") { + parentInstance.isout = false; + parentInstance.isover = true; + parentInstance._over.call(parentInstance, event); + } + }); + + }, + dragStop: function( draggable, event ) { + draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable" ); + //Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003) + if( !draggable.options.refreshPositions ) { + $.ui.ddmanager.prepareOffsets( draggable, event ); + } + } +}; + +})(jQuery); +(function( $, undefined ) { + +function num(v) { + return parseInt(v, 10) || 0; +} + +function isNumber(value) { + return !isNaN(parseInt(value, 10)); +} + +$.widget("ui.resizable", $.ui.mouse, { + version: "1.10.4", + widgetEventPrefix: "resize", + options: { + alsoResize: false, + animate: false, + animateDuration: "slow", + animateEasing: "swing", + aspectRatio: false, + autoHide: false, + containment: false, + ghost: false, + grid: false, + handles: "e,s,se", + helper: false, + maxHeight: null, + maxWidth: null, + minHeight: 10, + minWidth: 10, + // See #7960 + zIndex: 90, + + // callbacks + resize: null, + start: null, + stop: null + }, + _create: function() { + + var n, i, handle, axis, hname, + that = this, + o = this.options; + this.element.addClass("ui-resizable"); + + $.extend(this, { + _aspectRatio: !!(o.aspectRatio), + aspectRatio: o.aspectRatio, + originalElement: this.element, + _proportionallyResizeElements: [], + _helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null + }); + + //Wrap the element if it cannot hold child nodes + if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) { + + //Create a wrapper element and set the wrapper to the new current internal element + this.element.wrap( + $("
    ").css({ + position: this.element.css("position"), + width: this.element.outerWidth(), + height: this.element.outerHeight(), + top: this.element.css("top"), + left: this.element.css("left") + }) + ); + + //Overwrite the original this.element + this.element = this.element.parent().data( + "ui-resizable", this.element.data("ui-resizable") + ); + + this.elementIsWrapper = true; + + //Move margins to the wrapper + this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") }); + this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0}); + + //Prevent Safari textarea resize + this.originalResizeStyle = this.originalElement.css("resize"); + this.originalElement.css("resize", "none"); + + //Push the actual element to our proportionallyResize internal array + this._proportionallyResizeElements.push(this.originalElement.css({ position: "static", zoom: 1, display: "block" })); + + // avoid IE jump (hard set the margin) + this.originalElement.css({ margin: this.originalElement.css("margin") }); + + // fix handlers offset + this._proportionallyResize(); + + } + + this.handles = o.handles || (!$(".ui-resizable-handle", this.element).length ? "e,s,se" : { n: ".ui-resizable-n", e: ".ui-resizable-e", s: ".ui-resizable-s", w: ".ui-resizable-w", se: ".ui-resizable-se", sw: ".ui-resizable-sw", ne: ".ui-resizable-ne", nw: ".ui-resizable-nw" }); + if(this.handles.constructor === String) { + + if ( this.handles === "all") { + this.handles = "n,e,s,w,se,sw,ne,nw"; + } + + n = this.handles.split(","); + this.handles = {}; + + for(i = 0; i < n.length; i++) { + + handle = $.trim(n[i]); + hname = "ui-resizable-"+handle; + axis = $("
    "); + + // Apply zIndex to all handles - see #7960 + axis.css({ zIndex: o.zIndex }); + + //TODO : What's going on here? + if ("se" === handle) { + axis.addClass("ui-icon ui-icon-gripsmall-diagonal-se"); + } + + //Insert into internal handles object and append to element + this.handles[handle] = ".ui-resizable-"+handle; + this.element.append(axis); + } + + } + + this._renderAxis = function(target) { + + var i, axis, padPos, padWrapper; + + target = target || this.element; + + for(i in this.handles) { + + if(this.handles[i].constructor === String) { + this.handles[i] = $(this.handles[i], this.element).show(); + } + + //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls) + if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) { + + axis = $(this.handles[i], this.element); + + //Checking the correct pad and border + padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth(); + + //The padding type i have to apply... + padPos = [ "padding", + /ne|nw|n/.test(i) ? "Top" : + /se|sw|s/.test(i) ? "Bottom" : + /^e$/.test(i) ? "Right" : "Left" ].join(""); + + target.css(padPos, padWrapper); + + this._proportionallyResize(); + + } + + //TODO: What's that good for? There's not anything to be executed left + if(!$(this.handles[i]).length) { + continue; + } + } + }; + + //TODO: make renderAxis a prototype function + this._renderAxis(this.element); + + this._handles = $(".ui-resizable-handle", this.element) + .disableSelection(); + + //Matching axis name + this._handles.mouseover(function() { + if (!that.resizing) { + if (this.className) { + axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i); + } + //Axis, default = se + that.axis = axis && axis[1] ? axis[1] : "se"; + } + }); + + //If we want to auto hide the elements + if (o.autoHide) { + this._handles.hide(); + $(this.element) + .addClass("ui-resizable-autohide") + .mouseenter(function() { + if (o.disabled) { + return; + } + $(this).removeClass("ui-resizable-autohide"); + that._handles.show(); + }) + .mouseleave(function(){ + if (o.disabled) { + return; + } + if (!that.resizing) { + $(this).addClass("ui-resizable-autohide"); + that._handles.hide(); + } + }); + } + + //Initialize the mouse interaction + this._mouseInit(); + + }, + + _destroy: function() { + + this._mouseDestroy(); + + var wrapper, + _destroy = function(exp) { + $(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing") + .removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove(); + }; + + //TODO: Unwrap at same DOM position + if (this.elementIsWrapper) { + _destroy(this.element); + wrapper = this.element; + this.originalElement.css({ + position: wrapper.css("position"), + width: wrapper.outerWidth(), + height: wrapper.outerHeight(), + top: wrapper.css("top"), + left: wrapper.css("left") + }).insertAfter( wrapper ); + wrapper.remove(); + } + + this.originalElement.css("resize", this.originalResizeStyle); + _destroy(this.originalElement); + + return this; + }, + + _mouseCapture: function(event) { + var i, handle, + capture = false; + + for (i in this.handles) { + handle = $(this.handles[i])[0]; + if (handle === event.target || $.contains(handle, event.target)) { + capture = true; + } + } + + return !this.options.disabled && capture; + }, + + _mouseStart: function(event) { + + var curleft, curtop, cursor, + o = this.options, + iniPos = this.element.position(), + el = this.element; + + this.resizing = true; + + // bugfix for http://dev.jquery.com/ticket/1749 + if ( (/absolute/).test( el.css("position") ) ) { + el.css({ position: "absolute", top: el.css("top"), left: el.css("left") }); + } else if (el.is(".ui-draggable")) { + el.css({ position: "absolute", top: iniPos.top, left: iniPos.left }); + } + + this._renderProxy(); + + curleft = num(this.helper.css("left")); + curtop = num(this.helper.css("top")); + + if (o.containment) { + curleft += $(o.containment).scrollLeft() || 0; + curtop += $(o.containment).scrollTop() || 0; + } + + //Store needed variables + this.offset = this.helper.offset(); + this.position = { left: curleft, top: curtop }; + this.size = this._helper ? { width: this.helper.width(), height: this.helper.height() } : { width: el.width(), height: el.height() }; + this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() }; + this.originalPosition = { left: curleft, top: curtop }; + this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() }; + this.originalMousePosition = { left: event.pageX, top: event.pageY }; + + //Aspect Ratio + this.aspectRatio = (typeof o.aspectRatio === "number") ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1); + + cursor = $(".ui-resizable-" + this.axis).css("cursor"); + $("body").css("cursor", cursor === "auto" ? this.axis + "-resize" : cursor); + + el.addClass("ui-resizable-resizing"); + this._propagate("start", event); + return true; + }, + + _mouseDrag: function(event) { + + //Increase performance, avoid regex + var data, + el = this.helper, props = {}, + smp = this.originalMousePosition, + a = this.axis, + prevTop = this.position.top, + prevLeft = this.position.left, + prevWidth = this.size.width, + prevHeight = this.size.height, + dx = (event.pageX-smp.left)||0, + dy = (event.pageY-smp.top)||0, + trigger = this._change[a]; + + if (!trigger) { + return false; + } + + // Calculate the attrs that will be change + data = trigger.apply(this, [event, dx, dy]); + + // Put this in the mouseDrag handler since the user can start pressing shift while resizing + this._updateVirtualBoundaries(event.shiftKey); + if (this._aspectRatio || event.shiftKey) { + data = this._updateRatio(data, event); + } + + data = this._respectSize(data, event); + + this._updateCache(data); + + // plugins callbacks need to be called first + this._propagate("resize", event); + + if (this.position.top !== prevTop) { + props.top = this.position.top + "px"; + } + if (this.position.left !== prevLeft) { + props.left = this.position.left + "px"; + } + if (this.size.width !== prevWidth) { + props.width = this.size.width + "px"; + } + if (this.size.height !== prevHeight) { + props.height = this.size.height + "px"; + } + el.css(props); + + if (!this._helper && this._proportionallyResizeElements.length) { + this._proportionallyResize(); + } + + // Call the user callback if the element was resized + if ( ! $.isEmptyObject(props) ) { + this._trigger("resize", event, this.ui()); + } + + return false; + }, + + _mouseStop: function(event) { + + this.resizing = false; + var pr, ista, soffseth, soffsetw, s, left, top, + o = this.options, that = this; + + if(this._helper) { + + pr = this._proportionallyResizeElements; + ista = pr.length && (/textarea/i).test(pr[0].nodeName); + soffseth = ista && $.ui.hasScroll(pr[0], "left") /* TODO - jump height */ ? 0 : that.sizeDiff.height; + soffsetw = ista ? 0 : that.sizeDiff.width; + + s = { width: (that.helper.width() - soffsetw), height: (that.helper.height() - soffseth) }; + left = (parseInt(that.element.css("left"), 10) + (that.position.left - that.originalPosition.left)) || null; + top = (parseInt(that.element.css("top"), 10) + (that.position.top - that.originalPosition.top)) || null; + + if (!o.animate) { + this.element.css($.extend(s, { top: top, left: left })); + } + + that.helper.height(that.size.height); + that.helper.width(that.size.width); + + if (this._helper && !o.animate) { + this._proportionallyResize(); + } + } + + $("body").css("cursor", "auto"); + + this.element.removeClass("ui-resizable-resizing"); + + this._propagate("stop", event); + + if (this._helper) { + this.helper.remove(); + } + + return false; + + }, + + _updateVirtualBoundaries: function(forceAspectRatio) { + var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b, + o = this.options; + + b = { + minWidth: isNumber(o.minWidth) ? o.minWidth : 0, + maxWidth: isNumber(o.maxWidth) ? o.maxWidth : Infinity, + minHeight: isNumber(o.minHeight) ? o.minHeight : 0, + maxHeight: isNumber(o.maxHeight) ? o.maxHeight : Infinity + }; + + if(this._aspectRatio || forceAspectRatio) { + // We want to create an enclosing box whose aspect ration is the requested one + // First, compute the "projected" size for each dimension based on the aspect ratio and other dimension + pMinWidth = b.minHeight * this.aspectRatio; + pMinHeight = b.minWidth / this.aspectRatio; + pMaxWidth = b.maxHeight * this.aspectRatio; + pMaxHeight = b.maxWidth / this.aspectRatio; + + if(pMinWidth > b.minWidth) { + b.minWidth = pMinWidth; + } + if(pMinHeight > b.minHeight) { + b.minHeight = pMinHeight; + } + if(pMaxWidth < b.maxWidth) { + b.maxWidth = pMaxWidth; + } + if(pMaxHeight < b.maxHeight) { + b.maxHeight = pMaxHeight; + } + } + this._vBoundaries = b; + }, + + _updateCache: function(data) { + this.offset = this.helper.offset(); + if (isNumber(data.left)) { + this.position.left = data.left; + } + if (isNumber(data.top)) { + this.position.top = data.top; + } + if (isNumber(data.height)) { + this.size.height = data.height; + } + if (isNumber(data.width)) { + this.size.width = data.width; + } + }, + + _updateRatio: function( data ) { + + var cpos = this.position, + csize = this.size, + a = this.axis; + + if (isNumber(data.height)) { + data.width = (data.height * this.aspectRatio); + } else if (isNumber(data.width)) { + data.height = (data.width / this.aspectRatio); + } + + if (a === "sw") { + data.left = cpos.left + (csize.width - data.width); + data.top = null; + } + if (a === "nw") { + data.top = cpos.top + (csize.height - data.height); + data.left = cpos.left + (csize.width - data.width); + } + + return data; + }, + + _respectSize: function( data ) { + + var o = this._vBoundaries, + a = this.axis, + ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height), + isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height), + dw = this.originalPosition.left + this.originalSize.width, + dh = this.position.top + this.size.height, + cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a); + if (isminw) { + data.width = o.minWidth; + } + if (isminh) { + data.height = o.minHeight; + } + if (ismaxw) { + data.width = o.maxWidth; + } + if (ismaxh) { + data.height = o.maxHeight; + } + + if (isminw && cw) { + data.left = dw - o.minWidth; + } + if (ismaxw && cw) { + data.left = dw - o.maxWidth; + } + if (isminh && ch) { + data.top = dh - o.minHeight; + } + if (ismaxh && ch) { + data.top = dh - o.maxHeight; + } + + // fixing jump error on top/left - bug #2330 + if (!data.width && !data.height && !data.left && data.top) { + data.top = null; + } else if (!data.width && !data.height && !data.top && data.left) { + data.left = null; + } + + return data; + }, + + _proportionallyResize: function() { + + if (!this._proportionallyResizeElements.length) { + return; + } + + var i, j, borders, paddings, prel, + element = this.helper || this.element; + + for ( i=0; i < this._proportionallyResizeElements.length; i++) { + + prel = this._proportionallyResizeElements[i]; + + if (!this.borderDif) { + this.borderDif = []; + borders = [prel.css("borderTopWidth"), prel.css("borderRightWidth"), prel.css("borderBottomWidth"), prel.css("borderLeftWidth")]; + paddings = [prel.css("paddingTop"), prel.css("paddingRight"), prel.css("paddingBottom"), prel.css("paddingLeft")]; + + for ( j = 0; j < borders.length; j++ ) { + this.borderDif[ j ] = ( parseInt( borders[ j ], 10 ) || 0 ) + ( parseInt( paddings[ j ], 10 ) || 0 ); + } + } + + prel.css({ + height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0, + width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0 + }); + + } + + }, + + _renderProxy: function() { + + var el = this.element, o = this.options; + this.elementOffset = el.offset(); + + if(this._helper) { + + this.helper = this.helper || $("
    "); + + this.helper.addClass(this._helper).css({ + width: this.element.outerWidth() - 1, + height: this.element.outerHeight() - 1, + position: "absolute", + left: this.elementOffset.left +"px", + top: this.elementOffset.top +"px", + zIndex: ++o.zIndex //TODO: Don't modify option + }); + + this.helper + .appendTo("body") + .disableSelection(); + + } else { + this.helper = this.element; + } + + }, + + _change: { + e: function(event, dx) { + return { width: this.originalSize.width + dx }; + }, + w: function(event, dx) { + var cs = this.originalSize, sp = this.originalPosition; + return { left: sp.left + dx, width: cs.width - dx }; + }, + n: function(event, dx, dy) { + var cs = this.originalSize, sp = this.originalPosition; + return { top: sp.top + dy, height: cs.height - dy }; + }, + s: function(event, dx, dy) { + return { height: this.originalSize.height + dy }; + }, + se: function(event, dx, dy) { + return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy])); + }, + sw: function(event, dx, dy) { + return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy])); + }, + ne: function(event, dx, dy) { + return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy])); + }, + nw: function(event, dx, dy) { + return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy])); + } + }, + + _propagate: function(n, event) { + $.ui.plugin.call(this, n, [event, this.ui()]); + (n !== "resize" && this._trigger(n, event, this.ui())); + }, + + plugins: {}, + + ui: function() { + return { + originalElement: this.originalElement, + element: this.element, + helper: this.helper, + position: this.position, + size: this.size, + originalSize: this.originalSize, + originalPosition: this.originalPosition + }; + } + +}); + +/* + * Resizable Extensions + */ + +$.ui.plugin.add("resizable", "animate", { + + stop: function( event ) { + var that = $(this).data("ui-resizable"), + o = that.options, + pr = that._proportionallyResizeElements, + ista = pr.length && (/textarea/i).test(pr[0].nodeName), + soffseth = ista && $.ui.hasScroll(pr[0], "left") /* TODO - jump height */ ? 0 : that.sizeDiff.height, + soffsetw = ista ? 0 : that.sizeDiff.width, + style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) }, + left = (parseInt(that.element.css("left"), 10) + (that.position.left - that.originalPosition.left)) || null, + top = (parseInt(that.element.css("top"), 10) + (that.position.top - that.originalPosition.top)) || null; + + that.element.animate( + $.extend(style, top && left ? { top: top, left: left } : {}), { + duration: o.animateDuration, + easing: o.animateEasing, + step: function() { + + var data = { + width: parseInt(that.element.css("width"), 10), + height: parseInt(that.element.css("height"), 10), + top: parseInt(that.element.css("top"), 10), + left: parseInt(that.element.css("left"), 10) + }; + + if (pr && pr.length) { + $(pr[0]).css({ width: data.width, height: data.height }); + } + + // propagating resize, and updating values for each animation step + that._updateCache(data); + that._propagate("resize", event); + + } + } + ); + } + +}); + +$.ui.plugin.add("resizable", "containment", { + + start: function() { + var element, p, co, ch, cw, width, height, + that = $(this).data("ui-resizable"), + o = that.options, + el = that.element, + oc = o.containment, + ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc; + + if (!ce) { + return; + } + + that.containerElement = $(ce); + + if (/document/.test(oc) || oc === document) { + that.containerOffset = { left: 0, top: 0 }; + that.containerPosition = { left: 0, top: 0 }; + + that.parentData = { + element: $(document), left: 0, top: 0, + width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight + }; + } + + // i'm a node, so compute top, left, right, bottom + else { + element = $(ce); + p = []; + $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); }); + + that.containerOffset = element.offset(); + that.containerPosition = element.position(); + that.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) }; + + co = that.containerOffset; + ch = that.containerSize.height; + cw = that.containerSize.width; + width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ); + height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch); + + that.parentData = { + element: ce, left: co.left, top: co.top, width: width, height: height + }; + } + }, + + resize: function( event ) { + var woset, hoset, isParent, isOffsetRelative, + that = $(this).data("ui-resizable"), + o = that.options, + co = that.containerOffset, cp = that.position, + pRatio = that._aspectRatio || event.shiftKey, + cop = { top:0, left:0 }, ce = that.containerElement; + + if (ce[0] !== document && (/static/).test(ce.css("position"))) { + cop = co; + } + + if (cp.left < (that._helper ? co.left : 0)) { + that.size.width = that.size.width + (that._helper ? (that.position.left - co.left) : (that.position.left - cop.left)); + if (pRatio) { + that.size.height = that.size.width / that.aspectRatio; + } + that.position.left = o.helper ? co.left : 0; + } + + if (cp.top < (that._helper ? co.top : 0)) { + that.size.height = that.size.height + (that._helper ? (that.position.top - co.top) : that.position.top); + if (pRatio) { + that.size.width = that.size.height * that.aspectRatio; + } + that.position.top = that._helper ? co.top : 0; + } + + that.offset.left = that.parentData.left+that.position.left; + that.offset.top = that.parentData.top+that.position.top; + + woset = Math.abs( (that._helper ? that.offset.left - cop.left : (that.offset.left - cop.left)) + that.sizeDiff.width ); + hoset = Math.abs( (that._helper ? that.offset.top - cop.top : (that.offset.top - co.top)) + that.sizeDiff.height ); + + isParent = that.containerElement.get(0) === that.element.parent().get(0); + isOffsetRelative = /relative|absolute/.test(that.containerElement.css("position")); + + if ( isParent && isOffsetRelative ) { + woset -= Math.abs( that.parentData.left ); + } + + if (woset + that.size.width >= that.parentData.width) { + that.size.width = that.parentData.width - woset; + if (pRatio) { + that.size.height = that.size.width / that.aspectRatio; + } + } + + if (hoset + that.size.height >= that.parentData.height) { + that.size.height = that.parentData.height - hoset; + if (pRatio) { + that.size.width = that.size.height * that.aspectRatio; + } + } + }, + + stop: function(){ + var that = $(this).data("ui-resizable"), + o = that.options, + co = that.containerOffset, + cop = that.containerPosition, + ce = that.containerElement, + helper = $(that.helper), + ho = helper.offset(), + w = helper.outerWidth() - that.sizeDiff.width, + h = helper.outerHeight() - that.sizeDiff.height; + + if (that._helper && !o.animate && (/relative/).test(ce.css("position"))) { + $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h }); + } + + if (that._helper && !o.animate && (/static/).test(ce.css("position"))) { + $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h }); + } + + } +}); + +$.ui.plugin.add("resizable", "alsoResize", { + + start: function () { + var that = $(this).data("ui-resizable"), + o = that.options, + _store = function (exp) { + $(exp).each(function() { + var el = $(this); + el.data("ui-resizable-alsoresize", { + width: parseInt(el.width(), 10), height: parseInt(el.height(), 10), + left: parseInt(el.css("left"), 10), top: parseInt(el.css("top"), 10) + }); + }); + }; + + if (typeof(o.alsoResize) === "object" && !o.alsoResize.parentNode) { + if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); } + else { $.each(o.alsoResize, function (exp) { _store(exp); }); } + }else{ + _store(o.alsoResize); + } + }, + + resize: function (event, ui) { + var that = $(this).data("ui-resizable"), + o = that.options, + os = that.originalSize, + op = that.originalPosition, + delta = { + height: (that.size.height - os.height) || 0, width: (that.size.width - os.width) || 0, + top: (that.position.top - op.top) || 0, left: (that.position.left - op.left) || 0 + }, + + _alsoResize = function (exp, c) { + $(exp).each(function() { + var el = $(this), start = $(this).data("ui-resizable-alsoresize"), style = {}, + css = c && c.length ? c : el.parents(ui.originalElement[0]).length ? ["width", "height"] : ["width", "height", "top", "left"]; + + $.each(css, function (i, prop) { + var sum = (start[prop]||0) + (delta[prop]||0); + if (sum && sum >= 0) { + style[prop] = sum || null; + } + }); + + el.css(style); + }); + }; + + if (typeof(o.alsoResize) === "object" && !o.alsoResize.nodeType) { + $.each(o.alsoResize, function (exp, c) { _alsoResize(exp, c); }); + }else{ + _alsoResize(o.alsoResize); + } + }, + + stop: function () { + $(this).removeData("resizable-alsoresize"); + } +}); + +$.ui.plugin.add("resizable", "ghost", { + + start: function() { + + var that = $(this).data("ui-resizable"), o = that.options, cs = that.size; + + that.ghost = that.originalElement.clone(); + that.ghost + .css({ opacity: 0.25, display: "block", position: "relative", height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 }) + .addClass("ui-resizable-ghost") + .addClass(typeof o.ghost === "string" ? o.ghost : ""); + + that.ghost.appendTo(that.helper); + + }, + + resize: function(){ + var that = $(this).data("ui-resizable"); + if (that.ghost) { + that.ghost.css({ position: "relative", height: that.size.height, width: that.size.width }); + } + }, + + stop: function() { + var that = $(this).data("ui-resizable"); + if (that.ghost && that.helper) { + that.helper.get(0).removeChild(that.ghost.get(0)); + } + } + +}); + +$.ui.plugin.add("resizable", "grid", { + + resize: function() { + var that = $(this).data("ui-resizable"), + o = that.options, + cs = that.size, + os = that.originalSize, + op = that.originalPosition, + a = that.axis, + grid = typeof o.grid === "number" ? [o.grid, o.grid] : o.grid, + gridX = (grid[0]||1), + gridY = (grid[1]||1), + ox = Math.round((cs.width - os.width) / gridX) * gridX, + oy = Math.round((cs.height - os.height) / gridY) * gridY, + newWidth = os.width + ox, + newHeight = os.height + oy, + isMaxWidth = o.maxWidth && (o.maxWidth < newWidth), + isMaxHeight = o.maxHeight && (o.maxHeight < newHeight), + isMinWidth = o.minWidth && (o.minWidth > newWidth), + isMinHeight = o.minHeight && (o.minHeight > newHeight); + + o.grid = grid; + + if (isMinWidth) { + newWidth = newWidth + gridX; + } + if (isMinHeight) { + newHeight = newHeight + gridY; + } + if (isMaxWidth) { + newWidth = newWidth - gridX; + } + if (isMaxHeight) { + newHeight = newHeight - gridY; + } + + if (/^(se|s|e)$/.test(a)) { + that.size.width = newWidth; + that.size.height = newHeight; + } else if (/^(ne)$/.test(a)) { + that.size.width = newWidth; + that.size.height = newHeight; + that.position.top = op.top - oy; + } else if (/^(sw)$/.test(a)) { + that.size.width = newWidth; + that.size.height = newHeight; + that.position.left = op.left - ox; + } else { + if ( newHeight - gridY > 0 ) { + that.size.height = newHeight; + that.position.top = op.top - oy; + } else { + that.size.height = gridY; + that.position.top = op.top + os.height - gridY; + } + if ( newWidth - gridX > 0 ) { + that.size.width = newWidth; + that.position.left = op.left - ox; + } else { + that.size.width = gridX; + that.position.left = op.left + os.width - gridX; + } + } + } + +}); + +})(jQuery); +(function( $, undefined ) { + +$.widget("ui.selectable", $.ui.mouse, { + version: "1.10.4", + options: { + appendTo: "body", + autoRefresh: true, + distance: 0, + filter: "*", + tolerance: "touch", + + // callbacks + selected: null, + selecting: null, + start: null, + stop: null, + unselected: null, + unselecting: null + }, + _create: function() { + var selectees, + that = this; + + this.element.addClass("ui-selectable"); + + this.dragged = false; + + // cache selectee children based on filter + this.refresh = function() { + selectees = $(that.options.filter, that.element[0]); + selectees.addClass("ui-selectee"); + selectees.each(function() { + var $this = $(this), + pos = $this.offset(); + $.data(this, "selectable-item", { + element: this, + $element: $this, + left: pos.left, + top: pos.top, + right: pos.left + $this.outerWidth(), + bottom: pos.top + $this.outerHeight(), + startselected: false, + selected: $this.hasClass("ui-selected"), + selecting: $this.hasClass("ui-selecting"), + unselecting: $this.hasClass("ui-unselecting") + }); + }); + }; + this.refresh(); + + this.selectees = selectees.addClass("ui-selectee"); + + this._mouseInit(); + + this.helper = $("
    "); + }, + + _destroy: function() { + this.selectees + .removeClass("ui-selectee") + .removeData("selectable-item"); + this.element + .removeClass("ui-selectable ui-selectable-disabled"); + this._mouseDestroy(); + }, + + _mouseStart: function(event) { + var that = this, + options = this.options; + + this.opos = [event.pageX, event.pageY]; + + if (this.options.disabled) { + return; + } + + this.selectees = $(options.filter, this.element[0]); + + this._trigger("start", event); + + $(options.appendTo).append(this.helper); + // position helper (lasso) + this.helper.css({ + "left": event.pageX, + "top": event.pageY, + "width": 0, + "height": 0 + }); + + if (options.autoRefresh) { + this.refresh(); + } + + this.selectees.filter(".ui-selected").each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.startselected = true; + if (!event.metaKey && !event.ctrlKey) { + selectee.$element.removeClass("ui-selected"); + selectee.selected = false; + selectee.$element.addClass("ui-unselecting"); + selectee.unselecting = true; + // selectable UNSELECTING callback + that._trigger("unselecting", event, { + unselecting: selectee.element + }); + } + }); + + $(event.target).parents().addBack().each(function() { + var doSelect, + selectee = $.data(this, "selectable-item"); + if (selectee) { + doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass("ui-selected"); + selectee.$element + .removeClass(doSelect ? "ui-unselecting" : "ui-selected") + .addClass(doSelect ? "ui-selecting" : "ui-unselecting"); + selectee.unselecting = !doSelect; + selectee.selecting = doSelect; + selectee.selected = doSelect; + // selectable (UN)SELECTING callback + if (doSelect) { + that._trigger("selecting", event, { + selecting: selectee.element + }); + } else { + that._trigger("unselecting", event, { + unselecting: selectee.element + }); + } + return false; + } + }); + + }, + + _mouseDrag: function(event) { + + this.dragged = true; + + if (this.options.disabled) { + return; + } + + var tmp, + that = this, + options = this.options, + x1 = this.opos[0], + y1 = this.opos[1], + x2 = event.pageX, + y2 = event.pageY; + + if (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; } + if (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; } + this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1}); + + this.selectees.each(function() { + var selectee = $.data(this, "selectable-item"), + hit = false; + + //prevent helper from being selected if appendTo: selectable + if (!selectee || selectee.element === that.element[0]) { + return; + } + + if (options.tolerance === "touch") { + hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) ); + } else if (options.tolerance === "fit") { + hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2); + } + + if (hit) { + // SELECT + if (selectee.selected) { + selectee.$element.removeClass("ui-selected"); + selectee.selected = false; + } + if (selectee.unselecting) { + selectee.$element.removeClass("ui-unselecting"); + selectee.unselecting = false; + } + if (!selectee.selecting) { + selectee.$element.addClass("ui-selecting"); + selectee.selecting = true; + // selectable SELECTING callback + that._trigger("selecting", event, { + selecting: selectee.element + }); + } + } else { + // UNSELECT + if (selectee.selecting) { + if ((event.metaKey || event.ctrlKey) && selectee.startselected) { + selectee.$element.removeClass("ui-selecting"); + selectee.selecting = false; + selectee.$element.addClass("ui-selected"); + selectee.selected = true; + } else { + selectee.$element.removeClass("ui-selecting"); + selectee.selecting = false; + if (selectee.startselected) { + selectee.$element.addClass("ui-unselecting"); + selectee.unselecting = true; + } + // selectable UNSELECTING callback + that._trigger("unselecting", event, { + unselecting: selectee.element + }); + } + } + if (selectee.selected) { + if (!event.metaKey && !event.ctrlKey && !selectee.startselected) { + selectee.$element.removeClass("ui-selected"); + selectee.selected = false; + + selectee.$element.addClass("ui-unselecting"); + selectee.unselecting = true; + // selectable UNSELECTING callback + that._trigger("unselecting", event, { + unselecting: selectee.element + }); + } + } + } + }); + + return false; + }, + + _mouseStop: function(event) { + var that = this; + + this.dragged = false; + + $(".ui-unselecting", this.element[0]).each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.$element.removeClass("ui-unselecting"); + selectee.unselecting = false; + selectee.startselected = false; + that._trigger("unselected", event, { + unselected: selectee.element + }); + }); + $(".ui-selecting", this.element[0]).each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.$element.removeClass("ui-selecting").addClass("ui-selected"); + selectee.selecting = false; + selectee.selected = true; + selectee.startselected = true; + that._trigger("selected", event, { + selected: selectee.element + }); + }); + this._trigger("stop", event); + + this.helper.remove(); + + return false; + } + +}); + +})(jQuery); +(function( $, undefined ) { + +function isOverAxis( x, reference, size ) { + return ( x > reference ) && ( x < ( reference + size ) ); +} + +function isFloating(item) { + return (/left|right/).test(item.css("float")) || (/inline|table-cell/).test(item.css("display")); +} + +$.widget("ui.sortable", $.ui.mouse, { + version: "1.10.4", + widgetEventPrefix: "sort", + ready: false, + options: { + appendTo: "parent", + axis: false, + connectWith: false, + containment: false, + cursor: "auto", + cursorAt: false, + dropOnEmpty: true, + forcePlaceholderSize: false, + forceHelperSize: false, + grid: false, + handle: false, + helper: "original", + items: "> *", + opacity: false, + placeholder: false, + revert: false, + scroll: true, + scrollSensitivity: 20, + scrollSpeed: 20, + scope: "default", + tolerance: "intersect", + zIndex: 1000, + + // callbacks + activate: null, + beforeStop: null, + change: null, + deactivate: null, + out: null, + over: null, + receive: null, + remove: null, + sort: null, + start: null, + stop: null, + update: null + }, + _create: function() { + + var o = this.options; + this.containerCache = {}; + this.element.addClass("ui-sortable"); + + //Get the items + this.refresh(); + + //Let's determine if the items are being displayed horizontally + this.floating = this.items.length ? o.axis === "x" || isFloating(this.items[0].item) : false; + + //Let's determine the parent's offset + this.offset = this.element.offset(); + + //Initialize mouse events for interaction + this._mouseInit(); + + //We're ready to go + this.ready = true; + + }, + + _destroy: function() { + this.element + .removeClass("ui-sortable ui-sortable-disabled"); + this._mouseDestroy(); + + for ( var i = this.items.length - 1; i >= 0; i-- ) { + this.items[i].item.removeData(this.widgetName + "-item"); + } + + return this; + }, + + _setOption: function(key, value){ + if ( key === "disabled" ) { + this.options[ key ] = value; + + this.widget().toggleClass( "ui-sortable-disabled", !!value ); + } else { + // Don't call widget base _setOption for disable as it adds ui-state-disabled class + $.Widget.prototype._setOption.apply(this, arguments); + } + }, + + _mouseCapture: function(event, overrideHandle) { + var currentItem = null, + validHandle = false, + that = this; + + if (this.reverting) { + return false; + } + + if(this.options.disabled || this.options.type === "static") { + return false; + } + + //We have to refresh the items data once first + this._refreshItems(event); + + //Find out if the clicked node (or one of its parents) is a actual item in this.items + $(event.target).parents().each(function() { + if($.data(this, that.widgetName + "-item") === that) { + currentItem = $(this); + return false; + } + }); + if($.data(event.target, that.widgetName + "-item") === that) { + currentItem = $(event.target); + } + + if(!currentItem) { + return false; + } + if(this.options.handle && !overrideHandle) { + $(this.options.handle, currentItem).find("*").addBack().each(function() { + if(this === event.target) { + validHandle = true; + } + }); + if(!validHandle) { + return false; + } + } + + this.currentItem = currentItem; + this._removeCurrentsFromItems(); + return true; + + }, + + _mouseStart: function(event, overrideHandle, noActivation) { + + var i, body, + o = this.options; + + this.currentContainer = this; + + //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture + this.refreshPositions(); + + //Create and append the visible helper + this.helper = this._createHelper(event); + + //Cache the helper size + this._cacheHelperProportions(); + + /* + * - Position generation - + * This block generates everything position related - it's the core of draggables. + */ + + //Cache the margins of the original element + this._cacheMargins(); + + //Get the next scrolling parent + this.scrollParent = this.helper.scrollParent(); + + //The element's absolute position on the page minus margins + this.offset = this.currentItem.offset(); + this.offset = { + top: this.offset.top - this.margins.top, + left: this.offset.left - this.margins.left + }; + + $.extend(this.offset, { + click: { //Where the click happened, relative to the element + left: event.pageX - this.offset.left, + top: event.pageY - this.offset.top + }, + parent: this._getParentOffset(), + relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper + }); + + // Only after we got the offset, we can change the helper's position to absolute + // TODO: Still need to figure out a way to make relative sorting possible + this.helper.css("position", "absolute"); + this.cssPosition = this.helper.css("position"); + + //Generate the original position + this.originalPosition = this._generatePosition(event); + this.originalPageX = event.pageX; + this.originalPageY = event.pageY; + + //Adjust the mouse offset relative to the helper if "cursorAt" is supplied + (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt)); + + //Cache the former DOM position + this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] }; + + //If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way + if(this.helper[0] !== this.currentItem[0]) { + this.currentItem.hide(); + } + + //Create the placeholder + this._createPlaceholder(); + + //Set a containment if given in the options + if(o.containment) { + this._setContainment(); + } + + if( o.cursor && o.cursor !== "auto" ) { // cursor option + body = this.document.find( "body" ); + + // support: IE + this.storedCursor = body.css( "cursor" ); + body.css( "cursor", o.cursor ); + + this.storedStylesheet = $( "" ).appendTo( body ); + } + + if(o.opacity) { // opacity option + if (this.helper.css("opacity")) { + this._storedOpacity = this.helper.css("opacity"); + } + this.helper.css("opacity", o.opacity); + } + + if(o.zIndex) { // zIndex option + if (this.helper.css("zIndex")) { + this._storedZIndex = this.helper.css("zIndex"); + } + this.helper.css("zIndex", o.zIndex); + } + + //Prepare scrolling + if(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== "HTML") { + this.overflowOffset = this.scrollParent.offset(); + } + + //Call callbacks + this._trigger("start", event, this._uiHash()); + + //Recache the helper size + if(!this._preserveHelperProportions) { + this._cacheHelperProportions(); + } + + + //Post "activate" events to possible containers + if( !noActivation ) { + for ( i = this.containers.length - 1; i >= 0; i-- ) { + this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) ); + } + } + + //Prepare possible droppables + if($.ui.ddmanager) { + $.ui.ddmanager.current = this; + } + + if ($.ui.ddmanager && !o.dropBehaviour) { + $.ui.ddmanager.prepareOffsets(this, event); + } + + this.dragging = true; + + this.helper.addClass("ui-sortable-helper"); + this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position + return true; + + }, + + _mouseDrag: function(event) { + var i, item, itemElement, intersection, + o = this.options, + scrolled = false; + + //Compute the helpers position + this.position = this._generatePosition(event); + this.positionAbs = this._convertPositionTo("absolute"); + + if (!this.lastPositionAbs) { + this.lastPositionAbs = this.positionAbs; + } + + //Do scrolling + if(this.options.scroll) { + if(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== "HTML") { + + if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) { + this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed; + } else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) { + this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed; + } + + if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) { + this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed; + } else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) { + this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed; + } + + } else { + + if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) { + scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed); + } else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) { + scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed); + } + + if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) { + scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed); + } else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) { + scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed); + } + + } + + if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) { + $.ui.ddmanager.prepareOffsets(this, event); + } + } + + //Regenerate the absolute position used for position checks + this.positionAbs = this._convertPositionTo("absolute"); + + //Set the helper position + if(!this.options.axis || this.options.axis !== "y") { + this.helper[0].style.left = this.position.left+"px"; + } + if(!this.options.axis || this.options.axis !== "x") { + this.helper[0].style.top = this.position.top+"px"; + } + + //Rearrange + for (i = this.items.length - 1; i >= 0; i--) { + + //Cache variables and intersection, continue if no intersection + item = this.items[i]; + itemElement = item.item[0]; + intersection = this._intersectsWithPointer(item); + if (!intersection) { + continue; + } + + // Only put the placeholder inside the current Container, skip all + // items from other containers. This works because when moving + // an item from one container to another the + // currentContainer is switched before the placeholder is moved. + // + // Without this, moving items in "sub-sortables" can cause + // the placeholder to jitter beetween the outer and inner container. + if (item.instance !== this.currentContainer) { + continue; + } + + // cannot intersect with itself + // no useless actions that have been done before + // no action if the item moved is the parent of the item checked + if (itemElement !== this.currentItem[0] && + this.placeholder[intersection === 1 ? "next" : "prev"]()[0] !== itemElement && + !$.contains(this.placeholder[0], itemElement) && + (this.options.type === "semi-dynamic" ? !$.contains(this.element[0], itemElement) : true) + ) { + + this.direction = intersection === 1 ? "down" : "up"; + + if (this.options.tolerance === "pointer" || this._intersectsWithSides(item)) { + this._rearrange(event, item); + } else { + break; + } + + this._trigger("change", event, this._uiHash()); + break; + } + } + + //Post events to containers + this._contactContainers(event); + + //Interconnect with droppables + if($.ui.ddmanager) { + $.ui.ddmanager.drag(this, event); + } + + //Call callbacks + this._trigger("sort", event, this._uiHash()); + + this.lastPositionAbs = this.positionAbs; + return false; + + }, + + _mouseStop: function(event, noPropagation) { + + if(!event) { + return; + } + + //If we are using droppables, inform the manager about the drop + if ($.ui.ddmanager && !this.options.dropBehaviour) { + $.ui.ddmanager.drop(this, event); + } + + if(this.options.revert) { + var that = this, + cur = this.placeholder.offset(), + axis = this.options.axis, + animation = {}; + + if ( !axis || axis === "x" ) { + animation.left = cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollLeft); + } + if ( !axis || axis === "y" ) { + animation.top = cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollTop); + } + this.reverting = true; + $(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() { + that._clear(event); + }); + } else { + this._clear(event, noPropagation); + } + + return false; + + }, + + cancel: function() { + + if(this.dragging) { + + this._mouseUp({ target: null }); + + if(this.options.helper === "original") { + this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"); + } else { + this.currentItem.show(); + } + + //Post deactivating events to containers + for (var i = this.containers.length - 1; i >= 0; i--){ + this.containers[i]._trigger("deactivate", null, this._uiHash(this)); + if(this.containers[i].containerCache.over) { + this.containers[i]._trigger("out", null, this._uiHash(this)); + this.containers[i].containerCache.over = 0; + } + } + + } + + if (this.placeholder) { + //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node! + if(this.placeholder[0].parentNode) { + this.placeholder[0].parentNode.removeChild(this.placeholder[0]); + } + if(this.options.helper !== "original" && this.helper && this.helper[0].parentNode) { + this.helper.remove(); + } + + $.extend(this, { + helper: null, + dragging: false, + reverting: false, + _noFinalSort: null + }); + + if(this.domPosition.prev) { + $(this.domPosition.prev).after(this.currentItem); + } else { + $(this.domPosition.parent).prepend(this.currentItem); + } + } + + return this; + + }, + + serialize: function(o) { + + var items = this._getItemsAsjQuery(o && o.connected), + str = []; + o = o || {}; + + $(items).each(function() { + var res = ($(o.item || this).attr(o.attribute || "id") || "").match(o.expression || (/(.+)[\-=_](.+)/)); + if (res) { + str.push((o.key || res[1]+"[]")+"="+(o.key && o.expression ? res[1] : res[2])); + } + }); + + if(!str.length && o.key) { + str.push(o.key + "="); + } + + return str.join("&"); + + }, + + toArray: function(o) { + + var items = this._getItemsAsjQuery(o && o.connected), + ret = []; + + o = o || {}; + + items.each(function() { ret.push($(o.item || this).attr(o.attribute || "id") || ""); }); + return ret; + + }, + + /* Be careful with the following core functions */ + _intersectsWith: function(item) { + + var x1 = this.positionAbs.left, + x2 = x1 + this.helperProportions.width, + y1 = this.positionAbs.top, + y2 = y1 + this.helperProportions.height, + l = item.left, + r = l + item.width, + t = item.top, + b = t + item.height, + dyClick = this.offset.click.top, + dxClick = this.offset.click.left, + isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ), + isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ), + isOverElement = isOverElementHeight && isOverElementWidth; + + if ( this.options.tolerance === "pointer" || + this.options.forcePointerForContainers || + (this.options.tolerance !== "pointer" && this.helperProportions[this.floating ? "width" : "height"] > item[this.floating ? "width" : "height"]) + ) { + return isOverElement; + } else { + + return (l < x1 + (this.helperProportions.width / 2) && // Right Half + x2 - (this.helperProportions.width / 2) < r && // Left Half + t < y1 + (this.helperProportions.height / 2) && // Bottom Half + y2 - (this.helperProportions.height / 2) < b ); // Top Half + + } + }, + + _intersectsWithPointer: function(item) { + + var isOverElementHeight = (this.options.axis === "x") || isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height), + isOverElementWidth = (this.options.axis === "y") || isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width), + isOverElement = isOverElementHeight && isOverElementWidth, + verticalDirection = this._getDragVerticalDirection(), + horizontalDirection = this._getDragHorizontalDirection(); + + if (!isOverElement) { + return false; + } + + return this.floating ? + ( ((horizontalDirection && horizontalDirection === "right") || verticalDirection === "down") ? 2 : 1 ) + : ( verticalDirection && (verticalDirection === "down" ? 2 : 1) ); + + }, + + _intersectsWithSides: function(item) { + + var isOverBottomHalf = isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height), + isOverRightHalf = isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width), + verticalDirection = this._getDragVerticalDirection(), + horizontalDirection = this._getDragHorizontalDirection(); + + if (this.floating && horizontalDirection) { + return ((horizontalDirection === "right" && isOverRightHalf) || (horizontalDirection === "left" && !isOverRightHalf)); + } else { + return verticalDirection && ((verticalDirection === "down" && isOverBottomHalf) || (verticalDirection === "up" && !isOverBottomHalf)); + } + + }, + + _getDragVerticalDirection: function() { + var delta = this.positionAbs.top - this.lastPositionAbs.top; + return delta !== 0 && (delta > 0 ? "down" : "up"); + }, + + _getDragHorizontalDirection: function() { + var delta = this.positionAbs.left - this.lastPositionAbs.left; + return delta !== 0 && (delta > 0 ? "right" : "left"); + }, + + refresh: function(event) { + this._refreshItems(event); + this.refreshPositions(); + return this; + }, + + _connectWith: function() { + var options = this.options; + return options.connectWith.constructor === String ? [options.connectWith] : options.connectWith; + }, + + _getItemsAsjQuery: function(connected) { + + var i, j, cur, inst, + items = [], + queries = [], + connectWith = this._connectWith(); + + if(connectWith && connected) { + for (i = connectWith.length - 1; i >= 0; i--){ + cur = $(connectWith[i]); + for ( j = cur.length - 1; j >= 0; j--){ + inst = $.data(cur[j], this.widgetFullName); + if(inst && inst !== this && !inst.options.disabled) { + queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), inst]); + } + } + } + } + + queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), this]); + + function addItems() { + items.push( this ); + } + for (i = queries.length - 1; i >= 0; i--){ + queries[i][0].each( addItems ); + } + + return $(items); + + }, + + _removeCurrentsFromItems: function() { + + var list = this.currentItem.find(":data(" + this.widgetName + "-item)"); + + this.items = $.grep(this.items, function (item) { + for (var j=0; j < list.length; j++) { + if(list[j] === item.item[0]) { + return false; + } + } + return true; + }); + + }, + + _refreshItems: function(event) { + + this.items = []; + this.containers = [this]; + + var i, j, cur, inst, targetData, _queries, item, queriesLength, + items = this.items, + queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]], + connectWith = this._connectWith(); + + if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down + for (i = connectWith.length - 1; i >= 0; i--){ + cur = $(connectWith[i]); + for (j = cur.length - 1; j >= 0; j--){ + inst = $.data(cur[j], this.widgetFullName); + if(inst && inst !== this && !inst.options.disabled) { + queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]); + this.containers.push(inst); + } + } + } + } + + for (i = queries.length - 1; i >= 0; i--) { + targetData = queries[i][1]; + _queries = queries[i][0]; + + for (j=0, queriesLength = _queries.length; j < queriesLength; j++) { + item = $(_queries[j]); + + item.data(this.widgetName + "-item", targetData); // Data for target checking (mouse manager) + + items.push({ + item: item, + instance: targetData, + width: 0, height: 0, + left: 0, top: 0 + }); + } + } + + }, + + refreshPositions: function(fast) { + + //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change + if(this.offsetParent && this.helper) { + this.offset.parent = this._getParentOffset(); + } + + var i, item, t, p; + + for (i = this.items.length - 1; i >= 0; i--){ + item = this.items[i]; + + //We ignore calculating positions of all connected containers when we're not over them + if(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) { + continue; + } + + t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item; + + if (!fast) { + item.width = t.outerWidth(); + item.height = t.outerHeight(); + } + + p = t.offset(); + item.left = p.left; + item.top = p.top; + } + + if(this.options.custom && this.options.custom.refreshContainers) { + this.options.custom.refreshContainers.call(this); + } else { + for (i = this.containers.length - 1; i >= 0; i--){ + p = this.containers[i].element.offset(); + this.containers[i].containerCache.left = p.left; + this.containers[i].containerCache.top = p.top; + this.containers[i].containerCache.width = this.containers[i].element.outerWidth(); + this.containers[i].containerCache.height = this.containers[i].element.outerHeight(); + } + } + + return this; + }, + + _createPlaceholder: function(that) { + that = that || this; + var className, + o = that.options; + + if(!o.placeholder || o.placeholder.constructor === String) { + className = o.placeholder; + o.placeholder = { + element: function() { + + var nodeName = that.currentItem[0].nodeName.toLowerCase(), + element = $( "<" + nodeName + ">", that.document[0] ) + .addClass(className || that.currentItem[0].className+" ui-sortable-placeholder") + .removeClass("ui-sortable-helper"); + + if ( nodeName === "tr" ) { + that.currentItem.children().each(function() { + $( " ", that.document[0] ) + .attr( "colspan", $( this ).attr( "colspan" ) || 1 ) + .appendTo( element ); + }); + } else if ( nodeName === "img" ) { + element.attr( "src", that.currentItem.attr( "src" ) ); + } + + if ( !className ) { + element.css( "visibility", "hidden" ); + } + + return element; + }, + update: function(container, p) { + + // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that + // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified + if(className && !o.forcePlaceholderSize) { + return; + } + + //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item + if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css("paddingTop")||0, 10) - parseInt(that.currentItem.css("paddingBottom")||0, 10)); } + if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css("paddingLeft")||0, 10) - parseInt(that.currentItem.css("paddingRight")||0, 10)); } + } + }; + } + + //Create the placeholder + that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem)); + + //Append it after the actual current item + that.currentItem.after(that.placeholder); + + //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317) + o.placeholder.update(that, that.placeholder); + + }, + + _contactContainers: function(event) { + var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, base, cur, nearBottom, floating, + innermostContainer = null, + innermostIndex = null; + + // get innermost container that intersects with item + for (i = this.containers.length - 1; i >= 0; i--) { + + // never consider a container that's located within the item itself + if($.contains(this.currentItem[0], this.containers[i].element[0])) { + continue; + } + + if(this._intersectsWith(this.containers[i].containerCache)) { + + // if we've already found a container and it's more "inner" than this, then continue + if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) { + continue; + } + + innermostContainer = this.containers[i]; + innermostIndex = i; + + } else { + // container doesn't intersect. trigger "out" event if necessary + if(this.containers[i].containerCache.over) { + this.containers[i]._trigger("out", event, this._uiHash(this)); + this.containers[i].containerCache.over = 0; + } + } + + } + + // if no intersecting containers found, return + if(!innermostContainer) { + return; + } + + // move the item into the container if it's not there already + if(this.containers.length === 1) { + if (!this.containers[innermostIndex].containerCache.over) { + this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); + this.containers[innermostIndex].containerCache.over = 1; + } + } else { + + //When entering a new container, we will find the item with the least distance and append our item near it + dist = 10000; + itemWithLeastDistance = null; + floating = innermostContainer.floating || isFloating(this.currentItem); + posProperty = floating ? "left" : "top"; + sizeProperty = floating ? "width" : "height"; + base = this.positionAbs[posProperty] + this.offset.click[posProperty]; + for (j = this.items.length - 1; j >= 0; j--) { + if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) { + continue; + } + if(this.items[j].item[0] === this.currentItem[0]) { + continue; + } + if (floating && !isOverAxis(this.positionAbs.top + this.offset.click.top, this.items[j].top, this.items[j].height)) { + continue; + } + cur = this.items[j].item.offset()[posProperty]; + nearBottom = false; + if(Math.abs(cur - base) > Math.abs(cur + this.items[j][sizeProperty] - base)){ + nearBottom = true; + cur += this.items[j][sizeProperty]; + } + + if(Math.abs(cur - base) < dist) { + dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j]; + this.direction = nearBottom ? "up": "down"; + } + } + + //Check if dropOnEmpty is enabled + if(!itemWithLeastDistance && !this.options.dropOnEmpty) { + return; + } + + if(this.currentContainer === this.containers[innermostIndex]) { + return; + } + + itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true); + this._trigger("change", event, this._uiHash()); + this.containers[innermostIndex]._trigger("change", event, this._uiHash(this)); + this.currentContainer = this.containers[innermostIndex]; + + //Update the placeholder + this.options.placeholder.update(this.currentContainer, this.placeholder); + + this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); + this.containers[innermostIndex].containerCache.over = 1; + } + + + }, + + _createHelper: function(event) { + + var o = this.options, + helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper === "clone" ? this.currentItem.clone() : this.currentItem); + + //Add the helper to the DOM if that didn't happen already + if(!helper.parents("body").length) { + $(o.appendTo !== "parent" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]); + } + + if(helper[0] === this.currentItem[0]) { + this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") }; + } + + if(!helper[0].style.width || o.forceHelperSize) { + helper.width(this.currentItem.width()); + } + if(!helper[0].style.height || o.forceHelperSize) { + helper.height(this.currentItem.height()); + } + + return helper; + + }, + + _adjustOffsetFromHelper: function(obj) { + if (typeof obj === "string") { + obj = obj.split(" "); + } + if ($.isArray(obj)) { + obj = {left: +obj[0], top: +obj[1] || 0}; + } + if ("left" in obj) { + this.offset.click.left = obj.left + this.margins.left; + } + if ("right" in obj) { + this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; + } + if ("top" in obj) { + this.offset.click.top = obj.top + this.margins.top; + } + if ("bottom" in obj) { + this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; + } + }, + + _getParentOffset: function() { + + + //Get the offsetParent and cache its position + this.offsetParent = this.helper.offsetParent(); + var po = this.offsetParent.offset(); + + // This is a special case where we need to modify a offset calculated on start, since the following happened: + // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent + // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that + // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag + if(this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) { + po.left += this.scrollParent.scrollLeft(); + po.top += this.scrollParent.scrollTop(); + } + + // This needs to be actually done for all browsers, since pageX/pageY includes this information + // with an ugly IE fix + if( this.offsetParent[0] === document.body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) { + po = { top: 0, left: 0 }; + } + + return { + top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0), + left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0) + }; + + }, + + _getRelativeOffset: function() { + + if(this.cssPosition === "relative") { + var p = this.currentItem.position(); + return { + top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(), + left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft() + }; + } else { + return { top: 0, left: 0 }; + } + + }, + + _cacheMargins: function() { + this.margins = { + left: (parseInt(this.currentItem.css("marginLeft"),10) || 0), + top: (parseInt(this.currentItem.css("marginTop"),10) || 0) + }; + }, + + _cacheHelperProportions: function() { + this.helperProportions = { + width: this.helper.outerWidth(), + height: this.helper.outerHeight() + }; + }, + + _setContainment: function() { + + var ce, co, over, + o = this.options; + if(o.containment === "parent") { + o.containment = this.helper[0].parentNode; + } + if(o.containment === "document" || o.containment === "window") { + this.containment = [ + 0 - this.offset.relative.left - this.offset.parent.left, + 0 - this.offset.relative.top - this.offset.parent.top, + $(o.containment === "document" ? document : window).width() - this.helperProportions.width - this.margins.left, + ($(o.containment === "document" ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top + ]; + } + + if(!(/^(document|window|parent)$/).test(o.containment)) { + ce = $(o.containment)[0]; + co = $(o.containment).offset(); + over = ($(ce).css("overflow") !== "hidden"); + + this.containment = [ + co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left, + co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top, + co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left, + co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top + ]; + } + + }, + + _convertPositionTo: function(d, pos) { + + if(!pos) { + pos = this.position; + } + var mod = d === "absolute" ? 1 : -1, + scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, + scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); + + return { + top: ( + pos.top + // The absolute mouse position + this.offset.relative.top * mod + // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.top * mod - // The offsetParent's offset without borders (offset + border) + ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod) + ), + left: ( + pos.left + // The absolute mouse position + this.offset.relative.left * mod + // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.left * mod - // The offsetParent's offset without borders (offset + border) + ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod) + ) + }; + + }, + + _generatePosition: function(event) { + + var top, left, + o = this.options, + pageX = event.pageX, + pageY = event.pageY, + scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); + + // This is another very weird special case that only happens for relative elements: + // 1. If the css position is relative + // 2. and the scroll parent is the document or similar to the offset parent + // we have to refresh the relative offset during the scroll so there are no jumps + if(this.cssPosition === "relative" && !(this.scrollParent[0] !== document && this.scrollParent[0] !== this.offsetParent[0])) { + this.offset.relative = this._getRelativeOffset(); + } + + /* + * - Position constraining - + * Constrain the position to a mix of grid, containment. + */ + + if(this.originalPosition) { //If we are not dragging yet, we won't check for options + + if(this.containment) { + if(event.pageX - this.offset.click.left < this.containment[0]) { + pageX = this.containment[0] + this.offset.click.left; + } + if(event.pageY - this.offset.click.top < this.containment[1]) { + pageY = this.containment[1] + this.offset.click.top; + } + if(event.pageX - this.offset.click.left > this.containment[2]) { + pageX = this.containment[2] + this.offset.click.left; + } + if(event.pageY - this.offset.click.top > this.containment[3]) { + pageY = this.containment[3] + this.offset.click.top; + } + } + + if(o.grid) { + top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1]; + pageY = this.containment ? ( (top - this.offset.click.top >= this.containment[1] && top - this.offset.click.top <= this.containment[3]) ? top : ((top - this.offset.click.top >= this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top; + + left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0]; + pageX = this.containment ? ( (left - this.offset.click.left >= this.containment[0] && left - this.offset.click.left <= this.containment[2]) ? left : ((left - this.offset.click.left >= this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left; + } + + } + + return { + top: ( + pageY - // The absolute mouse position + this.offset.click.top - // Click offset (relative to the element) + this.offset.relative.top - // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.top + // The offsetParent's offset without borders (offset + border) + ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) )) + ), + left: ( + pageX - // The absolute mouse position + this.offset.click.left - // Click offset (relative to the element) + this.offset.relative.left - // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.left + // The offsetParent's offset without borders (offset + border) + ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() )) + ) + }; + + }, + + _rearrange: function(event, i, a, hardRefresh) { + + a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction === "down" ? i.item[0] : i.item[0].nextSibling)); + + //Various things done here to improve the performance: + // 1. we create a setTimeout, that calls refreshPositions + // 2. on the instance, we have a counter variable, that get's higher after every append + // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same + // 4. this lets only the last addition to the timeout stack through + this.counter = this.counter ? ++this.counter : 1; + var counter = this.counter; + + this._delay(function() { + if(counter === this.counter) { + this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove + } + }); + + }, + + _clear: function(event, noPropagation) { + + this.reverting = false; + // We delay all events that have to be triggered to after the point where the placeholder has been removed and + // everything else normalized again + var i, + delayedTriggers = []; + + // We first have to update the dom position of the actual currentItem + // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088) + if(!this._noFinalSort && this.currentItem.parent().length) { + this.placeholder.before(this.currentItem); + } + this._noFinalSort = null; + + if(this.helper[0] === this.currentItem[0]) { + for(i in this._storedCSS) { + if(this._storedCSS[i] === "auto" || this._storedCSS[i] === "static") { + this._storedCSS[i] = ""; + } + } + this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"); + } else { + this.currentItem.show(); + } + + if(this.fromOutside && !noPropagation) { + delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); }); + } + if((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) { + delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed + } + + // Check if the items Container has Changed and trigger appropriate + // events. + if (this !== this.currentContainer) { + if(!noPropagation) { + delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); }); + delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); }; }).call(this, this.currentContainer)); + delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this)); }; }).call(this, this.currentContainer)); + } + } + + + //Post events to containers + function delayEvent( type, instance, container ) { + return function( event ) { + container._trigger( type, event, instance._uiHash( instance ) ); + }; + } + for (i = this.containers.length - 1; i >= 0; i--){ + if (!noPropagation) { + delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) ); + } + if(this.containers[i].containerCache.over) { + delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) ); + this.containers[i].containerCache.over = 0; + } + } + + //Do what was originally in plugins + if ( this.storedCursor ) { + this.document.find( "body" ).css( "cursor", this.storedCursor ); + this.storedStylesheet.remove(); + } + if(this._storedOpacity) { + this.helper.css("opacity", this._storedOpacity); + } + if(this._storedZIndex) { + this.helper.css("zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex); + } + + this.dragging = false; + if(this.cancelHelperRemoval) { + if(!noPropagation) { + this._trigger("beforeStop", event, this._uiHash()); + for (i=0; i < delayedTriggers.length; i++) { + delayedTriggers[i].call(this, event); + } //Trigger all delayed events + this._trigger("stop", event, this._uiHash()); + } + + this.fromOutside = false; + return false; + } + + if(!noPropagation) { + this._trigger("beforeStop", event, this._uiHash()); + } + + //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node! + this.placeholder[0].parentNode.removeChild(this.placeholder[0]); + + if(this.helper[0] !== this.currentItem[0]) { + this.helper.remove(); + } + this.helper = null; + + if(!noPropagation) { + for (i=0; i < delayedTriggers.length; i++) { + delayedTriggers[i].call(this, event); + } //Trigger all delayed events + this._trigger("stop", event, this._uiHash()); + } + + this.fromOutside = false; + return true; + + }, + + _trigger: function() { + if ($.Widget.prototype._trigger.apply(this, arguments) === false) { + this.cancel(); + } + }, + + _uiHash: function(_inst) { + var inst = _inst || this; + return { + helper: inst.helper, + placeholder: inst.placeholder || $([]), + position: inst.position, + originalPosition: inst.originalPosition, + offset: inst.positionAbs, + item: inst.currentItem, + sender: _inst ? _inst.element : null + }; + } + +}); + +})(jQuery); +(function( $, undefined ) { + +var uid = 0, + hideProps = {}, + showProps = {}; + +hideProps.height = hideProps.paddingTop = hideProps.paddingBottom = + hideProps.borderTopWidth = hideProps.borderBottomWidth = "hide"; +showProps.height = showProps.paddingTop = showProps.paddingBottom = + showProps.borderTopWidth = showProps.borderBottomWidth = "show"; + +$.widget( "ui.accordion", { + version: "1.10.4", + options: { + active: 0, + animate: {}, + collapsible: false, + event: "click", + header: "> li > :first-child,> :not(li):even", + heightStyle: "auto", + icons: { + activeHeader: "ui-icon-triangle-1-s", + header: "ui-icon-triangle-1-e" + }, + + // callbacks + activate: null, + beforeActivate: null + }, + + _create: function() { + var options = this.options; + this.prevShow = this.prevHide = $(); + this.element.addClass( "ui-accordion ui-widget ui-helper-reset" ) + // ARIA + .attr( "role", "tablist" ); + + // don't allow collapsible: false and active: false / null + if ( !options.collapsible && (options.active === false || options.active == null) ) { + options.active = 0; + } + + this._processPanels(); + // handle negative values + if ( options.active < 0 ) { + options.active += this.headers.length; + } + this._refresh(); + }, + + _getCreateEventData: function() { + return { + header: this.active, + panel: !this.active.length ? $() : this.active.next(), + content: !this.active.length ? $() : this.active.next() + }; + }, + + _createIcons: function() { + var icons = this.options.icons; + if ( icons ) { + $( "" ) + .addClass( "ui-accordion-header-icon ui-icon " + icons.header ) + .prependTo( this.headers ); + this.active.children( ".ui-accordion-header-icon" ) + .removeClass( icons.header ) + .addClass( icons.activeHeader ); + this.headers.addClass( "ui-accordion-icons" ); + } + }, + + _destroyIcons: function() { + this.headers + .removeClass( "ui-accordion-icons" ) + .children( ".ui-accordion-header-icon" ) + .remove(); + }, + + _destroy: function() { + var contents; + + // clean up main element + this.element + .removeClass( "ui-accordion ui-widget ui-helper-reset" ) + .removeAttr( "role" ); + + // clean up headers + this.headers + .removeClass( "ui-accordion-header ui-accordion-header-active ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top" ) + .removeAttr( "role" ) + .removeAttr( "aria-expanded" ) + .removeAttr( "aria-selected" ) + .removeAttr( "aria-controls" ) + .removeAttr( "tabIndex" ) + .each(function() { + if ( /^ui-accordion/.test( this.id ) ) { + this.removeAttribute( "id" ); + } + }); + this._destroyIcons(); + + // clean up content panels + contents = this.headers.next() + .css( "display", "" ) + .removeAttr( "role" ) + .removeAttr( "aria-hidden" ) + .removeAttr( "aria-labelledby" ) + .removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled" ) + .each(function() { + if ( /^ui-accordion/.test( this.id ) ) { + this.removeAttribute( "id" ); + } + }); + if ( this.options.heightStyle !== "content" ) { + contents.css( "height", "" ); + } + }, + + _setOption: function( key, value ) { + if ( key === "active" ) { + // _activate() will handle invalid values and update this.options + this._activate( value ); + return; + } + + if ( key === "event" ) { + if ( this.options.event ) { + this._off( this.headers, this.options.event ); + } + this._setupEvents( value ); + } + + this._super( key, value ); + + // setting collapsible: false while collapsed; open first panel + if ( key === "collapsible" && !value && this.options.active === false ) { + this._activate( 0 ); + } + + if ( key === "icons" ) { + this._destroyIcons(); + if ( value ) { + this._createIcons(); + } + } + + // #5332 - opacity doesn't cascade to positioned elements in IE + // so we need to add the disabled class to the headers and panels + if ( key === "disabled" ) { + this.headers.add( this.headers.next() ) + .toggleClass( "ui-state-disabled", !!value ); + } + }, + + _keydown: function( event ) { + if ( event.altKey || event.ctrlKey ) { + return; + } + + var keyCode = $.ui.keyCode, + length = this.headers.length, + currentIndex = this.headers.index( event.target ), + toFocus = false; + + switch ( event.keyCode ) { + case keyCode.RIGHT: + case keyCode.DOWN: + toFocus = this.headers[ ( currentIndex + 1 ) % length ]; + break; + case keyCode.LEFT: + case keyCode.UP: + toFocus = this.headers[ ( currentIndex - 1 + length ) % length ]; + break; + case keyCode.SPACE: + case keyCode.ENTER: + this._eventHandler( event ); + break; + case keyCode.HOME: + toFocus = this.headers[ 0 ]; + break; + case keyCode.END: + toFocus = this.headers[ length - 1 ]; + break; + } + + if ( toFocus ) { + $( event.target ).attr( "tabIndex", -1 ); + $( toFocus ).attr( "tabIndex", 0 ); + toFocus.focus(); + event.preventDefault(); + } + }, + + _panelKeyDown : function( event ) { + if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) { + $( event.currentTarget ).prev().focus(); + } + }, + + refresh: function() { + var options = this.options; + this._processPanels(); + + // was collapsed or no panel + if ( ( options.active === false && options.collapsible === true ) || !this.headers.length ) { + options.active = false; + this.active = $(); + // active false only when collapsible is true + } else if ( options.active === false ) { + this._activate( 0 ); + // was active, but active panel is gone + } else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) { + // all remaining panel are disabled + if ( this.headers.length === this.headers.find(".ui-state-disabled").length ) { + options.active = false; + this.active = $(); + // activate previous panel + } else { + this._activate( Math.max( 0, options.active - 1 ) ); + } + // was active, active panel still exists + } else { + // make sure active index is correct + options.active = this.headers.index( this.active ); + } + + this._destroyIcons(); + + this._refresh(); + }, + + _processPanels: function() { + this.headers = this.element.find( this.options.header ) + .addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" ); + + this.headers.next() + .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" ) + .filter(":not(.ui-accordion-content-active)") + .hide(); + }, + + _refresh: function() { + var maxHeight, + options = this.options, + heightStyle = options.heightStyle, + parent = this.element.parent(), + accordionId = this.accordionId = "ui-accordion-" + + (this.element.attr( "id" ) || ++uid); + + this.active = this._findActive( options.active ) + .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" ) + .removeClass( "ui-corner-all" ); + this.active.next() + .addClass( "ui-accordion-content-active" ) + .show(); + + this.headers + .attr( "role", "tab" ) + .each(function( i ) { + var header = $( this ), + headerId = header.attr( "id" ), + panel = header.next(), + panelId = panel.attr( "id" ); + if ( !headerId ) { + headerId = accordionId + "-header-" + i; + header.attr( "id", headerId ); + } + if ( !panelId ) { + panelId = accordionId + "-panel-" + i; + panel.attr( "id", panelId ); + } + header.attr( "aria-controls", panelId ); + panel.attr( "aria-labelledby", headerId ); + }) + .next() + .attr( "role", "tabpanel" ); + + this.headers + .not( this.active ) + .attr({ + "aria-selected": "false", + "aria-expanded": "false", + tabIndex: -1 + }) + .next() + .attr({ + "aria-hidden": "true" + }) + .hide(); + + // make sure at least one header is in the tab order + if ( !this.active.length ) { + this.headers.eq( 0 ).attr( "tabIndex", 0 ); + } else { + this.active.attr({ + "aria-selected": "true", + "aria-expanded": "true", + tabIndex: 0 + }) + .next() + .attr({ + "aria-hidden": "false" + }); + } + + this._createIcons(); + + this._setupEvents( options.event ); + + if ( heightStyle === "fill" ) { + maxHeight = parent.height(); + this.element.siblings( ":visible" ).each(function() { + var elem = $( this ), + position = elem.css( "position" ); + + if ( position === "absolute" || position === "fixed" ) { + return; + } + maxHeight -= elem.outerHeight( true ); + }); + + this.headers.each(function() { + maxHeight -= $( this ).outerHeight( true ); + }); + + this.headers.next() + .each(function() { + $( this ).height( Math.max( 0, maxHeight - + $( this ).innerHeight() + $( this ).height() ) ); + }) + .css( "overflow", "auto" ); + } else if ( heightStyle === "auto" ) { + maxHeight = 0; + this.headers.next() + .each(function() { + maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() ); + }) + .height( maxHeight ); + } + }, + + _activate: function( index ) { + var active = this._findActive( index )[ 0 ]; + + // trying to activate the already active panel + if ( active === this.active[ 0 ] ) { + return; + } + + // trying to collapse, simulate a click on the currently active header + active = active || this.active[ 0 ]; + + this._eventHandler({ + target: active, + currentTarget: active, + preventDefault: $.noop + }); + }, + + _findActive: function( selector ) { + return typeof selector === "number" ? this.headers.eq( selector ) : $(); + }, + + _setupEvents: function( event ) { + var events = { + keydown: "_keydown" + }; + if ( event ) { + $.each( event.split(" "), function( index, eventName ) { + events[ eventName ] = "_eventHandler"; + }); + } + + this._off( this.headers.add( this.headers.next() ) ); + this._on( this.headers, events ); + this._on( this.headers.next(), { keydown: "_panelKeyDown" }); + this._hoverable( this.headers ); + this._focusable( this.headers ); + }, + + _eventHandler: function( event ) { + var options = this.options, + active = this.active, + clicked = $( event.currentTarget ), + clickedIsActive = clicked[ 0 ] === active[ 0 ], + collapsing = clickedIsActive && options.collapsible, + toShow = collapsing ? $() : clicked.next(), + toHide = active.next(), + eventData = { + oldHeader: active, + oldPanel: toHide, + newHeader: collapsing ? $() : clicked, + newPanel: toShow + }; + + event.preventDefault(); + + if ( + // click on active header, but not collapsible + ( clickedIsActive && !options.collapsible ) || + // allow canceling activation + ( this._trigger( "beforeActivate", event, eventData ) === false ) ) { + return; + } + + options.active = collapsing ? false : this.headers.index( clicked ); + + // when the call to ._toggle() comes after the class changes + // it causes a very odd bug in IE 8 (see #6720) + this.active = clickedIsActive ? $() : clicked; + this._toggle( eventData ); + + // switch classes + // corner classes on the previously active header stay after the animation + active.removeClass( "ui-accordion-header-active ui-state-active" ); + if ( options.icons ) { + active.children( ".ui-accordion-header-icon" ) + .removeClass( options.icons.activeHeader ) + .addClass( options.icons.header ); + } + + if ( !clickedIsActive ) { + clicked + .removeClass( "ui-corner-all" ) + .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" ); + if ( options.icons ) { + clicked.children( ".ui-accordion-header-icon" ) + .removeClass( options.icons.header ) + .addClass( options.icons.activeHeader ); + } + + clicked + .next() + .addClass( "ui-accordion-content-active" ); + } + }, + + _toggle: function( data ) { + var toShow = data.newPanel, + toHide = this.prevShow.length ? this.prevShow : data.oldPanel; + + // handle activating a panel during the animation for another activation + this.prevShow.add( this.prevHide ).stop( true, true ); + this.prevShow = toShow; + this.prevHide = toHide; + + if ( this.options.animate ) { + this._animate( toShow, toHide, data ); + } else { + toHide.hide(); + toShow.show(); + this._toggleComplete( data ); + } + + toHide.attr({ + "aria-hidden": "true" + }); + toHide.prev().attr( "aria-selected", "false" ); + // if we're switching panels, remove the old header from the tab order + // if we're opening from collapsed state, remove the previous header from the tab order + // if we're collapsing, then keep the collapsing header in the tab order + if ( toShow.length && toHide.length ) { + toHide.prev().attr({ + "tabIndex": -1, + "aria-expanded": "false" + }); + } else if ( toShow.length ) { + this.headers.filter(function() { + return $( this ).attr( "tabIndex" ) === 0; + }) + .attr( "tabIndex", -1 ); + } + + toShow + .attr( "aria-hidden", "false" ) + .prev() + .attr({ + "aria-selected": "true", + tabIndex: 0, + "aria-expanded": "true" + }); + }, + + _animate: function( toShow, toHide, data ) { + var total, easing, duration, + that = this, + adjust = 0, + down = toShow.length && + ( !toHide.length || ( toShow.index() < toHide.index() ) ), + animate = this.options.animate || {}, + options = down && animate.down || animate, + complete = function() { + that._toggleComplete( data ); + }; + + if ( typeof options === "number" ) { + duration = options; + } + if ( typeof options === "string" ) { + easing = options; + } + // fall back from options to animation in case of partial down settings + easing = easing || options.easing || animate.easing; + duration = duration || options.duration || animate.duration; + + if ( !toHide.length ) { + return toShow.animate( showProps, duration, easing, complete ); + } + if ( !toShow.length ) { + return toHide.animate( hideProps, duration, easing, complete ); + } + + total = toShow.show().outerHeight(); + toHide.animate( hideProps, { + duration: duration, + easing: easing, + step: function( now, fx ) { + fx.now = Math.round( now ); + } + }); + toShow + .hide() + .animate( showProps, { + duration: duration, + easing: easing, + complete: complete, + step: function( now, fx ) { + fx.now = Math.round( now ); + if ( fx.prop !== "height" ) { + adjust += fx.now; + } else if ( that.options.heightStyle !== "content" ) { + fx.now = Math.round( total - toHide.outerHeight() - adjust ); + adjust = 0; + } + } + }); + }, + + _toggleComplete: function( data ) { + var toHide = data.oldPanel; + + toHide + .removeClass( "ui-accordion-content-active" ) + .prev() + .removeClass( "ui-corner-top" ) + .addClass( "ui-corner-all" ); + + // Work around for rendering bug in IE (#5421) + if ( toHide.length ) { + toHide.parent()[0].className = toHide.parent()[0].className; + } + this._trigger( "activate", null, data ); + } +}); + +})( jQuery ); +(function( $, undefined ) { + +$.widget( "ui.autocomplete", { + version: "1.10.4", + defaultElement: "", + options: { + appendTo: null, + autoFocus: false, + delay: 300, + minLength: 1, + position: { + my: "left top", + at: "left bottom", + collision: "none" + }, + source: null, + + // callbacks + change: null, + close: null, + focus: null, + open: null, + response: null, + search: null, + select: null + }, + + requestIndex: 0, + pending: 0, + + _create: function() { + // Some browsers only repeat keydown events, not keypress events, + // so we use the suppressKeyPress flag to determine if we've already + // handled the keydown event. #7269 + // Unfortunately the code for & in keypress is the same as the up arrow, + // so we use the suppressKeyPressRepeat flag to avoid handling keypress + // events when we know the keydown event was used to modify the + // search term. #7799 + var suppressKeyPress, suppressKeyPressRepeat, suppressInput, + nodeName = this.element[0].nodeName.toLowerCase(), + isTextarea = nodeName === "textarea", + isInput = nodeName === "input"; + + this.isMultiLine = + // Textareas are always multi-line + isTextarea ? true : + // Inputs are always single-line, even if inside a contentEditable element + // IE also treats inputs as contentEditable + isInput ? false : + // All other element types are determined by whether or not they're contentEditable + this.element.prop( "isContentEditable" ); + + this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ]; + this.isNewMenu = true; + + this.element + .addClass( "ui-autocomplete-input" ) + .attr( "autocomplete", "off" ); + + this._on( this.element, { + keydown: function( event ) { + if ( this.element.prop( "readOnly" ) ) { + suppressKeyPress = true; + suppressInput = true; + suppressKeyPressRepeat = true; + return; + } + + suppressKeyPress = false; + suppressInput = false; + suppressKeyPressRepeat = false; + var keyCode = $.ui.keyCode; + switch( event.keyCode ) { + case keyCode.PAGE_UP: + suppressKeyPress = true; + this._move( "previousPage", event ); + break; + case keyCode.PAGE_DOWN: + suppressKeyPress = true; + this._move( "nextPage", event ); + break; + case keyCode.UP: + suppressKeyPress = true; + this._keyEvent( "previous", event ); + break; + case keyCode.DOWN: + suppressKeyPress = true; + this._keyEvent( "next", event ); + break; + case keyCode.ENTER: + case keyCode.NUMPAD_ENTER: + // when menu is open and has focus + if ( this.menu.active ) { + // #6055 - Opera still allows the keypress to occur + // which causes forms to submit + suppressKeyPress = true; + event.preventDefault(); + this.menu.select( event ); + } + break; + case keyCode.TAB: + if ( this.menu.active ) { + this.menu.select( event ); + } + break; + case keyCode.ESCAPE: + if ( this.menu.element.is( ":visible" ) ) { + this._value( this.term ); + this.close( event ); + // Different browsers have different default behavior for escape + // Single press can mean undo or clear + // Double press in IE means clear the whole form + event.preventDefault(); + } + break; + default: + suppressKeyPressRepeat = true; + // search timeout should be triggered before the input value is changed + this._searchTimeout( event ); + break; + } + }, + keypress: function( event ) { + if ( suppressKeyPress ) { + suppressKeyPress = false; + if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) { + event.preventDefault(); + } + return; + } + if ( suppressKeyPressRepeat ) { + return; + } + + // replicate some key handlers to allow them to repeat in Firefox and Opera + var keyCode = $.ui.keyCode; + switch( event.keyCode ) { + case keyCode.PAGE_UP: + this._move( "previousPage", event ); + break; + case keyCode.PAGE_DOWN: + this._move( "nextPage", event ); + break; + case keyCode.UP: + this._keyEvent( "previous", event ); + break; + case keyCode.DOWN: + this._keyEvent( "next", event ); + break; + } + }, + input: function( event ) { + if ( suppressInput ) { + suppressInput = false; + event.preventDefault(); + return; + } + this._searchTimeout( event ); + }, + focus: function() { + this.selectedItem = null; + this.previous = this._value(); + }, + blur: function( event ) { + if ( this.cancelBlur ) { + delete this.cancelBlur; + return; + } + + clearTimeout( this.searching ); + this.close( event ); + this._change( event ); + } + }); + + this._initSource(); + this.menu = $( "
      " ) + .addClass( "ui-autocomplete ui-front" ) + .appendTo( this._appendTo() ) + .menu({ + // disable ARIA support, the live region takes care of that + role: null + }) + .hide() + .data( "ui-menu" ); + + this._on( this.menu.element, { + mousedown: function( event ) { + // prevent moving focus out of the text field + event.preventDefault(); + + // IE doesn't prevent moving focus even with event.preventDefault() + // so we set a flag to know when we should ignore the blur event + this.cancelBlur = true; + this._delay(function() { + delete this.cancelBlur; + }); + + // clicking on the scrollbar causes focus to shift to the body + // but we can't detect a mouseup or a click immediately afterward + // so we have to track the next mousedown and close the menu if + // the user clicks somewhere outside of the autocomplete + var menuElement = this.menu.element[ 0 ]; + if ( !$( event.target ).closest( ".ui-menu-item" ).length ) { + this._delay(function() { + var that = this; + this.document.one( "mousedown", function( event ) { + if ( event.target !== that.element[ 0 ] && + event.target !== menuElement && + !$.contains( menuElement, event.target ) ) { + that.close(); + } + }); + }); + } + }, + menufocus: function( event, ui ) { + // support: Firefox + // Prevent accidental activation of menu items in Firefox (#7024 #9118) + if ( this.isNewMenu ) { + this.isNewMenu = false; + if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) { + this.menu.blur(); + + this.document.one( "mousemove", function() { + $( event.target ).trigger( event.originalEvent ); + }); + + return; + } + } + + var item = ui.item.data( "ui-autocomplete-item" ); + if ( false !== this._trigger( "focus", event, { item: item } ) ) { + // use value to match what will end up in the input, if it was a key event + if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) { + this._value( item.value ); + } + } else { + // Normally the input is populated with the item's value as the + // menu is navigated, causing screen readers to notice a change and + // announce the item. Since the focus event was canceled, this doesn't + // happen, so we update the live region so that screen readers can + // still notice the change and announce it. + this.liveRegion.text( item.value ); + } + }, + menuselect: function( event, ui ) { + var item = ui.item.data( "ui-autocomplete-item" ), + previous = this.previous; + + // only trigger when focus was lost (click on menu) + if ( this.element[0] !== this.document[0].activeElement ) { + this.element.focus(); + this.previous = previous; + // #6109 - IE triggers two focus events and the second + // is asynchronous, so we need to reset the previous + // term synchronously and asynchronously :-( + this._delay(function() { + this.previous = previous; + this.selectedItem = item; + }); + } + + if ( false !== this._trigger( "select", event, { item: item } ) ) { + this._value( item.value ); + } + // reset the term after the select event + // this allows custom select handling to work properly + this.term = this._value(); + + this.close( event ); + this.selectedItem = item; + } + }); + + this.liveRegion = $( "", { + role: "status", + "aria-live": "polite" + }) + .addClass( "ui-helper-hidden-accessible" ) + .insertBefore( this.element ); + + // turning off autocomplete prevents the browser from remembering the + // value when navigating through history, so we re-enable autocomplete + // if the page is unloaded before the widget is destroyed. #7790 + this._on( this.window, { + beforeunload: function() { + this.element.removeAttr( "autocomplete" ); + } + }); + }, + + _destroy: function() { + clearTimeout( this.searching ); + this.element + .removeClass( "ui-autocomplete-input" ) + .removeAttr( "autocomplete" ); + this.menu.element.remove(); + this.liveRegion.remove(); + }, + + _setOption: function( key, value ) { + this._super( key, value ); + if ( key === "source" ) { + this._initSource(); + } + if ( key === "appendTo" ) { + this.menu.element.appendTo( this._appendTo() ); + } + if ( key === "disabled" && value && this.xhr ) { + this.xhr.abort(); + } + }, + + _appendTo: function() { + var element = this.options.appendTo; + + if ( element ) { + element = element.jquery || element.nodeType ? + $( element ) : + this.document.find( element ).eq( 0 ); + } + + if ( !element ) { + element = this.element.closest( ".ui-front" ); + } + + if ( !element.length ) { + element = this.document[0].body; + } + + return element; + }, + + _initSource: function() { + var array, url, + that = this; + if ( $.isArray(this.options.source) ) { + array = this.options.source; + this.source = function( request, response ) { + response( $.ui.autocomplete.filter( array, request.term ) ); + }; + } else if ( typeof this.options.source === "string" ) { + url = this.options.source; + this.source = function( request, response ) { + if ( that.xhr ) { + that.xhr.abort(); + } + that.xhr = $.ajax({ + url: url, + data: request, + dataType: "json", + success: function( data ) { + response( data ); + }, + error: function() { + response( [] ); + } + }); + }; + } else { + this.source = this.options.source; + } + }, + + _searchTimeout: function( event ) { + clearTimeout( this.searching ); + this.searching = this._delay(function() { + // only search if the value has changed + if ( this.term !== this._value() ) { + this.selectedItem = null; + this.search( null, event ); + } + }, this.options.delay ); + }, + + search: function( value, event ) { + value = value != null ? value : this._value(); + + // always save the actual value, not the one passed as an argument + this.term = this._value(); + + if ( value.length < this.options.minLength ) { + return this.close( event ); + } + + if ( this._trigger( "search", event ) === false ) { + return; + } + + return this._search( value ); + }, + + _search: function( value ) { + this.pending++; + this.element.addClass( "ui-autocomplete-loading" ); + this.cancelSearch = false; + + this.source( { term: value }, this._response() ); + }, + + _response: function() { + var index = ++this.requestIndex; + + return $.proxy(function( content ) { + if ( index === this.requestIndex ) { + this.__response( content ); + } + + this.pending--; + if ( !this.pending ) { + this.element.removeClass( "ui-autocomplete-loading" ); + } + }, this ); + }, + + __response: function( content ) { + if ( content ) { + content = this._normalize( content ); + } + this._trigger( "response", null, { content: content } ); + if ( !this.options.disabled && content && content.length && !this.cancelSearch ) { + this._suggest( content ); + this._trigger( "open" ); + } else { + // use ._close() instead of .close() so we don't cancel future searches + this._close(); + } + }, + + close: function( event ) { + this.cancelSearch = true; + this._close( event ); + }, + + _close: function( event ) { + if ( this.menu.element.is( ":visible" ) ) { + this.menu.element.hide(); + this.menu.blur(); + this.isNewMenu = true; + this._trigger( "close", event ); + } + }, + + _change: function( event ) { + if ( this.previous !== this._value() ) { + this._trigger( "change", event, { item: this.selectedItem } ); + } + }, + + _normalize: function( items ) { + // assume all items have the right format when the first item is complete + if ( items.length && items[0].label && items[0].value ) { + return items; + } + return $.map( items, function( item ) { + if ( typeof item === "string" ) { + return { + label: item, + value: item + }; + } + return $.extend({ + label: item.label || item.value, + value: item.value || item.label + }, item ); + }); + }, + + _suggest: function( items ) { + var ul = this.menu.element.empty(); + this._renderMenu( ul, items ); + this.isNewMenu = true; + this.menu.refresh(); + + // size and position menu + ul.show(); + this._resizeMenu(); + ul.position( $.extend({ + of: this.element + }, this.options.position )); + + if ( this.options.autoFocus ) { + this.menu.next(); + } + }, + + _resizeMenu: function() { + var ul = this.menu.element; + ul.outerWidth( Math.max( + // Firefox wraps long text (possibly a rounding bug) + // so we add 1px to avoid the wrapping (#7513) + ul.width( "" ).outerWidth() + 1, + this.element.outerWidth() + ) ); + }, + + _renderMenu: function( ul, items ) { + var that = this; + $.each( items, function( index, item ) { + that._renderItemData( ul, item ); + }); + }, + + _renderItemData: function( ul, item ) { + return this._renderItem( ul, item ).data( "ui-autocomplete-item", item ); + }, + + _renderItem: function( ul, item ) { + return $( "
    • " ) + .append( $( "" ).text( item.label ) ) + .appendTo( ul ); + }, + + _move: function( direction, event ) { + if ( !this.menu.element.is( ":visible" ) ) { + this.search( null, event ); + return; + } + if ( this.menu.isFirstItem() && /^previous/.test( direction ) || + this.menu.isLastItem() && /^next/.test( direction ) ) { + this._value( this.term ); + this.menu.blur(); + return; + } + this.menu[ direction ]( event ); + }, + + widget: function() { + return this.menu.element; + }, + + _value: function() { + return this.valueMethod.apply( this.element, arguments ); + }, + + _keyEvent: function( keyEvent, event ) { + if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) { + this._move( keyEvent, event ); + + // prevents moving cursor to beginning/end of the text field in some browsers + event.preventDefault(); + } + } +}); + +$.extend( $.ui.autocomplete, { + escapeRegex: function( value ) { + return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); + }, + filter: function(array, term) { + var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" ); + return $.grep( array, function(value) { + return matcher.test( value.label || value.value || value ); + }); + } +}); + + +// live region extension, adding a `messages` option +// NOTE: This is an experimental API. We are still investigating +// a full solution for string manipulation and internationalization. +$.widget( "ui.autocomplete", $.ui.autocomplete, { + options: { + messages: { + noResults: "No search results.", + results: function( amount ) { + return amount + ( amount > 1 ? " results are" : " result is" ) + + " available, use up and down arrow keys to navigate."; + } + } + }, + + __response: function( content ) { + var message; + this._superApply( arguments ); + if ( this.options.disabled || this.cancelSearch ) { + return; + } + if ( content && content.length ) { + message = this.options.messages.results( content.length ); + } else { + message = this.options.messages.noResults; + } + this.liveRegion.text( message ); + } +}); + +}( jQuery )); +(function( $, undefined ) { + +var lastActive, + baseClasses = "ui-button ui-widget ui-state-default ui-corner-all", + typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only", + formResetHandler = function() { + var form = $( this ); + setTimeout(function() { + form.find( ":ui-button" ).button( "refresh" ); + }, 1 ); + }, + radioGroup = function( radio ) { + var name = radio.name, + form = radio.form, + radios = $( [] ); + if ( name ) { + name = name.replace( /'/g, "\\'" ); + if ( form ) { + radios = $( form ).find( "[name='" + name + "']" ); + } else { + radios = $( "[name='" + name + "']", radio.ownerDocument ) + .filter(function() { + return !this.form; + }); + } + } + return radios; + }; + +$.widget( "ui.button", { + version: "1.10.4", + defaultElement: "").addClass(this._triggerClass). + html(!buttonImage ? buttonText : $("").attr( + { src:buttonImage, alt:buttonText, title:buttonText }))); + input[isRTL ? "before" : "after"](inst.trigger); + inst.trigger.click(function() { + if ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0]) { + $.datepicker._hideDatepicker(); + } else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !== input[0]) { + $.datepicker._hideDatepicker(); + $.datepicker._showDatepicker(input[0]); + } else { + $.datepicker._showDatepicker(input[0]); + } + return false; + }); + } + }, + + /* Apply the maximum length for the date format. */ + _autoSize: function(inst) { + if (this._get(inst, "autoSize") && !inst.inline) { + var findMax, max, maxI, i, + date = new Date(2009, 12 - 1, 20), // Ensure double digits + dateFormat = this._get(inst, "dateFormat"); + + if (dateFormat.match(/[DM]/)) { + findMax = function(names) { + max = 0; + maxI = 0; + for (i = 0; i < names.length; i++) { + if (names[i].length > max) { + max = names[i].length; + maxI = i; + } + } + return maxI; + }; + date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ? + "monthNames" : "monthNamesShort")))); + date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ? + "dayNames" : "dayNamesShort"))) + 20 - date.getDay()); + } + inst.input.attr("size", this._formatDate(inst, date).length); + } + }, + + /* Attach an inline date picker to a div. */ + _inlineDatepicker: function(target, inst) { + var divSpan = $(target); + if (divSpan.hasClass(this.markerClassName)) { + return; + } + divSpan.addClass(this.markerClassName).append(inst.dpDiv); + $.data(target, PROP_NAME, inst); + this._setDate(inst, this._getDefaultDate(inst), true); + this._updateDatepicker(inst); + this._updateAlternate(inst); + //If disabled option is true, disable the datepicker before showing it (see ticket #5665) + if( inst.settings.disabled ) { + this._disableDatepicker( target ); + } + // Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements + // http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height + inst.dpDiv.css( "display", "block" ); + }, + + /* Pop-up the date picker in a "dialog" box. + * @param input element - ignored + * @param date string or Date - the initial date to display + * @param onSelect function - the function to call when a date is selected + * @param settings object - update the dialog date picker instance's settings (anonymous object) + * @param pos int[2] - coordinates for the dialog's position within the screen or + * event - with x/y coordinates or + * leave empty for default (screen centre) + * @return the manager object + */ + _dialogDatepicker: function(input, date, onSelect, settings, pos) { + var id, browserWidth, browserHeight, scrollX, scrollY, + inst = this._dialogInst; // internal instance + + if (!inst) { + this.uuid += 1; + id = "dp" + this.uuid; + this._dialogInput = $(""); + this._dialogInput.keydown(this._doKeyDown); + $("body").append(this._dialogInput); + inst = this._dialogInst = this._newInst(this._dialogInput, false); + inst.settings = {}; + $.data(this._dialogInput[0], PROP_NAME, inst); + } + extendRemove(inst.settings, settings || {}); + date = (date && date.constructor === Date ? this._formatDate(inst, date) : date); + this._dialogInput.val(date); + + this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null); + if (!this._pos) { + browserWidth = document.documentElement.clientWidth; + browserHeight = document.documentElement.clientHeight; + scrollX = document.documentElement.scrollLeft || document.body.scrollLeft; + scrollY = document.documentElement.scrollTop || document.body.scrollTop; + this._pos = // should use actual width/height below + [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY]; + } + + // move input on screen for focus, but hidden behind dialog + this._dialogInput.css("left", (this._pos[0] + 20) + "px").css("top", this._pos[1] + "px"); + inst.settings.onSelect = onSelect; + this._inDialog = true; + this.dpDiv.addClass(this._dialogClass); + this._showDatepicker(this._dialogInput[0]); + if ($.blockUI) { + $.blockUI(this.dpDiv); + } + $.data(this._dialogInput[0], PROP_NAME, inst); + return this; + }, + + /* Detach a datepicker from its control. + * @param target element - the target input field or division or span + */ + _destroyDatepicker: function(target) { + var nodeName, + $target = $(target), + inst = $.data(target, PROP_NAME); + + if (!$target.hasClass(this.markerClassName)) { + return; + } + + nodeName = target.nodeName.toLowerCase(); + $.removeData(target, PROP_NAME); + if (nodeName === "input") { + inst.append.remove(); + inst.trigger.remove(); + $target.removeClass(this.markerClassName). + unbind("focus", this._showDatepicker). + unbind("keydown", this._doKeyDown). + unbind("keypress", this._doKeyPress). + unbind("keyup", this._doKeyUp); + } else if (nodeName === "div" || nodeName === "span") { + $target.removeClass(this.markerClassName).empty(); + } + }, + + /* Enable the date picker to a jQuery selection. + * @param target element - the target input field or division or span + */ + _enableDatepicker: function(target) { + var nodeName, inline, + $target = $(target), + inst = $.data(target, PROP_NAME); + + if (!$target.hasClass(this.markerClassName)) { + return; + } + + nodeName = target.nodeName.toLowerCase(); + if (nodeName === "input") { + target.disabled = false; + inst.trigger.filter("button"). + each(function() { this.disabled = false; }).end(). + filter("img").css({opacity: "1.0", cursor: ""}); + } else if (nodeName === "div" || nodeName === "span") { + inline = $target.children("." + this._inlineClass); + inline.children().removeClass("ui-state-disabled"); + inline.find("select.ui-datepicker-month, select.ui-datepicker-year"). + prop("disabled", false); + } + this._disabledInputs = $.map(this._disabledInputs, + function(value) { return (value === target ? null : value); }); // delete entry + }, + + /* Disable the date picker to a jQuery selection. + * @param target element - the target input field or division or span + */ + _disableDatepicker: function(target) { + var nodeName, inline, + $target = $(target), + inst = $.data(target, PROP_NAME); + + if (!$target.hasClass(this.markerClassName)) { + return; + } + + nodeName = target.nodeName.toLowerCase(); + if (nodeName === "input") { + target.disabled = true; + inst.trigger.filter("button"). + each(function() { this.disabled = true; }).end(). + filter("img").css({opacity: "0.5", cursor: "default"}); + } else if (nodeName === "div" || nodeName === "span") { + inline = $target.children("." + this._inlineClass); + inline.children().addClass("ui-state-disabled"); + inline.find("select.ui-datepicker-month, select.ui-datepicker-year"). + prop("disabled", true); + } + this._disabledInputs = $.map(this._disabledInputs, + function(value) { return (value === target ? null : value); }); // delete entry + this._disabledInputs[this._disabledInputs.length] = target; + }, + + /* Is the first field in a jQuery collection disabled as a datepicker? + * @param target element - the target input field or division or span + * @return boolean - true if disabled, false if enabled + */ + _isDisabledDatepicker: function(target) { + if (!target) { + return false; + } + for (var i = 0; i < this._disabledInputs.length; i++) { + if (this._disabledInputs[i] === target) { + return true; + } + } + return false; + }, + + /* Retrieve the instance data for the target control. + * @param target element - the target input field or division or span + * @return object - the associated instance data + * @throws error if a jQuery problem getting data + */ + _getInst: function(target) { + try { + return $.data(target, PROP_NAME); + } + catch (err) { + throw "Missing instance data for this datepicker"; + } + }, + + /* Update or retrieve the settings for a date picker attached to an input field or division. + * @param target element - the target input field or division or span + * @param name object - the new settings to update or + * string - the name of the setting to change or retrieve, + * when retrieving also "all" for all instance settings or + * "defaults" for all global defaults + * @param value any - the new value for the setting + * (omit if above is an object or to retrieve a value) + */ + _optionDatepicker: function(target, name, value) { + var settings, date, minDate, maxDate, + inst = this._getInst(target); + + if (arguments.length === 2 && typeof name === "string") { + return (name === "defaults" ? $.extend({}, $.datepicker._defaults) : + (inst ? (name === "all" ? $.extend({}, inst.settings) : + this._get(inst, name)) : null)); + } + + settings = name || {}; + if (typeof name === "string") { + settings = {}; + settings[name] = value; + } + + if (inst) { + if (this._curInst === inst) { + this._hideDatepicker(); + } + + date = this._getDateDatepicker(target, true); + minDate = this._getMinMaxDate(inst, "min"); + maxDate = this._getMinMaxDate(inst, "max"); + extendRemove(inst.settings, settings); + // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided + if (minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined) { + inst.settings.minDate = this._formatDate(inst, minDate); + } + if (maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined) { + inst.settings.maxDate = this._formatDate(inst, maxDate); + } + if ( "disabled" in settings ) { + if ( settings.disabled ) { + this._disableDatepicker(target); + } else { + this._enableDatepicker(target); + } + } + this._attachments($(target), inst); + this._autoSize(inst); + this._setDate(inst, date); + this._updateAlternate(inst); + this._updateDatepicker(inst); + } + }, + + // change method deprecated + _changeDatepicker: function(target, name, value) { + this._optionDatepicker(target, name, value); + }, + + /* Redraw the date picker attached to an input field or division. + * @param target element - the target input field or division or span + */ + _refreshDatepicker: function(target) { + var inst = this._getInst(target); + if (inst) { + this._updateDatepicker(inst); + } + }, + + /* Set the dates for a jQuery selection. + * @param target element - the target input field or division or span + * @param date Date - the new date + */ + _setDateDatepicker: function(target, date) { + var inst = this._getInst(target); + if (inst) { + this._setDate(inst, date); + this._updateDatepicker(inst); + this._updateAlternate(inst); + } + }, + + /* Get the date(s) for the first entry in a jQuery selection. + * @param target element - the target input field or division or span + * @param noDefault boolean - true if no default date is to be used + * @return Date - the current date + */ + _getDateDatepicker: function(target, noDefault) { + var inst = this._getInst(target); + if (inst && !inst.inline) { + this._setDateFromField(inst, noDefault); + } + return (inst ? this._getDate(inst) : null); + }, + + /* Handle keystrokes. */ + _doKeyDown: function(event) { + var onSelect, dateStr, sel, + inst = $.datepicker._getInst(event.target), + handled = true, + isRTL = inst.dpDiv.is(".ui-datepicker-rtl"); + + inst._keyEvent = true; + if ($.datepicker._datepickerShowing) { + switch (event.keyCode) { + case 9: $.datepicker._hideDatepicker(); + handled = false; + break; // hide on tab out + case 13: sel = $("td." + $.datepicker._dayOverClass + ":not(." + + $.datepicker._currentClass + ")", inst.dpDiv); + if (sel[0]) { + $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]); + } + + onSelect = $.datepicker._get(inst, "onSelect"); + if (onSelect) { + dateStr = $.datepicker._formatDate(inst); + + // trigger custom callback + onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); + } else { + $.datepicker._hideDatepicker(); + } + + return false; // don't submit the form + case 27: $.datepicker._hideDatepicker(); + break; // hide on escape + case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ? + -$.datepicker._get(inst, "stepBigMonths") : + -$.datepicker._get(inst, "stepMonths")), "M"); + break; // previous month/year on page up/+ ctrl + case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ? + +$.datepicker._get(inst, "stepBigMonths") : + +$.datepicker._get(inst, "stepMonths")), "M"); + break; // next month/year on page down/+ ctrl + case 35: if (event.ctrlKey || event.metaKey) { + $.datepicker._clearDate(event.target); + } + handled = event.ctrlKey || event.metaKey; + break; // clear on ctrl or command +end + case 36: if (event.ctrlKey || event.metaKey) { + $.datepicker._gotoToday(event.target); + } + handled = event.ctrlKey || event.metaKey; + break; // current on ctrl or command +home + case 37: if (event.ctrlKey || event.metaKey) { + $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), "D"); + } + handled = event.ctrlKey || event.metaKey; + // -1 day on ctrl or command +left + if (event.originalEvent.altKey) { + $.datepicker._adjustDate(event.target, (event.ctrlKey ? + -$.datepicker._get(inst, "stepBigMonths") : + -$.datepicker._get(inst, "stepMonths")), "M"); + } + // next month/year on alt +left on Mac + break; + case 38: if (event.ctrlKey || event.metaKey) { + $.datepicker._adjustDate(event.target, -7, "D"); + } + handled = event.ctrlKey || event.metaKey; + break; // -1 week on ctrl or command +up + case 39: if (event.ctrlKey || event.metaKey) { + $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), "D"); + } + handled = event.ctrlKey || event.metaKey; + // +1 day on ctrl or command +right + if (event.originalEvent.altKey) { + $.datepicker._adjustDate(event.target, (event.ctrlKey ? + +$.datepicker._get(inst, "stepBigMonths") : + +$.datepicker._get(inst, "stepMonths")), "M"); + } + // next month/year on alt +right + break; + case 40: if (event.ctrlKey || event.metaKey) { + $.datepicker._adjustDate(event.target, +7, "D"); + } + handled = event.ctrlKey || event.metaKey; + break; // +1 week on ctrl or command +down + default: handled = false; + } + } else if (event.keyCode === 36 && event.ctrlKey) { // display the date picker on ctrl+home + $.datepicker._showDatepicker(this); + } else { + handled = false; + } + + if (handled) { + event.preventDefault(); + event.stopPropagation(); + } + }, + + /* Filter entered characters - based on date format. */ + _doKeyPress: function(event) { + var chars, chr, + inst = $.datepicker._getInst(event.target); + + if ($.datepicker._get(inst, "constrainInput")) { + chars = $.datepicker._possibleChars($.datepicker._get(inst, "dateFormat")); + chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode); + return event.ctrlKey || event.metaKey || (chr < " " || !chars || chars.indexOf(chr) > -1); + } + }, + + /* Synchronise manual entry and field/alternate field. */ + _doKeyUp: function(event) { + var date, + inst = $.datepicker._getInst(event.target); + + if (inst.input.val() !== inst.lastVal) { + try { + date = $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"), + (inst.input ? inst.input.val() : null), + $.datepicker._getFormatConfig(inst)); + + if (date) { // only if valid + $.datepicker._setDateFromField(inst); + $.datepicker._updateAlternate(inst); + $.datepicker._updateDatepicker(inst); + } + } + catch (err) { + } + } + return true; + }, + + /* Pop-up the date picker for a given input field. + * If false returned from beforeShow event handler do not show. + * @param input element - the input field attached to the date picker or + * event - if triggered by focus + */ + _showDatepicker: function(input) { + input = input.target || input; + if (input.nodeName.toLowerCase() !== "input") { // find from button/image trigger + input = $("input", input.parentNode)[0]; + } + + if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) { // already here + return; + } + + var inst, beforeShow, beforeShowSettings, isFixed, + offset, showAnim, duration; + + inst = $.datepicker._getInst(input); + if ($.datepicker._curInst && $.datepicker._curInst !== inst) { + $.datepicker._curInst.dpDiv.stop(true, true); + if ( inst && $.datepicker._datepickerShowing ) { + $.datepicker._hideDatepicker( $.datepicker._curInst.input[0] ); + } + } + + beforeShow = $.datepicker._get(inst, "beforeShow"); + beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {}; + if(beforeShowSettings === false){ + return; + } + extendRemove(inst.settings, beforeShowSettings); + + inst.lastVal = null; + $.datepicker._lastInput = input; + $.datepicker._setDateFromField(inst); + + if ($.datepicker._inDialog) { // hide cursor + input.value = ""; + } + if (!$.datepicker._pos) { // position below input + $.datepicker._pos = $.datepicker._findPos(input); + $.datepicker._pos[1] += input.offsetHeight; // add the height + } + + isFixed = false; + $(input).parents().each(function() { + isFixed |= $(this).css("position") === "fixed"; + return !isFixed; + }); + + offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]}; + $.datepicker._pos = null; + //to avoid flashes on Firefox + inst.dpDiv.empty(); + // determine sizing offscreen + inst.dpDiv.css({position: "absolute", display: "block", top: "-1000px"}); + $.datepicker._updateDatepicker(inst); + // fix width for dynamic number of date pickers + // and adjust position before showing + offset = $.datepicker._checkOffset(inst, offset, isFixed); + inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ? + "static" : (isFixed ? "fixed" : "absolute")), display: "none", + left: offset.left + "px", top: offset.top + "px"}); + + if (!inst.inline) { + showAnim = $.datepicker._get(inst, "showAnim"); + duration = $.datepicker._get(inst, "duration"); + inst.dpDiv.zIndex($(input).zIndex()+1); + $.datepicker._datepickerShowing = true; + + if ( $.effects && $.effects.effect[ showAnim ] ) { + inst.dpDiv.show(showAnim, $.datepicker._get(inst, "showOptions"), duration); + } else { + inst.dpDiv[showAnim || "show"](showAnim ? duration : null); + } + + if ( $.datepicker._shouldFocusInput( inst ) ) { + inst.input.focus(); + } + + $.datepicker._curInst = inst; + } + }, + + /* Generate the date picker content. */ + _updateDatepicker: function(inst) { + this.maxRows = 4; //Reset the max number of rows being displayed (see #7043) + instActive = inst; // for delegate hover events + inst.dpDiv.empty().append(this._generateHTML(inst)); + this._attachHandlers(inst); + inst.dpDiv.find("." + this._dayOverClass + " a").mouseover(); + + var origyearshtml, + numMonths = this._getNumberOfMonths(inst), + cols = numMonths[1], + width = 17; + + inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""); + if (cols > 1) { + inst.dpDiv.addClass("ui-datepicker-multi-" + cols).css("width", (width * cols) + "em"); + } + inst.dpDiv[(numMonths[0] !== 1 || numMonths[1] !== 1 ? "add" : "remove") + + "Class"]("ui-datepicker-multi"); + inst.dpDiv[(this._get(inst, "isRTL") ? "add" : "remove") + + "Class"]("ui-datepicker-rtl"); + + if (inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) { + inst.input.focus(); + } + + // deffered render of the years select (to avoid flashes on Firefox) + if( inst.yearshtml ){ + origyearshtml = inst.yearshtml; + setTimeout(function(){ + //assure that inst.yearshtml didn't change. + if( origyearshtml === inst.yearshtml && inst.yearshtml ){ + inst.dpDiv.find("select.ui-datepicker-year:first").replaceWith(inst.yearshtml); + } + origyearshtml = inst.yearshtml = null; + }, 0); + } + }, + + // #6694 - don't focus the input if it's already focused + // this breaks the change event in IE + // Support: IE and jQuery <1.9 + _shouldFocusInput: function( inst ) { + return inst.input && inst.input.is( ":visible" ) && !inst.input.is( ":disabled" ) && !inst.input.is( ":focus" ); + }, + + /* Check positioning to remain on screen. */ + _checkOffset: function(inst, offset, isFixed) { + var dpWidth = inst.dpDiv.outerWidth(), + dpHeight = inst.dpDiv.outerHeight(), + inputWidth = inst.input ? inst.input.outerWidth() : 0, + inputHeight = inst.input ? inst.input.outerHeight() : 0, + viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft()), + viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop()); + + offset.left -= (this._get(inst, "isRTL") ? (dpWidth - inputWidth) : 0); + offset.left -= (isFixed && offset.left === inst.input.offset().left) ? $(document).scrollLeft() : 0; + offset.top -= (isFixed && offset.top === (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0; + + // now check if datepicker is showing outside window viewport - move to a better place if so. + offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ? + Math.abs(offset.left + dpWidth - viewWidth) : 0); + offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ? + Math.abs(dpHeight + inputHeight) : 0); + + return offset; + }, + + /* Find an object's position on the screen. */ + _findPos: function(obj) { + var position, + inst = this._getInst(obj), + isRTL = this._get(inst, "isRTL"); + + while (obj && (obj.type === "hidden" || obj.nodeType !== 1 || $.expr.filters.hidden(obj))) { + obj = obj[isRTL ? "previousSibling" : "nextSibling"]; + } + + position = $(obj).offset(); + return [position.left, position.top]; + }, + + /* Hide the date picker from view. + * @param input element - the input field attached to the date picker + */ + _hideDatepicker: function(input) { + var showAnim, duration, postProcess, onClose, + inst = this._curInst; + + if (!inst || (input && inst !== $.data(input, PROP_NAME))) { + return; + } + + if (this._datepickerShowing) { + showAnim = this._get(inst, "showAnim"); + duration = this._get(inst, "duration"); + postProcess = function() { + $.datepicker._tidyDialog(inst); + }; + + // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed + if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) { + inst.dpDiv.hide(showAnim, $.datepicker._get(inst, "showOptions"), duration, postProcess); + } else { + inst.dpDiv[(showAnim === "slideDown" ? "slideUp" : + (showAnim === "fadeIn" ? "fadeOut" : "hide"))]((showAnim ? duration : null), postProcess); + } + + if (!showAnim) { + postProcess(); + } + this._datepickerShowing = false; + + onClose = this._get(inst, "onClose"); + if (onClose) { + onClose.apply((inst.input ? inst.input[0] : null), [(inst.input ? inst.input.val() : ""), inst]); + } + + this._lastInput = null; + if (this._inDialog) { + this._dialogInput.css({ position: "absolute", left: "0", top: "-100px" }); + if ($.blockUI) { + $.unblockUI(); + $("body").append(this.dpDiv); + } + } + this._inDialog = false; + } + }, + + /* Tidy up after a dialog display. */ + _tidyDialog: function(inst) { + inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar"); + }, + + /* Close date picker if clicked elsewhere. */ + _checkExternalClick: function(event) { + if (!$.datepicker._curInst) { + return; + } + + var $target = $(event.target), + inst = $.datepicker._getInst($target[0]); + + if ( ( ( $target[0].id !== $.datepicker._mainDivId && + $target.parents("#" + $.datepicker._mainDivId).length === 0 && + !$target.hasClass($.datepicker.markerClassName) && + !$target.closest("." + $.datepicker._triggerClass).length && + $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) || + ( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !== inst ) ) { + $.datepicker._hideDatepicker(); + } + }, + + /* Adjust one of the date sub-fields. */ + _adjustDate: function(id, offset, period) { + var target = $(id), + inst = this._getInst(target[0]); + + if (this._isDisabledDatepicker(target[0])) { + return; + } + this._adjustInstDate(inst, offset + + (period === "M" ? this._get(inst, "showCurrentAtPos") : 0), // undo positioning + period); + this._updateDatepicker(inst); + }, + + /* Action for current link. */ + _gotoToday: function(id) { + var date, + target = $(id), + inst = this._getInst(target[0]); + + if (this._get(inst, "gotoCurrent") && inst.currentDay) { + inst.selectedDay = inst.currentDay; + inst.drawMonth = inst.selectedMonth = inst.currentMonth; + inst.drawYear = inst.selectedYear = inst.currentYear; + } else { + date = new Date(); + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + } + this._notifyChange(inst); + this._adjustDate(target); + }, + + /* Action for selecting a new month/year. */ + _selectMonthYear: function(id, select, period) { + var target = $(id), + inst = this._getInst(target[0]); + + inst["selected" + (period === "M" ? "Month" : "Year")] = + inst["draw" + (period === "M" ? "Month" : "Year")] = + parseInt(select.options[select.selectedIndex].value,10); + + this._notifyChange(inst); + this._adjustDate(target); + }, + + /* Action for selecting a day. */ + _selectDay: function(id, month, year, td) { + var inst, + target = $(id); + + if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) { + return; + } + + inst = this._getInst(target[0]); + inst.selectedDay = inst.currentDay = $("a", td).html(); + inst.selectedMonth = inst.currentMonth = month; + inst.selectedYear = inst.currentYear = year; + this._selectDate(id, this._formatDate(inst, + inst.currentDay, inst.currentMonth, inst.currentYear)); + }, + + /* Erase the input field and hide the date picker. */ + _clearDate: function(id) { + var target = $(id); + this._selectDate(target, ""); + }, + + /* Update the input field with the selected date. */ + _selectDate: function(id, dateStr) { + var onSelect, + target = $(id), + inst = this._getInst(target[0]); + + dateStr = (dateStr != null ? dateStr : this._formatDate(inst)); + if (inst.input) { + inst.input.val(dateStr); + } + this._updateAlternate(inst); + + onSelect = this._get(inst, "onSelect"); + if (onSelect) { + onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback + } else if (inst.input) { + inst.input.trigger("change"); // fire the change event + } + + if (inst.inline){ + this._updateDatepicker(inst); + } else { + this._hideDatepicker(); + this._lastInput = inst.input[0]; + if (typeof(inst.input[0]) !== "object") { + inst.input.focus(); // restore focus + } + this._lastInput = null; + } + }, + + /* Update any alternate field to synchronise with the main field. */ + _updateAlternate: function(inst) { + var altFormat, date, dateStr, + altField = this._get(inst, "altField"); + + if (altField) { // update alternate field too + altFormat = this._get(inst, "altFormat") || this._get(inst, "dateFormat"); + date = this._getDate(inst); + dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst)); + $(altField).each(function() { $(this).val(dateStr); }); + } + }, + + /* Set as beforeShowDay function to prevent selection of weekends. + * @param date Date - the date to customise + * @return [boolean, string] - is this date selectable?, what is its CSS class? + */ + noWeekends: function(date) { + var day = date.getDay(); + return [(day > 0 && day < 6), ""]; + }, + + /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition. + * @param date Date - the date to get the week for + * @return number - the number of the week within the year that contains this date + */ + iso8601Week: function(date) { + var time, + checkDate = new Date(date.getTime()); + + // Find Thursday of this week starting on Monday + checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); + + time = checkDate.getTime(); + checkDate.setMonth(0); // Compare with Jan 1 + checkDate.setDate(1); + return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; + }, + + /* Parse a string value into a date object. + * See formatDate below for the possible formats. + * + * @param format string - the expected format of the date + * @param value string - the date in the above format + * @param settings Object - attributes include: + * shortYearCutoff number - the cutoff year for determining the century (optional) + * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + * dayNames string[7] - names of the days from Sunday (optional) + * monthNamesShort string[12] - abbreviated names of the months (optional) + * monthNames string[12] - names of the months (optional) + * @return Date - the extracted date value or null if value is blank + */ + parseDate: function (format, value, settings) { + if (format == null || value == null) { + throw "Invalid arguments"; + } + + value = (typeof value === "object" ? value.toString() : value + ""); + if (value === "") { + return null; + } + + var iFormat, dim, extra, + iValue = 0, + shortYearCutoffTemp = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff, + shortYearCutoff = (typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp : + new Date().getFullYear() % 100 + parseInt(shortYearCutoffTemp, 10)), + dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort, + dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames, + monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort, + monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames, + year = -1, + month = -1, + day = -1, + doy = -1, + literal = false, + date, + // Check whether a format character is doubled + lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match); + if (matches) { + iFormat++; + } + return matches; + }, + // Extract a number from the string value + getNumber = function(match) { + var isDoubled = lookAhead(match), + size = (match === "@" ? 14 : (match === "!" ? 20 : + (match === "y" && isDoubled ? 4 : (match === "o" ? 3 : 2)))), + digits = new RegExp("^\\d{1," + size + "}"), + num = value.substring(iValue).match(digits); + if (!num) { + throw "Missing number at position " + iValue; + } + iValue += num[0].length; + return parseInt(num[0], 10); + }, + // Extract a name from the string value and convert to an index + getName = function(match, shortNames, longNames) { + var index = -1, + names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) { + return [ [k, v] ]; + }).sort(function (a, b) { + return -(a[1].length - b[1].length); + }); + + $.each(names, function (i, pair) { + var name = pair[1]; + if (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) { + index = pair[0]; + iValue += name.length; + return false; + } + }); + if (index !== -1) { + return index + 1; + } else { + throw "Unknown name at position " + iValue; + } + }, + // Confirm that a literal character matches the string value + checkLiteral = function() { + if (value.charAt(iValue) !== format.charAt(iFormat)) { + throw "Unexpected literal at position " + iValue; + } + iValue++; + }; + + for (iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) { + if (format.charAt(iFormat) === "'" && !lookAhead("'")) { + literal = false; + } else { + checkLiteral(); + } + } else { + switch (format.charAt(iFormat)) { + case "d": + day = getNumber("d"); + break; + case "D": + getName("D", dayNamesShort, dayNames); + break; + case "o": + doy = getNumber("o"); + break; + case "m": + month = getNumber("m"); + break; + case "M": + month = getName("M", monthNamesShort, monthNames); + break; + case "y": + year = getNumber("y"); + break; + case "@": + date = new Date(getNumber("@")); + year = date.getFullYear(); + month = date.getMonth() + 1; + day = date.getDate(); + break; + case "!": + date = new Date((getNumber("!") - this._ticksTo1970) / 10000); + year = date.getFullYear(); + month = date.getMonth() + 1; + day = date.getDate(); + break; + case "'": + if (lookAhead("'")){ + checkLiteral(); + } else { + literal = true; + } + break; + default: + checkLiteral(); + } + } + } + + if (iValue < value.length){ + extra = value.substr(iValue); + if (!/^\s+/.test(extra)) { + throw "Extra/unparsed characters found in date: " + extra; + } + } + + if (year === -1) { + year = new Date().getFullYear(); + } else if (year < 100) { + year += new Date().getFullYear() - new Date().getFullYear() % 100 + + (year <= shortYearCutoff ? 0 : -100); + } + + if (doy > -1) { + month = 1; + day = doy; + do { + dim = this._getDaysInMonth(year, month - 1); + if (day <= dim) { + break; + } + month++; + day -= dim; + } while (true); + } + + date = this._daylightSavingAdjust(new Date(year, month - 1, day)); + if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) { + throw "Invalid date"; // E.g. 31/02/00 + } + return date; + }, + + /* Standard date formats. */ + ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601) + COOKIE: "D, dd M yy", + ISO_8601: "yy-mm-dd", + RFC_822: "D, d M y", + RFC_850: "DD, dd-M-y", + RFC_1036: "D, d M y", + RFC_1123: "D, d M yy", + RFC_2822: "D, d M yy", + RSS: "D, d M y", // RFC 822 + TICKS: "!", + TIMESTAMP: "@", + W3C: "yy-mm-dd", // ISO 8601 + + _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) + + Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000), + + /* Format a date object into a string value. + * The format can be combinations of the following: + * d - day of month (no leading zero) + * dd - day of month (two digit) + * o - day of year (no leading zeros) + * oo - day of year (three digit) + * D - day name short + * DD - day name long + * m - month of year (no leading zero) + * mm - month of year (two digit) + * M - month name short + * MM - month name long + * y - year (two digit) + * yy - year (four digit) + * @ - Unix timestamp (ms since 01/01/1970) + * ! - Windows ticks (100ns since 01/01/0001) + * "..." - literal text + * '' - single quote + * + * @param format string - the desired format of the date + * @param date Date - the date value to format + * @param settings Object - attributes include: + * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + * dayNames string[7] - names of the days from Sunday (optional) + * monthNamesShort string[12] - abbreviated names of the months (optional) + * monthNames string[12] - names of the months (optional) + * @return string - the date in the above format + */ + formatDate: function (format, date, settings) { + if (!date) { + return ""; + } + + var iFormat, + dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort, + dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames, + monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort, + monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames, + // Check whether a format character is doubled + lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match); + if (matches) { + iFormat++; + } + return matches; + }, + // Format a number, with leading zero if necessary + formatNumber = function(match, value, len) { + var num = "" + value; + if (lookAhead(match)) { + while (num.length < len) { + num = "0" + num; + } + } + return num; + }, + // Format a name, short or long as requested + formatName = function(match, value, shortNames, longNames) { + return (lookAhead(match) ? longNames[value] : shortNames[value]); + }, + output = "", + literal = false; + + if (date) { + for (iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) { + if (format.charAt(iFormat) === "'" && !lookAhead("'")) { + literal = false; + } else { + output += format.charAt(iFormat); + } + } else { + switch (format.charAt(iFormat)) { + case "d": + output += formatNumber("d", date.getDate(), 2); + break; + case "D": + output += formatName("D", date.getDay(), dayNamesShort, dayNames); + break; + case "o": + output += formatNumber("o", + Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3); + break; + case "m": + output += formatNumber("m", date.getMonth() + 1, 2); + break; + case "M": + output += formatName("M", date.getMonth(), monthNamesShort, monthNames); + break; + case "y": + output += (lookAhead("y") ? date.getFullYear() : + (date.getYear() % 100 < 10 ? "0" : "") + date.getYear() % 100); + break; + case "@": + output += date.getTime(); + break; + case "!": + output += date.getTime() * 10000 + this._ticksTo1970; + break; + case "'": + if (lookAhead("'")) { + output += "'"; + } else { + literal = true; + } + break; + default: + output += format.charAt(iFormat); + } + } + } + } + return output; + }, + + /* Extract all possible characters from the date format. */ + _possibleChars: function (format) { + var iFormat, + chars = "", + literal = false, + // Check whether a format character is doubled + lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match); + if (matches) { + iFormat++; + } + return matches; + }; + + for (iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) { + if (format.charAt(iFormat) === "'" && !lookAhead("'")) { + literal = false; + } else { + chars += format.charAt(iFormat); + } + } else { + switch (format.charAt(iFormat)) { + case "d": case "m": case "y": case "@": + chars += "0123456789"; + break; + case "D": case "M": + return null; // Accept anything + case "'": + if (lookAhead("'")) { + chars += "'"; + } else { + literal = true; + } + break; + default: + chars += format.charAt(iFormat); + } + } + } + return chars; + }, + + /* Get a setting value, defaulting if necessary. */ + _get: function(inst, name) { + return inst.settings[name] !== undefined ? + inst.settings[name] : this._defaults[name]; + }, + + /* Parse existing date and initialise date picker. */ + _setDateFromField: function(inst, noDefault) { + if (inst.input.val() === inst.lastVal) { + return; + } + + var dateFormat = this._get(inst, "dateFormat"), + dates = inst.lastVal = inst.input ? inst.input.val() : null, + defaultDate = this._getDefaultDate(inst), + date = defaultDate, + settings = this._getFormatConfig(inst); + + try { + date = this.parseDate(dateFormat, dates, settings) || defaultDate; + } catch (event) { + dates = (noDefault ? "" : dates); + } + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + inst.currentDay = (dates ? date.getDate() : 0); + inst.currentMonth = (dates ? date.getMonth() : 0); + inst.currentYear = (dates ? date.getFullYear() : 0); + this._adjustInstDate(inst); + }, + + /* Retrieve the default date shown on opening. */ + _getDefaultDate: function(inst) { + return this._restrictMinMax(inst, + this._determineDate(inst, this._get(inst, "defaultDate"), new Date())); + }, + + /* A date may be specified as an exact value or a relative one. */ + _determineDate: function(inst, date, defaultDate) { + var offsetNumeric = function(offset) { + var date = new Date(); + date.setDate(date.getDate() + offset); + return date; + }, + offsetString = function(offset) { + try { + return $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"), + offset, $.datepicker._getFormatConfig(inst)); + } + catch (e) { + // Ignore + } + + var date = (offset.toLowerCase().match(/^c/) ? + $.datepicker._getDate(inst) : null) || new Date(), + year = date.getFullYear(), + month = date.getMonth(), + day = date.getDate(), + pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g, + matches = pattern.exec(offset); + + while (matches) { + switch (matches[2] || "d") { + case "d" : case "D" : + day += parseInt(matches[1],10); break; + case "w" : case "W" : + day += parseInt(matches[1],10) * 7; break; + case "m" : case "M" : + month += parseInt(matches[1],10); + day = Math.min(day, $.datepicker._getDaysInMonth(year, month)); + break; + case "y": case "Y" : + year += parseInt(matches[1],10); + day = Math.min(day, $.datepicker._getDaysInMonth(year, month)); + break; + } + matches = pattern.exec(offset); + } + return new Date(year, month, day); + }, + newDate = (date == null || date === "" ? defaultDate : (typeof date === "string" ? offsetString(date) : + (typeof date === "number" ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime())))); + + newDate = (newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate); + if (newDate) { + newDate.setHours(0); + newDate.setMinutes(0); + newDate.setSeconds(0); + newDate.setMilliseconds(0); + } + return this._daylightSavingAdjust(newDate); + }, + + /* Handle switch to/from daylight saving. + * Hours may be non-zero on daylight saving cut-over: + * > 12 when midnight changeover, but then cannot generate + * midnight datetime, so jump to 1AM, otherwise reset. + * @param date (Date) the date to check + * @return (Date) the corrected date + */ + _daylightSavingAdjust: function(date) { + if (!date) { + return null; + } + date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0); + return date; + }, + + /* Set the date(s) directly. */ + _setDate: function(inst, date, noChange) { + var clear = !date, + origMonth = inst.selectedMonth, + origYear = inst.selectedYear, + newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date())); + + inst.selectedDay = inst.currentDay = newDate.getDate(); + inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth(); + inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear(); + if ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) && !noChange) { + this._notifyChange(inst); + } + this._adjustInstDate(inst); + if (inst.input) { + inst.input.val(clear ? "" : this._formatDate(inst)); + } + }, + + /* Retrieve the date(s) directly. */ + _getDate: function(inst) { + var startDate = (!inst.currentYear || (inst.input && inst.input.val() === "") ? null : + this._daylightSavingAdjust(new Date( + inst.currentYear, inst.currentMonth, inst.currentDay))); + return startDate; + }, + + /* Attach the onxxx handlers. These are declared statically so + * they work with static code transformers like Caja. + */ + _attachHandlers: function(inst) { + var stepMonths = this._get(inst, "stepMonths"), + id = "#" + inst.id.replace( /\\\\/g, "\\" ); + inst.dpDiv.find("[data-handler]").map(function () { + var handler = { + prev: function () { + $.datepicker._adjustDate(id, -stepMonths, "M"); + }, + next: function () { + $.datepicker._adjustDate(id, +stepMonths, "M"); + }, + hide: function () { + $.datepicker._hideDatepicker(); + }, + today: function () { + $.datepicker._gotoToday(id); + }, + selectDay: function () { + $.datepicker._selectDay(id, +this.getAttribute("data-month"), +this.getAttribute("data-year"), this); + return false; + }, + selectMonth: function () { + $.datepicker._selectMonthYear(id, this, "M"); + return false; + }, + selectYear: function () { + $.datepicker._selectMonthYear(id, this, "Y"); + return false; + } + }; + $(this).bind(this.getAttribute("data-event"), handler[this.getAttribute("data-handler")]); + }); + }, + + /* Generate the HTML for the current state of the date picker. */ + _generateHTML: function(inst) { + var maxDraw, prevText, prev, nextText, next, currentText, gotoDate, + controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin, + monthNames, monthNamesShort, beforeShowDay, showOtherMonths, + selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate, + cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows, + printDate, dRow, tbody, daySettings, otherMonth, unselectable, + tempDate = new Date(), + today = this._daylightSavingAdjust( + new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())), // clear time + isRTL = this._get(inst, "isRTL"), + showButtonPanel = this._get(inst, "showButtonPanel"), + hideIfNoPrevNext = this._get(inst, "hideIfNoPrevNext"), + navigationAsDateFormat = this._get(inst, "navigationAsDateFormat"), + numMonths = this._getNumberOfMonths(inst), + showCurrentAtPos = this._get(inst, "showCurrentAtPos"), + stepMonths = this._get(inst, "stepMonths"), + isMultiMonth = (numMonths[0] !== 1 || numMonths[1] !== 1), + currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) : + new Date(inst.currentYear, inst.currentMonth, inst.currentDay))), + minDate = this._getMinMaxDate(inst, "min"), + maxDate = this._getMinMaxDate(inst, "max"), + drawMonth = inst.drawMonth - showCurrentAtPos, + drawYear = inst.drawYear; + + if (drawMonth < 0) { + drawMonth += 12; + drawYear--; + } + if (maxDate) { + maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(), + maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate())); + maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw); + while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) { + drawMonth--; + if (drawMonth < 0) { + drawMonth = 11; + drawYear--; + } + } + } + inst.drawMonth = drawMonth; + inst.drawYear = drawYear; + + prevText = this._get(inst, "prevText"); + prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)), + this._getFormatConfig(inst))); + + prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ? + "" + prevText + "" : + (hideIfNoPrevNext ? "" : "" + prevText + "")); + + nextText = this._get(inst, "nextText"); + nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)), + this._getFormatConfig(inst))); + + next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ? + "" + nextText + "" : + (hideIfNoPrevNext ? "" : "" + nextText + "")); + + currentText = this._get(inst, "currentText"); + gotoDate = (this._get(inst, "gotoCurrent") && inst.currentDay ? currentDate : today); + currentText = (!navigationAsDateFormat ? currentText : + this.formatDate(currentText, gotoDate, this._getFormatConfig(inst))); + + controls = (!inst.inline ? "" : ""); + + buttonPanel = (showButtonPanel) ? "
      " + (isRTL ? controls : "") + + (this._isInRange(inst, gotoDate) ? "" : "") + (isRTL ? "" : controls) + "
      " : ""; + + firstDay = parseInt(this._get(inst, "firstDay"),10); + firstDay = (isNaN(firstDay) ? 0 : firstDay); + + showWeek = this._get(inst, "showWeek"); + dayNames = this._get(inst, "dayNames"); + dayNamesMin = this._get(inst, "dayNamesMin"); + monthNames = this._get(inst, "monthNames"); + monthNamesShort = this._get(inst, "monthNamesShort"); + beforeShowDay = this._get(inst, "beforeShowDay"); + showOtherMonths = this._get(inst, "showOtherMonths"); + selectOtherMonths = this._get(inst, "selectOtherMonths"); + defaultDate = this._getDefaultDate(inst); + html = ""; + dow; + for (row = 0; row < numMonths[0]; row++) { + group = ""; + this.maxRows = 4; + for (col = 0; col < numMonths[1]; col++) { + selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay)); + cornerClass = " ui-corner-all"; + calender = ""; + if (isMultiMonth) { + calender += "
      "; + } + calender += "
      " + + (/all|left/.test(cornerClass) && row === 0 ? (isRTL ? next : prev) : "") + + (/all|right/.test(cornerClass) && row === 0 ? (isRTL ? prev : next) : "") + + this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate, + row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers + "
      " + + ""; + thead = (showWeek ? "" : ""); + for (dow = 0; dow < 7; dow++) { // days of the week + day = (dow + firstDay) % 7; + thead += "= 5 ? " class='ui-datepicker-week-end'" : "") + ">" + + "" + dayNamesMin[day] + ""; + } + calender += thead + ""; + daysInMonth = this._getDaysInMonth(drawYear, drawMonth); + if (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) { + inst.selectedDay = Math.min(inst.selectedDay, daysInMonth); + } + leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7; + curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate + numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043) + this.maxRows = numRows; + printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays)); + for (dRow = 0; dRow < numRows; dRow++) { // create date picker rows + calender += ""; + tbody = (!showWeek ? "" : ""); + for (dow = 0; dow < 7; dow++) { // create date picker days + daySettings = (beforeShowDay ? + beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, ""]); + otherMonth = (printDate.getMonth() !== drawMonth); + unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] || + (minDate && printDate < minDate) || (maxDate && printDate > maxDate); + tbody += ""; // display selectable date + printDate.setDate(printDate.getDate() + 1); + printDate = this._daylightSavingAdjust(printDate); + } + calender += tbody + ""; + } + drawMonth++; + if (drawMonth > 11) { + drawMonth = 0; + drawYear++; + } + calender += "
      " + this._get(inst, "weekHeader") + "
      " + + this._get(inst, "calculateWeek")(printDate) + "" + // actions + (otherMonth && !showOtherMonths ? " " : // display for other months + (unselectable ? "" + printDate.getDate() + "" : "" + printDate.getDate() + "")) + "
      " + (isMultiMonth ? "
      " + + ((numMonths[0] > 0 && col === numMonths[1]-1) ? "
      " : "") : ""); + group += calender; + } + html += group; + } + html += buttonPanel; + inst._keyEvent = false; + return html; + }, + + /* Generate the month and year header. */ + _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate, + secondary, monthNames, monthNamesShort) { + + var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear, + changeMonth = this._get(inst, "changeMonth"), + changeYear = this._get(inst, "changeYear"), + showMonthAfterYear = this._get(inst, "showMonthAfterYear"), + html = "
      ", + monthHtml = ""; + + // month selection + if (secondary || !changeMonth) { + monthHtml += "" + monthNames[drawMonth] + ""; + } else { + inMinYear = (minDate && minDate.getFullYear() === drawYear); + inMaxYear = (maxDate && maxDate.getFullYear() === drawYear); + monthHtml += ""; + } + + if (!showMonthAfterYear) { + html += monthHtml + (secondary || !(changeMonth && changeYear) ? " " : ""); + } + + // year selection + if ( !inst.yearshtml ) { + inst.yearshtml = ""; + if (secondary || !changeYear) { + html += "" + drawYear + ""; + } else { + // determine range of years to display + years = this._get(inst, "yearRange").split(":"); + thisYear = new Date().getFullYear(); + determineYear = function(value) { + var year = (value.match(/c[+\-].*/) ? drawYear + parseInt(value.substring(1), 10) : + (value.match(/[+\-].*/) ? thisYear + parseInt(value, 10) : + parseInt(value, 10))); + return (isNaN(year) ? thisYear : year); + }; + year = determineYear(years[0]); + endYear = Math.max(year, determineYear(years[1] || "")); + year = (minDate ? Math.max(year, minDate.getFullYear()) : year); + endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear); + inst.yearshtml += ""; + + html += inst.yearshtml; + inst.yearshtml = null; + } + } + + html += this._get(inst, "yearSuffix"); + if (showMonthAfterYear) { + html += (secondary || !(changeMonth && changeYear) ? " " : "") + monthHtml; + } + html += "
      "; // Close datepicker_header + return html; + }, + + /* Adjust one of the date sub-fields. */ + _adjustInstDate: function(inst, offset, period) { + var year = inst.drawYear + (period === "Y" ? offset : 0), + month = inst.drawMonth + (period === "M" ? offset : 0), + day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + (period === "D" ? offset : 0), + date = this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month, day))); + + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + if (period === "M" || period === "Y") { + this._notifyChange(inst); + } + }, + + /* Ensure a date is within any min/max bounds. */ + _restrictMinMax: function(inst, date) { + var minDate = this._getMinMaxDate(inst, "min"), + maxDate = this._getMinMaxDate(inst, "max"), + newDate = (minDate && date < minDate ? minDate : date); + return (maxDate && newDate > maxDate ? maxDate : newDate); + }, + + /* Notify change of month/year. */ + _notifyChange: function(inst) { + var onChange = this._get(inst, "onChangeMonthYear"); + if (onChange) { + onChange.apply((inst.input ? inst.input[0] : null), + [inst.selectedYear, inst.selectedMonth + 1, inst]); + } + }, + + /* Determine the number of months to show. */ + _getNumberOfMonths: function(inst) { + var numMonths = this._get(inst, "numberOfMonths"); + return (numMonths == null ? [1, 1] : (typeof numMonths === "number" ? [1, numMonths] : numMonths)); + }, + + /* Determine the current maximum date - ensure no time components are set. */ + _getMinMaxDate: function(inst, minMax) { + return this._determineDate(inst, this._get(inst, minMax + "Date"), null); + }, + + /* Find the number of days in a given month. */ + _getDaysInMonth: function(year, month) { + return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate(); + }, + + /* Find the day of the week of the first of a month. */ + _getFirstDayOfMonth: function(year, month) { + return new Date(year, month, 1).getDay(); + }, + + /* Determines if we should allow a "next/prev" month display change. */ + _canAdjustMonth: function(inst, offset, curYear, curMonth) { + var numMonths = this._getNumberOfMonths(inst), + date = this._daylightSavingAdjust(new Date(curYear, + curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1)); + + if (offset < 0) { + date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth())); + } + return this._isInRange(inst, date); + }, + + /* Is the given date in the accepted range? */ + _isInRange: function(inst, date) { + var yearSplit, currentYear, + minDate = this._getMinMaxDate(inst, "min"), + maxDate = this._getMinMaxDate(inst, "max"), + minYear = null, + maxYear = null, + years = this._get(inst, "yearRange"); + if (years){ + yearSplit = years.split(":"); + currentYear = new Date().getFullYear(); + minYear = parseInt(yearSplit[0], 10); + maxYear = parseInt(yearSplit[1], 10); + if ( yearSplit[0].match(/[+\-].*/) ) { + minYear += currentYear; + } + if ( yearSplit[1].match(/[+\-].*/) ) { + maxYear += currentYear; + } + } + + return ((!minDate || date.getTime() >= minDate.getTime()) && + (!maxDate || date.getTime() <= maxDate.getTime()) && + (!minYear || date.getFullYear() >= minYear) && + (!maxYear || date.getFullYear() <= maxYear)); + }, + + /* Provide the configuration settings for formatting/parsing. */ + _getFormatConfig: function(inst) { + var shortYearCutoff = this._get(inst, "shortYearCutoff"); + shortYearCutoff = (typeof shortYearCutoff !== "string" ? shortYearCutoff : + new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10)); + return {shortYearCutoff: shortYearCutoff, + dayNamesShort: this._get(inst, "dayNamesShort"), dayNames: this._get(inst, "dayNames"), + monthNamesShort: this._get(inst, "monthNamesShort"), monthNames: this._get(inst, "monthNames")}; + }, + + /* Format the given date for display. */ + _formatDate: function(inst, day, month, year) { + if (!day) { + inst.currentDay = inst.selectedDay; + inst.currentMonth = inst.selectedMonth; + inst.currentYear = inst.selectedYear; + } + var date = (day ? (typeof day === "object" ? day : + this._daylightSavingAdjust(new Date(year, month, day))) : + this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay))); + return this.formatDate(this._get(inst, "dateFormat"), date, this._getFormatConfig(inst)); + } +}); + +/* + * Bind hover events for datepicker elements. + * Done via delegate so the binding only occurs once in the lifetime of the parent div. + * Global instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker. + */ +function bindHover(dpDiv) { + var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a"; + return dpDiv.delegate(selector, "mouseout", function() { + $(this).removeClass("ui-state-hover"); + if (this.className.indexOf("ui-datepicker-prev") !== -1) { + $(this).removeClass("ui-datepicker-prev-hover"); + } + if (this.className.indexOf("ui-datepicker-next") !== -1) { + $(this).removeClass("ui-datepicker-next-hover"); + } + }) + .delegate(selector, "mouseover", function(){ + if (!$.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0])) { + $(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"); + $(this).addClass("ui-state-hover"); + if (this.className.indexOf("ui-datepicker-prev") !== -1) { + $(this).addClass("ui-datepicker-prev-hover"); + } + if (this.className.indexOf("ui-datepicker-next") !== -1) { + $(this).addClass("ui-datepicker-next-hover"); + } + } + }); +} + +/* jQuery extend now ignores nulls! */ +function extendRemove(target, props) { + $.extend(target, props); + for (var name in props) { + if (props[name] == null) { + target[name] = props[name]; + } + } + return target; +} + +/* Invoke the datepicker functionality. + @param options string - a command, optionally followed by additional parameters or + Object - settings for attaching new datepicker functionality + @return jQuery object */ +$.fn.datepicker = function(options){ + + /* Verify an empty collection wasn't passed - Fixes #6976 */ + if ( !this.length ) { + return this; + } + + /* Initialise the date picker. */ + if (!$.datepicker.initialized) { + $(document).mousedown($.datepicker._checkExternalClick); + $.datepicker.initialized = true; + } + + /* Append datepicker main container to body if not exist. */ + if ($("#"+$.datepicker._mainDivId).length === 0) { + $("body").append($.datepicker.dpDiv); + } + + var otherArgs = Array.prototype.slice.call(arguments, 1); + if (typeof options === "string" && (options === "isDisabled" || options === "getDate" || options === "widget")) { + return $.datepicker["_" + options + "Datepicker"]. + apply($.datepicker, [this[0]].concat(otherArgs)); + } + if (options === "option" && arguments.length === 2 && typeof arguments[1] === "string") { + return $.datepicker["_" + options + "Datepicker"]. + apply($.datepicker, [this[0]].concat(otherArgs)); + } + return this.each(function() { + typeof options === "string" ? + $.datepicker["_" + options + "Datepicker"]. + apply($.datepicker, [this].concat(otherArgs)) : + $.datepicker._attachDatepicker(this, options); + }); +}; + +$.datepicker = new Datepicker(); // singleton instance +$.datepicker.initialized = false; +$.datepicker.uuid = new Date().getTime(); +$.datepicker.version = "1.10.4"; + +})(jQuery); +(function( $, undefined ) { + +var sizeRelatedOptions = { + buttons: true, + height: true, + maxHeight: true, + maxWidth: true, + minHeight: true, + minWidth: true, + width: true + }, + resizableRelatedOptions = { + maxHeight: true, + maxWidth: true, + minHeight: true, + minWidth: true + }; + +$.widget( "ui.dialog", { + version: "1.10.4", + options: { + appendTo: "body", + autoOpen: true, + buttons: [], + closeOnEscape: true, + closeText: "close", + dialogClass: "", + draggable: true, + hide: null, + height: "auto", + maxHeight: null, + maxWidth: null, + minHeight: 150, + minWidth: 150, + modal: false, + position: { + my: "center", + at: "center", + of: window, + collision: "fit", + // Ensure the titlebar is always visible + using: function( pos ) { + var topOffset = $( this ).css( pos ).offset().top; + if ( topOffset < 0 ) { + $( this ).css( "top", pos.top - topOffset ); + } + } + }, + resizable: true, + show: null, + title: null, + width: 300, + + // callbacks + beforeClose: null, + close: null, + drag: null, + dragStart: null, + dragStop: null, + focus: null, + open: null, + resize: null, + resizeStart: null, + resizeStop: null + }, + + _create: function() { + this.originalCss = { + display: this.element[0].style.display, + width: this.element[0].style.width, + minHeight: this.element[0].style.minHeight, + maxHeight: this.element[0].style.maxHeight, + height: this.element[0].style.height + }; + this.originalPosition = { + parent: this.element.parent(), + index: this.element.parent().children().index( this.element ) + }; + this.originalTitle = this.element.attr("title"); + this.options.title = this.options.title || this.originalTitle; + + this._createWrapper(); + + this.element + .show() + .removeAttr("title") + .addClass("ui-dialog-content ui-widget-content") + .appendTo( this.uiDialog ); + + this._createTitlebar(); + this._createButtonPane(); + + if ( this.options.draggable && $.fn.draggable ) { + this._makeDraggable(); + } + if ( this.options.resizable && $.fn.resizable ) { + this._makeResizable(); + } + + this._isOpen = false; + }, + + _init: function() { + if ( this.options.autoOpen ) { + this.open(); + } + }, + + _appendTo: function() { + var element = this.options.appendTo; + if ( element && (element.jquery || element.nodeType) ) { + return $( element ); + } + return this.document.find( element || "body" ).eq( 0 ); + }, + + _destroy: function() { + var next, + originalPosition = this.originalPosition; + + this._destroyOverlay(); + + this.element + .removeUniqueId() + .removeClass("ui-dialog-content ui-widget-content") + .css( this.originalCss ) + // Without detaching first, the following becomes really slow + .detach(); + + this.uiDialog.stop( true, true ).remove(); + + if ( this.originalTitle ) { + this.element.attr( "title", this.originalTitle ); + } + + next = originalPosition.parent.children().eq( originalPosition.index ); + // Don't try to place the dialog next to itself (#8613) + if ( next.length && next[0] !== this.element[0] ) { + next.before( this.element ); + } else { + originalPosition.parent.append( this.element ); + } + }, + + widget: function() { + return this.uiDialog; + }, + + disable: $.noop, + enable: $.noop, + + close: function( event ) { + var activeElement, + that = this; + + if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) { + return; + } + + this._isOpen = false; + this._destroyOverlay(); + + if ( !this.opener.filter(":focusable").focus().length ) { + + // support: IE9 + // IE9 throws an "Unspecified error" accessing document.activeElement from an