Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in / Register
Toggle navigation
S
spring-boot
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
DEMO
spring-boot
Commits
db83e899
Commit
db83e899
authored
Jul 12, 2016
by
Andy Wilkinson
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add support for Thymeleaf 3 while keeping Thymeleaf 2 as the default
Closes gh-4393
parent
18d99245
Changes
22
Show whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
11596 additions
and
106 deletions
+11596
-106
AbstractTemplateResolverConfiguration.java
...gure/thymeleaf/AbstractTemplateResolverConfiguration.java
+81
-0
AbstractThymeleafViewResolverConfiguration.java
...thymeleaf/AbstractThymeleafViewResolverConfiguration.java
+78
-0
ThymeleafAutoConfiguration.java
...t/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java
+86
-105
howto.adoc
spring-boot-docs/src/main/asciidoc/howto.adoc
+24
-0
pom.xml
spring-boot-samples/pom.xml
+2
-1
pom.xml
...ng-boot-samples/spring-boot-sample-web-thymeleaf3/pom.xml
+42
-0
InMemoryMessageRepository.java
...java/sample/web/thymeleaf3/InMemoryMessageRepository.java
+58
-0
Message.java
...ymeleaf3/src/main/java/sample/web/thymeleaf3/Message.java
+69
-0
MessageRepository.java
...rc/main/java/sample/web/thymeleaf3/MessageRepository.java
+32
-0
SampleWebThymeleaf3Application.java
...sample/web/thymeleaf3/SampleWebThymeleaf3Application.java
+46
-0
MessageController.java
...ain/java/sample/web/thymeleaf3/mvc/MessageController.java
+92
-0
application.properties
...-web-thymeleaf3/src/main/resources/application.properties
+2
-0
bootstrap.min.css
...hymeleaf3/src/main/resources/static/css/bootstrap.min.css
+11
-0
favicon.ico
...mple-web-thymeleaf3/src/main/resources/static/favicon.ico
+0
-0
jquery-1.7.2.js
...b-thymeleaf3/src/main/resources/static/js/jquery-1.7.2.js
+9404
-0
jquery.validate.js
...hymeleaf3/src/main/resources/static/js/jquery.validate.js
+1250
-0
layout.html
...e-web-thymeleaf3/src/main/resources/templates/layout.html
+25
-0
form.html
...hymeleaf3/src/main/resources/templates/messages/form.html
+34
-0
list.html
...hymeleaf3/src/main/resources/templates/messages/list.html
+37
-0
view.html
...hymeleaf3/src/main/resources/templates/messages/view.html
+35
-0
MessageControllerWebTests.java
...java/sample/web/thymeleaf3/MessageControllerWebTests.java
+111
-0
SampleWebThymeleaf3ApplicationTests.java
...e/web/thymeleaf3/SampleWebThymeleaf3ApplicationTests.java
+77
-0
No files found.
spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/AbstractTemplateResolverConfiguration.java
0 → 100644
View file @
db83e899
/*
* Copyright 2012-2016 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.
*/
package
org
.
springframework
.
boot
.
autoconfigure
.
thymeleaf
;
import
javax.annotation.PostConstruct
;
import
org.apache.commons.logging.Log
;
import
org.apache.commons.logging.LogFactory
;
import
org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver
;
import
org.thymeleaf.templateresolver.TemplateResolver
;
import
org.springframework.boot.autoconfigure.template.TemplateLocation
;
import
org.springframework.context.ApplicationContext
;
import
org.springframework.context.annotation.Bean
;
/**
* Abstract base class for the configuration of a Thymeleaf {@link TemplateResolver}.
*
* @author Andy Wilkinson
*/
abstract
class
AbstractTemplateResolverConfiguration
{
private
static
final
Log
logger
=
LogFactory
.
getLog
(
AbstractTemplateResolverConfiguration
.
class
);
private
final
ThymeleafProperties
properties
;
private
final
ApplicationContext
applicationContext
;
AbstractTemplateResolverConfiguration
(
ThymeleafProperties
properties
,
ApplicationContext
applicationContext
)
{
this
.
properties
=
properties
;
this
.
applicationContext
=
applicationContext
;
}
@PostConstruct
public
void
checkTemplateLocationExists
()
{
boolean
checkTemplateLocation
=
this
.
properties
.
isCheckTemplateLocation
();
if
(
checkTemplateLocation
)
{
TemplateLocation
location
=
new
TemplateLocation
(
this
.
properties
.
getPrefix
());
if
(!
location
.
exists
(
this
.
applicationContext
))
{
logger
.
warn
(
"Cannot find template location: "
+
location
+
" (please add some templates or check "
+
"your Thymeleaf configuration)"
);
}
}
}
@Bean
public
SpringResourceTemplateResolver
defaultTemplateResolver
()
{
SpringResourceTemplateResolver
resolver
=
new
SpringResourceTemplateResolver
();
resolver
.
setApplicationContext
(
this
.
applicationContext
);
resolver
.
setPrefix
(
this
.
properties
.
getPrefix
());
resolver
.
setSuffix
(
this
.
properties
.
getSuffix
());
resolver
.
setTemplateMode
(
this
.
properties
.
getMode
());
if
(
this
.
properties
.
getEncoding
()
!=
null
)
{
resolver
.
setCharacterEncoding
(
this
.
properties
.
getEncoding
().
name
());
}
resolver
.
setCacheable
(
this
.
properties
.
isCache
());
Integer
order
=
this
.
properties
.
getTemplateResolverOrder
();
if
(
order
!=
null
)
{
resolver
.
setOrder
(
order
);
}
return
resolver
;
}
}
spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/AbstractThymeleafViewResolverConfiguration.java
0 → 100644
View file @
db83e899
/*
* Copyright 2012-2016 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.
*/
package
org
.
springframework
.
boot
.
autoconfigure
.
thymeleaf
;
import
java.util.LinkedHashMap
;
import
org.thymeleaf.spring4.SpringTemplateEngine
;
import
org.thymeleaf.spring4.view.ThymeleafViewResolver
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.core.Ordered
;
import
org.springframework.util.MimeType
;
/**
* Abstract base class for the configuration of a {@link ThymeleafViewResolver}.
*
* @author Andy Wilkinson
*/
abstract
class
AbstractThymeleafViewResolverConfiguration
{
private
final
ThymeleafProperties
properties
;
private
final
SpringTemplateEngine
templateEngine
;
protected
AbstractThymeleafViewResolverConfiguration
(
ThymeleafProperties
properties
,
SpringTemplateEngine
templateEngine
)
{
this
.
properties
=
properties
;
this
.
templateEngine
=
templateEngine
;
}
@Bean
@ConditionalOnMissingBean
(
name
=
"thymeleafViewResolver"
)
@ConditionalOnProperty
(
name
=
"spring.thymeleaf.enabled"
,
matchIfMissing
=
true
)
public
ThymeleafViewResolver
thymeleafViewResolver
()
{
ThymeleafViewResolver
resolver
=
new
ThymeleafViewResolver
();
configureTemplateEngine
(
resolver
,
this
.
templateEngine
);
resolver
.
setCharacterEncoding
(
this
.
properties
.
getEncoding
().
name
());
resolver
.
setContentType
(
appendCharset
(
this
.
properties
.
getContentType
(),
resolver
.
getCharacterEncoding
()));
resolver
.
setExcludedViewNames
(
this
.
properties
.
getExcludedViewNames
());
resolver
.
setViewNames
(
this
.
properties
.
getViewNames
());
// This resolver acts as a fallback resolver (e.g. like a
// InternalResourceViewResolver) so it needs to have low precedence
resolver
.
setOrder
(
Ordered
.
LOWEST_PRECEDENCE
-
5
);
resolver
.
setCache
(
this
.
properties
.
isCache
());
return
resolver
;
}
protected
abstract
void
configureTemplateEngine
(
ThymeleafViewResolver
resolver
,
SpringTemplateEngine
templateEngine
);
private
String
appendCharset
(
MimeType
type
,
String
charset
)
{
if
(
type
.
getCharset
()
!=
null
)
{
return
type
.
toString
();
}
LinkedHashMap
<
String
,
String
>
parameters
=
new
LinkedHashMap
<
String
,
String
>();
parameters
.
put
(
"charset"
,
charset
);
parameters
.
putAll
(
type
.
getParameters
());
return
new
MimeType
(
type
,
parameters
).
toString
();
}
}
spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java
View file @
db83e899
...
...
@@ -16,16 +16,13 @@
package
org
.
springframework
.
boot
.
autoconfigure
.
thymeleaf
;
import
java.lang.reflect.Method
;
import
java.util.Collection
;
import
java.util.LinkedHashMap
;
import
javax.annotation.PostConstruct
;
import
javax.servlet.Servlet
;
import
com.github.mxab.thymeleaf.extras.dataattribute.dialect.DataAttributeDialect
;
import
nz.net.ultraq.thymeleaf.LayoutDialect
;
import
org.apache.commons.logging.Log
;
import
org.apache.commons.logging.LogFactory
;
import
org.thymeleaf.dialect.IDialect
;
import
org.thymeleaf.extras.conditionalcomments.dialect.ConditionalCommentsDialect
;
import
org.thymeleaf.extras.java8time.dialect.Java8TimeDialect
;
...
...
@@ -34,7 +31,6 @@ import org.thymeleaf.spring4.SpringTemplateEngine;
import
org.thymeleaf.spring4.resourceresolver.SpringResourceResourceResolver
;
import
org.thymeleaf.spring4.view.ThymeleafViewResolver
;
import
org.thymeleaf.templateresolver.ITemplateResolver
;
import
org.thymeleaf.templateresolver.TemplateResolver
;
import
org.springframework.beans.factory.ObjectProvider
;
import
org.springframework.boot.autoconfigure.AutoConfigureAfter
;
...
...
@@ -43,18 +39,15 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnJava
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication
;
import
org.springframework.boot.autoconfigure.template.TemplateLocation
;
import
org.springframework.boot.autoconfigure.web.ConditionalOnEnabledResourceChain
;
import
org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
import
org.springframework.context.ApplicationContext
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.core.Ordered
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.util.
MimeType
;
import
org.springframework.util.
ReflectionUtils
;
import
org.springframework.web.servlet.resource.ResourceUrlEncodingFilter
;
/**
...
...
@@ -69,62 +62,107 @@ import org.springframework.web.servlet.resource.ResourceUrlEncodingFilter;
@Configuration
@EnableConfigurationProperties
(
ThymeleafProperties
.
class
)
@ConditionalOnClass
(
SpringTemplateEngine
.
class
)
@ConditionalOnMissingClass
(
"org.thymeleaf.templatemode.TemplateMode"
)
@AutoConfigureAfter
(
WebMvcAutoConfiguration
.
class
)
public
class
ThymeleafAutoConfiguration
{
private
static
final
Log
logger
=
LogFactory
.
getLog
(
ThymeleafAutoConfiguration
.
class
);
@Configuration
@ConditionalOnMissingClass
(
"org.thymeleaf.templatemode.TemplateMode"
)
static
class
Thymeleaf2Configuration
{
@Configuration
@ConditionalOnMissingBean
(
name
=
"defaultTemplateResolver"
)
public
static
class
DefaultTemplateResolverConfiguration
{
private
final
ThymeleafProperties
properties
;
private
final
ApplicationContext
applicationContext
;
static
class
DefaultTemplateResolverConfiguration
extends
AbstractTemplateResolverConfiguration
{
public
DefaultTemplateResolverConfiguration
(
ThymeleafProperties
properties
,
DefaultTemplateResolverConfiguration
(
ThymeleafProperties
properties
,
ApplicationContext
applicationContext
)
{
this
.
properties
=
properties
;
this
.
applicationContext
=
applicationContext
;
super
(
properties
,
applicationContext
);
}
@PostConstruct
public
void
checkTemplateLocationExists
()
{
boolean
checkTemplateLocation
=
this
.
properties
.
isCheckTemplateLocation
();
if
(
checkTemplateLocation
)
{
TemplateLocation
location
=
new
TemplateLocation
(
this
.
properties
.
getPrefix
());
if
(!
location
.
exists
(
this
.
applicationContext
))
{
logger
.
warn
(
"Cannot find template location: "
+
location
+
" (please add some templates or check "
+
"your Thymeleaf configuration)"
);
@Bean
public
SpringResourceResourceResolver
thymeleafResourceResolver
()
{
return
new
SpringResourceResourceResolver
();
}
}
@Configuration
@ConditionalOnClass
({
Servlet
.
class
})
@ConditionalOnWebApplication
static
class
Thymeleaf2ViewResolverConfiguration
extends
AbstractThymeleafViewResolverConfiguration
{
Thymeleaf2ViewResolverConfiguration
(
ThymeleafProperties
properties
,
SpringTemplateEngine
templateEngine
)
{
super
(
properties
,
templateEngine
);
}
@Override
protected
void
configureTemplateEngine
(
ThymeleafViewResolver
resolver
,
SpringTemplateEngine
templateEngine
)
{
resolver
.
setTemplateEngine
(
templateEngine
);
}
}
@Configuration
@ConditionalOnClass
(
ConditionalCommentsDialect
.
class
)
static
class
ThymeleafConditionalCommentsDialectConfiguration
{
@Bean
public
TemplateResolver
defaultTemplateResolver
()
{
TemplateResolver
resolver
=
new
TemplateResolver
();
resolver
.
setResourceResolver
(
thymeleafResourceResolver
());
resolver
.
setPrefix
(
this
.
properties
.
getPrefix
());
resolver
.
setSuffix
(
this
.
properties
.
getSuffix
());
resolver
.
setTemplateMode
(
this
.
properties
.
getMode
());
if
(
this
.
properties
.
getEncoding
()
!=
null
)
{
resolver
.
setCharacterEncoding
(
this
.
properties
.
getEncoding
().
name
());
@ConditionalOnMissingBean
public
ConditionalCommentsDialect
conditionalCommentsDialect
()
{
return
new
ConditionalCommentsDialect
();
}
resolver
.
setCacheable
(
this
.
properties
.
isCache
());
Integer
order
=
this
.
properties
.
getTemplateResolverOrder
();
if
(
order
!=
null
)
{
resolver
.
setOrder
(
order
);
}
return
resolver
;
}
@Bean
public
SpringResourceResourceResolver
thymeleafResourceResolver
()
{
return
new
SpringResourceResourceResolver
();
@Configuration
@ConditionalOnClass
(
name
=
"org.thymeleaf.templatemode.TemplateMode"
)
static
class
Thymeleaf3Configuration
{
@Configuration
@ConditionalOnMissingBean
(
name
=
"defaultTemplateResolver"
)
static
class
DefaultTemplateResolverConfiguration
extends
AbstractTemplateResolverConfiguration
{
DefaultTemplateResolverConfiguration
(
ThymeleafProperties
properties
,
ApplicationContext
applicationContext
)
{
super
(
properties
,
applicationContext
);
}
}
@Configuration
@ConditionalOnClass
({
Servlet
.
class
})
@ConditionalOnWebApplication
static
class
Thymeleaf3ViewResolverConfiguration
extends
AbstractThymeleafViewResolverConfiguration
{
Thymeleaf3ViewResolverConfiguration
(
ThymeleafProperties
properties
,
SpringTemplateEngine
templateEngine
)
{
super
(
properties
,
templateEngine
);
}
@Override
protected
void
configureTemplateEngine
(
ThymeleafViewResolver
resolver
,
SpringTemplateEngine
templateEngine
)
{
Method
setTemplateEngine
;
try
{
setTemplateEngine
=
ReflectionUtils
.
findMethod
(
resolver
.
getClass
(),
"setTemplateEngine"
,
Class
.
forName
(
"org.thymeleaf.ITemplateEngine"
,
true
,
resolver
.
getClass
().
getClassLoader
()));
}
catch
(
ClassNotFoundException
ex
)
{
throw
new
IllegalStateException
(
ex
);
}
ReflectionUtils
.
invokeMethod
(
setTemplateEngine
,
resolver
,
templateEngine
);
}
}
}
@Configuration
...
...
@@ -194,18 +232,6 @@ public class ThymeleafAutoConfiguration {
}
@Configuration
@ConditionalOnClass
(
ConditionalCommentsDialect
.
class
)
protected
static
class
ThymeleafConditionalCommentsDialectConfiguration
{
@Bean
@ConditionalOnMissingBean
public
ConditionalCommentsDialect
conditionalCommentsDialect
()
{
return
new
ConditionalCommentsDialect
();
}
}
@Configuration
@ConditionalOnJava
(
ConditionalOnJava
.
JavaVersion
.
EIGHT
)
@ConditionalOnClass
(
Java8TimeDialect
.
class
)
...
...
@@ -219,51 +245,6 @@ public class ThymeleafAutoConfiguration {
}
@Configuration
@ConditionalOnClass
({
Servlet
.
class
})
@ConditionalOnWebApplication
protected
static
class
ThymeleafViewResolverConfiguration
{
private
final
ThymeleafProperties
properties
;
private
final
SpringTemplateEngine
templateEngine
;
protected
ThymeleafViewResolverConfiguration
(
ThymeleafProperties
properties
,
SpringTemplateEngine
templateEngine
)
{
this
.
properties
=
properties
;
this
.
templateEngine
=
templateEngine
;
}
@Bean
@ConditionalOnMissingBean
(
name
=
"thymeleafViewResolver"
)
@ConditionalOnProperty
(
name
=
"spring.thymeleaf.enabled"
,
matchIfMissing
=
true
)
public
ThymeleafViewResolver
thymeleafViewResolver
()
{
ThymeleafViewResolver
resolver
=
new
ThymeleafViewResolver
();
resolver
.
setTemplateEngine
(
this
.
templateEngine
);
resolver
.
setCharacterEncoding
(
this
.
properties
.
getEncoding
().
name
());
resolver
.
setContentType
(
appendCharset
(
this
.
properties
.
getContentType
(),
resolver
.
getCharacterEncoding
()));
resolver
.
setExcludedViewNames
(
this
.
properties
.
getExcludedViewNames
());
resolver
.
setViewNames
(
this
.
properties
.
getViewNames
());
// This resolver acts as a fallback resolver (e.g. like a
// InternalResourceViewResolver) so it needs to have low precedence
resolver
.
setOrder
(
Ordered
.
LOWEST_PRECEDENCE
-
5
);
resolver
.
setCache
(
this
.
properties
.
isCache
());
return
resolver
;
}
private
String
appendCharset
(
MimeType
type
,
String
charset
)
{
if
(
type
.
getCharset
()
!=
null
)
{
return
type
.
toString
();
}
LinkedHashMap
<
String
,
String
>
parameters
=
new
LinkedHashMap
<
String
,
String
>();
parameters
.
put
(
"charset"
,
charset
);
parameters
.
putAll
(
type
.
getParameters
());
return
new
MimeType
(
type
,
parameters
).
toString
();
}
}
@Configuration
@ConditionalOnWebApplication
protected
static
class
ThymeleafResourceHandlingConfig
{
...
...
spring-boot-docs/src/main/asciidoc/howto.adoc
View file @
db83e899
...
...
@@ -1395,6 +1395,30 @@ have been applied from the auto-configuration:
[[howto-use-thymeleaf-3]]
=== Use Thymeleaf 3
By default, `spring-boot-starter-thymeleaf` uses Thymeleaf 2.1. You can use Thymeleaf
3 by overriding the `thymeleaf.version` and `thymeleaf-layout-dialect.version` properties,
for example:
[source,xml,indent=0,subs="verbatim,quotes,attributes"]
----
<properties>
<thymeleaf.version>3.0.0.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.0.0</thymeleaf-layout-dialect.version>
</dependency>
----
Please refer to the
{github-code}/spring-boot-samples/spring-boot-sample-web-thymeleaf3[Thymeleaf 3 sample] to
see this in action.
If you are using any of the other auto-configured Thymeleaf Extras (Spring Security,
Data Attribute, or Java 8 Time) you should also override each of their versions to one
that is compatible with Thymeleaf 3.0.
[[howto-http-clients]]
== HTTP clients
...
...
spring-boot-samples/pom.xml
View file @
db83e899
...
...
@@ -97,6 +97,7 @@
<module>
spring-boot-sample-war
</module>
<module>
spring-boot-sample-web-freemarker
</module>
<module>
spring-boot-sample-web-groovy-templates
</module>
<module>
spring-boot-sample-web-jsp
</module>
<module>
spring-boot-sample-web-method-security
</module>
<module>
spring-boot-sample-web-mustache
</module>
<module>
spring-boot-sample-web-secure
</module>
...
...
@@ -104,7 +105,7 @@
<module>
spring-boot-sample-web-secure-github
</module>
<module>
spring-boot-sample-web-secure-jdbc
</module>
<module>
spring-boot-sample-web-static
</module>
<module>
spring-boot-sample-web-
jsp
</module>
<module>
spring-boot-sample-web-
thymeleaf3
</module>
<module>
spring-boot-sample-web-ui
</module>
<module>
spring-boot-sample-web-velocity
</module>
<module>
spring-boot-sample-websocket-jetty
</module>
...
...
spring-boot-samples/spring-boot-sample-web-thymeleaf3/pom.xml
0 → 100755
View file @
db83e899
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>
4.0.0
</modelVersion>
<parent>
<!-- Your own application should inherit from spring-boot-starter-parent -->
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-samples
</artifactId>
<version>
1.4.0.BUILD-SNAPSHOT
</version>
</parent>
<artifactId>
spring-boot-sample-web-thymeleaf3
</artifactId>
<name>
Spring Boot Web Thymeleaf 3 Sample
</name>
<description>
Spring Boot Web Thymeleaf 3 Sample
</description>
<url>
http://projects.spring.io/spring-boot/
</url>
<organization>
<name>
Pivotal Software, Inc.
</name>
<url>
http://www.spring.io
</url>
</organization>
<properties>
<main.basedir>
${basedir}/../..
</main.basedir>
<thymeleaf.version>
3.0.0.RELEASE
</thymeleaf.version>
<thymeleaf-layout-dialect.version>
2.0.0
</thymeleaf-layout-dialect.version>
</properties>
<dependencies>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-thymeleaf
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-test
</artifactId>
<scope>
test
</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-maven-plugin
</artifactId>
</plugin>
</plugins>
</build>
</project>
spring-boot-samples/spring-boot-sample-web-thymeleaf3/src/main/java/sample/web/thymeleaf3/InMemoryMessageRepository.java
0 → 100755
View file @
db83e899
/*
* Copyright 2012-2016 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.
*/
package
sample
.
web
.
thymeleaf3
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.concurrent.ConcurrentMap
;
import
java.util.concurrent.atomic.AtomicLong
;
/**
* @author Dave Syer
*/
public
class
InMemoryMessageRepository
implements
MessageRepository
{
private
static
AtomicLong
counter
=
new
AtomicLong
();
private
final
ConcurrentMap
<
Long
,
Message
>
messages
=
new
ConcurrentHashMap
<
Long
,
Message
>();
@Override
public
Iterable
<
Message
>
findAll
()
{
return
this
.
messages
.
values
();
}
@Override
public
Message
save
(
Message
message
)
{
Long
id
=
message
.
getId
();
if
(
id
==
null
)
{
id
=
counter
.
incrementAndGet
();
message
.
setId
(
id
);
}
this
.
messages
.
put
(
id
,
message
);
return
message
;
}
@Override
public
Message
findMessage
(
Long
id
)
{
return
this
.
messages
.
get
(
id
);
}
@Override
public
void
deleteMessage
(
Long
id
)
{
this
.
messages
.
remove
(
id
);
}
}
spring-boot-samples/spring-boot-sample-web-thymeleaf3/src/main/java/sample/web/thymeleaf3/Message.java
0 → 100644
View file @
db83e899
/*
* Copyright 2012-2016 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.
*/
package
sample
.
web
.
thymeleaf3
;
import
java.util.Calendar
;
import
org.hibernate.validator.constraints.NotEmpty
;
/**
* @author Rob Winch
*/
public
class
Message
{
private
Long
id
;
@NotEmpty
(
message
=
"Message is required."
)
private
String
text
;
@NotEmpty
(
message
=
"Summary is required."
)
private
String
summary
;
private
Calendar
created
=
Calendar
.
getInstance
();
public
Long
getId
()
{
return
this
.
id
;
}
public
void
setId
(
Long
id
)
{
this
.
id
=
id
;
}
public
Calendar
getCreated
()
{
return
this
.
created
;
}
public
void
setCreated
(
Calendar
created
)
{
this
.
created
=
created
;
}
public
String
getText
()
{
return
this
.
text
;
}
public
void
setText
(
String
text
)
{
this
.
text
=
text
;
}
public
String
getSummary
()
{
return
this
.
summary
;
}
public
void
setSummary
(
String
summary
)
{
this
.
summary
=
summary
;
}
}
spring-boot-samples/spring-boot-sample-web-thymeleaf3/src/main/java/sample/web/thymeleaf3/MessageRepository.java
0 → 100755
View file @
db83e899
/*
* Copyright 2012-2016 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.
*/
package
sample
.
web
.
thymeleaf3
;
/**
* @author Rob Winch
*/
public
interface
MessageRepository
{
Iterable
<
Message
>
findAll
();
Message
save
(
Message
message
);
Message
findMessage
(
Long
id
);
void
deleteMessage
(
Long
id
);
}
spring-boot-samples/spring-boot-sample-web-thymeleaf3/src/main/java/sample/web/thymeleaf3/SampleWebThymeleaf3Application.java
0 → 100644
View file @
db83e899
/*
* Copyright 2012-2016 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.
*/
package
sample
.
web
.
thymeleaf3
;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.core.convert.converter.Converter
;
@SpringBootApplication
public
class
SampleWebThymeleaf3Application
{
@Bean
public
MessageRepository
messageRepository
()
{
return
new
InMemoryMessageRepository
();
}
@Bean
public
Converter
<
String
,
Message
>
messageConverter
()
{
return
new
Converter
<
String
,
Message
>()
{
@Override
public
Message
convert
(
String
id
)
{
return
messageRepository
().
findMessage
(
Long
.
valueOf
(
id
));
}
};
}
public
static
void
main
(
String
[]
args
)
throws
Exception
{
SpringApplication
.
run
(
SampleWebThymeleaf3Application
.
class
,
args
);
}
}
spring-boot-samples/spring-boot-sample-web-thymeleaf3/src/main/java/sample/web/thymeleaf3/mvc/MessageController.java
0 → 100755
View file @
db83e899
/*
* Copyright 2012-2016 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.
*/
package
sample
.
web
.
thymeleaf3
.
mvc
;
import
javax.validation.Valid
;
import
sample.web.thymeleaf3.Message
;
import
sample.web.thymeleaf3.MessageRepository
;
import
org.springframework.stereotype.Controller
;
import
org.springframework.validation.BindingResult
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.ModelAttribute
;
import
org.springframework.web.bind.annotation.PathVariable
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.servlet.ModelAndView
;
import
org.springframework.web.servlet.mvc.support.RedirectAttributes
;
/**
* @author Rob Winch
* @author Doo-Hwan Kwak
*/
@Controller
@RequestMapping
(
"/"
)
public
class
MessageController
{
private
final
MessageRepository
messageRepository
;
public
MessageController
(
MessageRepository
messageRepository
)
{
this
.
messageRepository
=
messageRepository
;
}
@GetMapping
public
ModelAndView
list
()
{
Iterable
<
Message
>
messages
=
this
.
messageRepository
.
findAll
();
return
new
ModelAndView
(
"messages/list"
,
"messages"
,
messages
);
}
@GetMapping
(
"{id}"
)
public
ModelAndView
view
(
@PathVariable
(
"id"
)
Message
message
)
{
return
new
ModelAndView
(
"messages/view"
,
"message"
,
message
);
}
@GetMapping
(
params
=
"form"
)
public
String
createForm
(
@ModelAttribute
Message
message
)
{
return
"messages/form"
;
}
@PostMapping
public
ModelAndView
create
(
@Valid
Message
message
,
BindingResult
result
,
RedirectAttributes
redirect
)
{
if
(
result
.
hasErrors
())
{
return
new
ModelAndView
(
"messages/form"
,
"formErrors"
,
result
.
getAllErrors
());
}
message
=
this
.
messageRepository
.
save
(
message
);
redirect
.
addFlashAttribute
(
"globalMessage"
,
"Successfully created a new message"
);
return
new
ModelAndView
(
"redirect:/{message.id}"
,
"message.id"
,
message
.
getId
());
}
@RequestMapping
(
"foo"
)
public
String
foo
()
{
throw
new
RuntimeException
(
"Expected exception in controller"
);
}
@GetMapping
(
value
=
"delete/{id}"
)
public
ModelAndView
delete
(
@PathVariable
(
"id"
)
Long
id
)
{
this
.
messageRepository
.
deleteMessage
(
id
);
Iterable
<
Message
>
messages
=
this
.
messageRepository
.
findAll
();
return
new
ModelAndView
(
"messages/list"
,
"messages"
,
messages
);
}
@GetMapping
(
value
=
"modify/{id}"
)
public
ModelAndView
modifyForm
(
@PathVariable
(
"id"
)
Message
message
)
{
return
new
ModelAndView
(
"messages/form"
,
"message"
,
message
);
}
}
spring-boot-samples/spring-boot-sample-web-thymeleaf3/src/main/resources/application.properties
0 → 100644
View file @
db83e899
# Allow Thymeleaf templates to be reloaded at dev time
spring.thymeleaf.cache
:
false
spring-boot-samples/spring-boot-sample-web-thymeleaf3/src/main/resources/static/css/bootstrap.min.css
0 → 100644
View file @
db83e899
/*!
* Bootstrap v2.0.4
*
* Copyright 2012 Twitter, Inc
* Licensed under the Apache License v2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Designed and built with all the love in the world @twitter by @mdo and @fat.
*/
article
,
aside
,
details
,
figcaption
,
figure
,
footer
,
header
,
hgroup
,
nav
,
section
{
display
:
block
}
audio
,
canvas
,
video
{
display
:
inline-block
;
*
display
:
inline
;
*
zoom
:
1
}
audio
:not
([
controls
])
{
display
:
none
}
html
{
font-size
:
100%
;
-webkit-text-size-adjust
:
100%
;
-ms-text-size-adjust
:
100%
}
a
:focus
{
outline
:
thin
dotted
#333
;
outline
:
5px
auto
-webkit-focus-ring-color
;
outline-offset
:
-2px
}
a
:hover
,
a
:active
{
outline
:
0
}
sub
,
sup
{
position
:
relative
;
font-size
:
75%
;
line-height
:
0
;
vertical-align
:
baseline
}
sup
{
top
:
-0.5em
}
sub
{
bottom
:
-0.25em
}
img
{
max-width
:
100%
;
vertical-align
:
middle
;
border
:
0
;
-ms-interpolation-mode
:
bicubic
}
#map_canvas
img
{
max-width
:
none
}
button
,
input
,
select
,
textarea
{
margin
:
0
;
font-size
:
100%
;
vertical-align
:
middle
}
button
,
input
{
*
overflow
:
visible
;
line-height
:
normal
}
button
::-moz-focus-inner
,
input
::-moz-focus-inner
{
padding
:
0
;
border
:
0
}
button
,
input
[
type
=
"button"
],
input
[
type
=
"reset"
],
input
[
type
=
"submit"
]
{
cursor
:
pointer
;
-webkit-appearance
:
button
}
input
[
type
=
"search"
]
{
-webkit-box-sizing
:
content-box
;
-moz-box-sizing
:
content-box
;
box-sizing
:
content-box
;
-webkit-appearance
:
textfield
}
input
[
type
=
"search"
]
::-webkit-search-decoration
,
input
[
type
=
"search"
]
::-webkit-search-cancel-button
{
-webkit-appearance
:
none
}
textarea
{
overflow
:
auto
;
vertical-align
:
top
}
.clearfix
{
*
zoom
:
1
}
.clearfix
:before
,
.clearfix
:after
{
display
:
table
;
content
:
""
}
.clearfix
:after
{
clear
:
both
}
.hide-text
{
font
:
0
/
0
a
;
color
:
transparent
;
text-shadow
:
none
;
background-color
:
transparent
;
border
:
0
}
.input-block-level
{
display
:
block
;
width
:
100%
;
min-height
:
28px
;
-webkit-box-sizing
:
border-box
;
-moz-box-sizing
:
border-box
;
-ms-box-sizing
:
border-box
;
box-sizing
:
border-box
}
body
{
margin
:
0
;
font-family
:
"Helvetica Neue"
,
Helvetica
,
Arial
,
sans-serif
;
font-size
:
13px
;
line-height
:
18px
;
color
:
#333
;
background-color
:
#fff
}
a
{
color
:
#08c
;
text-decoration
:
none
}
a
:hover
{
color
:
#005580
;
text-decoration
:
underline
}
.row
{
margin-left
:
-20px
;
*
zoom
:
1
}
.row
:before
,
.row
:after
{
display
:
table
;
content
:
""
}
.row
:after
{
clear
:
both
}
[
class
*=
"span"
]
{
float
:
left
;
margin-left
:
20px
}
.container
,
.navbar-fixed-top
.container
,
.navbar-fixed-bottom
.container
{
width
:
940px
}
.span12
{
width
:
940px
}
.span11
{
width
:
860px
}
.span10
{
width
:
780px
}
.span9
{
width
:
700px
}
.span8
{
width
:
620px
}
.span7
{
width
:
540px
}
.span6
{
width
:
460px
}
.span5
{
width
:
380px
}
.span4
{
width
:
300px
}
.span3
{
width
:
220px
}
.span2
{
width
:
140px
}
.span1
{
width
:
60px
}
.offset12
{
margin-left
:
980px
}
.offset11
{
margin-left
:
900px
}
.offset10
{
margin-left
:
820px
}
.offset9
{
margin-left
:
740px
}
.offset8
{
margin-left
:
660px
}
.offset7
{
margin-left
:
580px
}
.offset6
{
margin-left
:
500px
}
.offset5
{
margin-left
:
420px
}
.offset4
{
margin-left
:
340px
}
.offset3
{
margin-left
:
260px
}
.offset2
{
margin-left
:
180px
}
.offset1
{
margin-left
:
100px
}
.row-fluid
{
width
:
100%
;
*
zoom
:
1
}
.row-fluid
:before
,
.row-fluid
:after
{
display
:
table
;
content
:
""
}
.row-fluid
:after
{
clear
:
both
}
.row-fluid
[
class
*=
"span"
]
{
display
:
block
;
float
:
left
;
width
:
100%
;
min-height
:
28px
;
margin-left
:
2.127659574%
;
*
margin-left
:
2.0744680846382977%
;
-webkit-box-sizing
:
border-box
;
-moz-box-sizing
:
border-box
;
-ms-box-sizing
:
border-box
;
box-sizing
:
border-box
}
.row-fluid
[
class
*=
"span"
]
:first-child
{
margin-left
:
0
}
.row-fluid
.span12
{
width
:
99.99999998999999%
;
*
width
:
99.94680850063828%
}
.row-fluid
.span11
{
width
:
91.489361693%
;
*
width
:
91.4361702036383%
}
.row-fluid
.span10
{
width
:
82.97872339599999%
;
*
width
:
82.92553190663828%
}
.row-fluid
.span9
{
width
:
74.468085099%
;
*
width
:
74.4148936096383%
}
.row-fluid
.span8
{
width
:
65.95744680199999%
;
*
width
:
65.90425531263828%
}
.row-fluid
.span7
{
width
:
57.446808505%
;
*
width
:
57.3936170156383%
}
.row-fluid
.span6
{
width
:
48.93617020799999%
;
*
width
:
48.88297871863829%
}
.row-fluid
.span5
{
width
:
40.425531911%
;
*
width
:
40.3723404216383%
}
.row-fluid
.span4
{
width
:
31.914893614%
;
*
width
:
31.8617021246383%
}
.row-fluid
.span3
{
width
:
23.404255317%
;
*
width
:
23.3510638276383%
}
.row-fluid
.span2
{
width
:
14.89361702%
;
*
width
:
14.8404255306383%
}
.row-fluid
.span1
{
width
:
6.382978723%
;
*
width
:
6.329787233638298%
}
.container
{
margin-right
:
auto
;
margin-left
:
auto
;
*
zoom
:
1
}
.container
:before
,
.container
:after
{
display
:
table
;
content
:
""
}
.container
:after
{
clear
:
both
}
.container-fluid
{
padding-right
:
20px
;
padding-left
:
20px
;
*
zoom
:
1
}
.container-fluid
:before
,
.container-fluid
:after
{
display
:
table
;
content
:
""
}
.container-fluid
:after
{
clear
:
both
}
p
{
margin
:
0
0
9px
}
p
small
{
font-size
:
11px
;
color
:
#999
}
.lead
{
margin-bottom
:
18px
;
font-size
:
20px
;
font-weight
:
200
;
line-height
:
27px
}
h1
,
h2
,
h3
,
h4
,
h5
,
h6
{
margin
:
0
;
font-family
:
inherit
;
font-weight
:
bold
;
color
:
inherit
;
text-rendering
:
optimizelegibility
}
h1
small
,
h2
small
,
h3
small
,
h4
small
,
h5
small
,
h6
small
{
font-weight
:
normal
;
color
:
#999
}
h1
{
font-size
:
30px
;
line-height
:
36px
}
h1
small
{
font-size
:
18px
}
h2
{
font-size
:
24px
;
line-height
:
36px
}
h2
small
{
font-size
:
18px
}
h3
{
font-size
:
18px
;
line-height
:
27px
}
h3
small
{
font-size
:
14px
}
h4
,
h5
,
h6
{
line-height
:
18px
}
h4
{
font-size
:
14px
}
h4
small
{
font-size
:
12px
}
h5
{
font-size
:
12px
}
h6
{
font-size
:
11px
;
color
:
#999
;
text-transform
:
uppercase
}
.page-header
{
padding-bottom
:
17px
;
margin
:
18px
0
;
border-bottom
:
1px
solid
#eee
}
.page-header
h1
{
line-height
:
1
}
ul
,
ol
{
padding
:
0
;
margin
:
0
0
9px
25px
}
ul
ul
,
ul
ol
,
ol
ol
,
ol
ul
{
margin-bottom
:
0
}
ul
{
list-style
:
disc
}
ol
{
list-style
:
decimal
}
li
{
line-height
:
18px
}
ul
.unstyled
,
ol
.unstyled
{
margin-left
:
0
;
list-style
:
none
}
dl
{
margin-bottom
:
18px
}
dt
,
dd
{
line-height
:
18px
}
dt
{
font-weight
:
bold
;
line-height
:
17px
}
dd
{
margin-left
:
9px
}
.dl-horizontal
dt
{
float
:
left
;
width
:
120px
;
overflow
:
hidden
;
clear
:
left
;
text-align
:
right
;
text-overflow
:
ellipsis
;
white-space
:
nowrap
}
.dl-horizontal
dd
{
margin-left
:
130px
}
hr
{
margin
:
18px
0
;
border
:
0
;
border-top
:
1px
solid
#eee
;
border-bottom
:
1px
solid
#fff
}
strong
{
font-weight
:
bold
}
em
{
font-style
:
italic
}
.muted
{
color
:
#999
}
abbr
[
title
]
{
cursor
:
help
;
border-bottom
:
1px
dotted
#999
}
abbr
.initialism
{
font-size
:
90%
;
text-transform
:
uppercase
}
blockquote
{
padding
:
0
0
0
15px
;
margin
:
0
0
18px
;
border-left
:
5px
solid
#eee
}
blockquote
p
{
margin-bottom
:
0
;
font-size
:
16px
;
font-weight
:
300
;
line-height
:
22.5px
}
blockquote
small
{
display
:
block
;
line-height
:
18px
;
color
:
#999
}
blockquote
small
:before
{
content
:
'\2014 \00A0'
}
blockquote
.pull-right
{
float
:
right
;
padding-right
:
15px
;
padding-left
:
0
;
border-right
:
5px
solid
#eee
;
border-left
:
0
}
blockquote
.pull-right
p
,
blockquote
.pull-right
small
{
text-align
:
right
}
q
:before
,
q
:after
,
blockquote
:before
,
blockquote
:after
{
content
:
""
}
address
{
display
:
block
;
margin-bottom
:
18px
;
font-style
:
normal
;
line-height
:
18px
}
small
{
font-size
:
100%
}
cite
{
font-style
:
normal
}
code
,
pre
{
padding
:
0
3px
2px
;
font-family
:
Menlo
,
Monaco
,
Consolas
,
"Courier New"
,
monospace
;
font-size
:
12px
;
color
:
#333
;
-webkit-border-radius
:
3px
;
-moz-border-radius
:
3px
;
border-radius
:
3px
}
code
{
padding
:
2px
4px
;
color
:
#d14
;
background-color
:
#f7f7f9
;
border
:
1px
solid
#e1e1e8
}
pre
{
display
:
block
;
padding
:
8.5px
;
margin
:
0
0
9px
;
font-size
:
12.025px
;
line-height
:
18px
;
word-break
:
break-all
;
word-wrap
:
break-word
;
white-space
:
pre
;
white-space
:
pre-wrap
;
background-color
:
#f5f5f5
;
border
:
1px
solid
#ccc
;
border
:
1px
solid
rgba
(
0
,
0
,
0
,
0.15
);
-webkit-border-radius
:
4px
;
-moz-border-radius
:
4px
;
border-radius
:
4px
}
pre
.prettyprint
{
margin-bottom
:
18px
}
pre
code
{
padding
:
0
;
color
:
inherit
;
background-color
:
transparent
;
border
:
0
}
.pre-scrollable
{
max-height
:
340px
;
overflow-y
:
scroll
}
form
{
margin
:
0
0
18px
}
fieldset
{
padding
:
0
;
margin
:
0
;
border
:
0
}
legend
{
display
:
block
;
width
:
100%
;
padding
:
0
;
margin-bottom
:
27px
;
font-size
:
19.5px
;
line-height
:
36px
;
color
:
#333
;
border
:
0
;
border-bottom
:
1px
solid
#e5e5e5
}
legend
small
{
font-size
:
13.5px
;
color
:
#999
}
label
,
input
,
button
,
select
,
textarea
{
font-size
:
13px
;
font-weight
:
normal
;
line-height
:
18px
}
input
,
button
,
select
,
textarea
{
font-family
:
"Helvetica Neue"
,
Helvetica
,
Arial
,
sans-serif
}
label
{
display
:
block
;
margin-bottom
:
5px
}
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"
],
.uneditable-input
{
display
:
inline-block
;
height
:
18px
;
padding
:
4px
;
margin-bottom
:
9px
;
font-size
:
13px
;
line-height
:
18px
;
color
:
#555
}
input
,
textarea
{
width
:
210px
}
textarea
{
height
:
auto
}
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"
],
.uneditable-input
{
background-color
:
#fff
;
border
:
1px
solid
#ccc
;
-webkit-border-radius
:
3px
;
-moz-border-radius
:
3px
;
border-radius
:
3px
;
-webkit-box-shadow
:
inset
0
1px
1px
rgba
(
0
,
0
,
0
,
0.075
);
-moz-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
linear
.2s
,
box-shadow
linear
.2s
;
-moz-transition
:
border
linear
.2s
,
box-shadow
linear
.2s
;
-ms-transition
:
border
linear
.2s
,
box-shadow
linear
.2s
;
-o-transition
:
border
linear
.2s
,
box-shadow
linear
.2s
;
transition
:
border
linear
.2s
,
box-shadow
linear
.2s
}
textarea
:focus
,
input
[
type
=
"text"
]
:focus
,
input
[
type
=
"password"
]
:focus
,
input
[
type
=
"datetime"
]
:focus
,
input
[
type
=
"datetime-local"
]
:focus
,
input
[
type
=
"date"
]
:focus
,
input
[
type
=
"month"
]
:focus
,
input
[
type
=
"time"
]
:focus
,
input
[
type
=
"week"
]
:focus
,
input
[
type
=
"number"
]
:focus
,
input
[
type
=
"email"
]
:focus
,
input
[
type
=
"url"
]
:focus
,
input
[
type
=
"search"
]
:focus
,
input
[
type
=
"tel"
]
:focus
,
input
[
type
=
"color"
]
:focus
,
.uneditable-input
:focus
{
border-color
:
rgba
(
82
,
168
,
236
,
0.8
);
outline
:
0
;
outline
:
thin
dotted
\
9
;
-webkit-box-shadow
:
inset
0
1px
1px
rgba
(
0
,
0
,
0
,
0.075
),
0
0
8px
rgba
(
82
,
168
,
236
,
0.6
);
-moz-box-shadow
:
inset
0
1px
1px
rgba
(
0
,
0
,
0
,
0.075
),
0
0
8px
rgba
(
82
,
168
,
236
,
0.6
);
box-shadow
:
inset
0
1px
1px
rgba
(
0
,
0
,
0
,
0.075
),
0
0
8px
rgba
(
82
,
168
,
236
,
0.6
)}
input
[
type
=
"radio"
],
input
[
type
=
"checkbox"
]
{
margin
:
3px
0
;
*
margin-top
:
0
;
line-height
:
normal
;
cursor
:
pointer
}
input
[
type
=
"submit"
],
input
[
type
=
"reset"
],
input
[
type
=
"button"
],
input
[
type
=
"radio"
],
input
[
type
=
"checkbox"
]
{
width
:
auto
}
.uneditable-textarea
{
width
:
auto
;
height
:
auto
}
select
,
input
[
type
=
"file"
]
{
height
:
28px
;
*
margin-top
:
4px
;
line-height
:
28px
}
select
{
width
:
220px
;
border
:
1px
solid
#bbb
}
select
[
multiple
],
select
[
size
]
{
height
:
auto
}
select
:focus
,
input
[
type
=
"file"
]
:focus
,
input
[
type
=
"radio"
]
:focus
,
input
[
type
=
"checkbox"
]
:focus
{
outline
:
thin
dotted
#333
;
outline
:
5px
auto
-webkit-focus-ring-color
;
outline-offset
:
-2px
}
.radio
,
.checkbox
{
min-height
:
18px
;
padding-left
:
18px
}
.radio
input
[
type
=
"radio"
],
.checkbox
input
[
type
=
"checkbox"
]
{
float
:
left
;
margin-left
:
-18px
}
.controls
>
.radio
:first-child
,
.controls
>
.checkbox
:first-child
{
padding-top
:
5px
}
.radio.inline
,
.checkbox.inline
{
display
:
inline-block
;
padding-top
:
5px
;
margin-bottom
:
0
;
vertical-align
:
middle
}
.radio.inline
+
.radio.inline
,
.checkbox.inline
+
.checkbox.inline
{
margin-left
:
10px
}
.input-mini
{
width
:
60px
}
.input-small
{
width
:
90px
}
.input-medium
{
width
:
150px
}
.input-large
{
width
:
210px
}
.input-xlarge
{
width
:
270px
}
.input-xxlarge
{
width
:
530px
}
input
[
class
*=
"span"
],
select
[
class
*=
"span"
],
textarea
[
class
*=
"span"
],
.uneditable-input
[
class
*=
"span"
],
.row-fluid
input
[
class
*=
"span"
],
.row-fluid
select
[
class
*=
"span"
],
.row-fluid
textarea
[
class
*=
"span"
],
.row-fluid
.uneditable-input
[
class
*=
"span"
]
{
float
:
none
;
margin-left
:
0
}
.input-append
input
[
class
*=
"span"
],
.input-append
.uneditable-input
[
class
*=
"span"
],
.input-prepend
input
[
class
*=
"span"
],
.input-prepend
.uneditable-input
[
class
*=
"span"
],
.row-fluid
.input-prepend
[
class
*=
"span"
],
.row-fluid
.input-append
[
class
*=
"span"
]
{
display
:
inline-block
}
input
,
textarea
,
.uneditable-input
{
margin-left
:
0
}
input
.span12
,
textarea
.span12
,
.uneditable-input.span12
{
width
:
930px
}
input
.span11
,
textarea
.span11
,
.uneditable-input.span11
{
width
:
850px
}
input
.span10
,
textarea
.span10
,
.uneditable-input.span10
{
width
:
770px
}
input
.span9
,
textarea
.span9
,
.uneditable-input.span9
{
width
:
690px
}
input
.span8
,
textarea
.span8
,
.uneditable-input.span8
{
width
:
610px
}
input
.span7
,
textarea
.span7
,
.uneditable-input.span7
{
width
:
530px
}
input
.span6
,
textarea
.span6
,
.uneditable-input.span6
{
width
:
450px
}
input
.span5
,
textarea
.span5
,
.uneditable-input.span5
{
width
:
370px
}
input
.span4
,
textarea
.span4
,
.uneditable-input.span4
{
width
:
290px
}
input
.span3
,
textarea
.span3
,
.uneditable-input.span3
{
width
:
210px
}
input
.span2
,
textarea
.span2
,
.uneditable-input.span2
{
width
:
130px
}
input
.span1
,
textarea
.span1
,
.uneditable-input.span1
{
width
:
50px
}
input
[
disabled
],
select
[
disabled
],
textarea
[
disabled
],
input
[
readonly
],
select
[
readonly
],
textarea
[
readonly
]
{
cursor
:
not-allowed
;
background-color
:
#eee
;
border-color
:
#ddd
}
input
[
type
=
"radio"
][
disabled
],
input
[
type
=
"checkbox"
][
disabled
],
input
[
type
=
"radio"
][
readonly
],
input
[
type
=
"checkbox"
][
readonly
]
{
background-color
:
transparent
}
.control-group.warning
>
label
,
.control-group.warning
.help-block
,
.control-group.warning
.help-inline
{
color
:
#c09853
}
.control-group.warning
.checkbox
,
.control-group.warning
.radio
,
.control-group.warning
input
,
.control-group.warning
select
,
.control-group.warning
textarea
{
color
:
#c09853
;
border-color
:
#c09853
}
.control-group.warning
.checkbox
:focus
,
.control-group.warning
.radio
:focus
,
.control-group.warning
input
:focus
,
.control-group.warning
select
:focus
,
.control-group.warning
textarea
:focus
{
border-color
:
#a47e3c
;
-webkit-box-shadow
:
0
0
6px
#dbc59e
;
-moz-box-shadow
:
0
0
6px
#dbc59e
;
box-shadow
:
0
0
6px
#dbc59e
}
.control-group.warning
.input-prepend
.add-on
,
.control-group.warning
.input-append
.add-on
{
color
:
#c09853
;
background-color
:
#fcf8e3
;
border-color
:
#c09853
}
.control-group.error
>
label
,
.control-group.error
.help-block
,
.control-group.error
.help-inline
{
color
:
#b94a48
}
.control-group.error
.checkbox
,
.control-group.error
.radio
,
.control-group.error
input
,
.control-group.error
select
,
.control-group.error
textarea
{
color
:
#b94a48
;
border-color
:
#b94a48
}
.control-group.error
.checkbox
:focus
,
.control-group.error
.radio
:focus
,
.control-group.error
input
:focus
,
.control-group.error
select
:focus
,
.control-group.error
textarea
:focus
{
border-color
:
#953b39
;
-webkit-box-shadow
:
0
0
6px
#d59392
;
-moz-box-shadow
:
0
0
6px
#d59392
;
box-shadow
:
0
0
6px
#d59392
}
.control-group.error
.input-prepend
.add-on
,
.control-group.error
.input-append
.add-on
{
color
:
#b94a48
;
background-color
:
#f2dede
;
border-color
:
#b94a48
}
.control-group.success
>
label
,
.control-group.success
.help-block
,
.control-group.success
.help-inline
{
color
:
#468847
}
.control-group.success
.checkbox
,
.control-group.success
.radio
,
.control-group.success
input
,
.control-group.success
select
,
.control-group.success
textarea
{
color
:
#468847
;
border-color
:
#468847
}
.control-group.success
.checkbox
:focus
,
.control-group.success
.radio
:focus
,
.control-group.success
input
:focus
,
.control-group.success
select
:focus
,
.control-group.success
textarea
:focus
{
border-color
:
#356635
;
-webkit-box-shadow
:
0
0
6px
#7aba7b
;
-moz-box-shadow
:
0
0
6px
#7aba7b
;
box-shadow
:
0
0
6px
#7aba7b
}
.control-group.success
.input-prepend
.add-on
,
.control-group.success
.input-append
.add-on
{
color
:
#468847
;
background-color
:
#dff0d8
;
border-color
:
#468847
}
input
:focus:required:invalid
,
textarea
:focus:required:invalid
,
select
:focus:required:invalid
{
color
:
#b94a48
;
border-color
:
#ee5f5b
}
input
:focus:required:invalid:focus
,
textarea
:focus:required:invalid:focus
,
select
:focus:required:invalid:focus
{
border-color
:
#e9322d
;
-webkit-box-shadow
:
0
0
6px
#f8b9b7
;
-moz-box-shadow
:
0
0
6px
#f8b9b7
;
box-shadow
:
0
0
6px
#f8b9b7
}
.form-actions
{
padding
:
17px
20px
18px
;
margin-top
:
18px
;
margin-bottom
:
18px
;
background-color
:
#f5f5f5
;
border-top
:
1px
solid
#e5e5e5
;
*
zoom
:
1
}
.form-actions
:before
,
.form-actions
:after
{
display
:
table
;
content
:
""
}
.form-actions
:after
{
clear
:
both
}
.uneditable-input
{
overflow
:
hidden
;
white-space
:
nowrap
;
cursor
:
not-allowed
;
background-color
:
#fff
;
border-color
:
#eee
;
-webkit-box-shadow
:
inset
0
1px
2px
rgba
(
0
,
0
,
0
,
0.025
);
-moz-box-shadow
:
inset
0
1px
2px
rgba
(
0
,
0
,
0
,
0.025
);
box-shadow
:
inset
0
1px
2px
rgba
(
0
,
0
,
0
,
0.025
)}
:-moz-placeholder
{
color
:
#999
}
:-ms-input-placeholder
{
color
:
#999
}
::-webkit-input-placeholder
{
color
:
#999
}
.help-block
,
.help-inline
{
color
:
#555
}
.help-block
{
display
:
block
;
margin-bottom
:
9px
}
.help-inline
{
display
:
inline-block
;
*
display
:
inline
;
padding-left
:
5px
;
vertical-align
:
middle
;
*
zoom
:
1
}
.input-prepend
,
.input-append
{
margin-bottom
:
5px
}
.input-prepend
input
,
.input-append
input
,
.input-prepend
select
,
.input-append
select
,
.input-prepend
.uneditable-input
,
.input-append
.uneditable-input
{
position
:
relative
;
margin-bottom
:
0
;
*
margin-left
:
0
;
vertical-align
:
middle
;
-webkit-border-radius
:
0
3px
3px
0
;
-moz-border-radius
:
0
3px
3px
0
;
border-radius
:
0
3px
3px
0
}
.input-prepend
input
:focus
,
.input-append
input
:focus
,
.input-prepend
select
:focus
,
.input-append
select
:focus
,
.input-prepend
.uneditable-input
:focus
,
.input-append
.uneditable-input
:focus
{
z-index
:
2
}
.input-prepend
.uneditable-input
,
.input-append
.uneditable-input
{
border-left-color
:
#ccc
}
.input-prepend
.add-on
,
.input-append
.add-on
{
display
:
inline-block
;
width
:
auto
;
height
:
18px
;
min-width
:
16px
;
padding
:
4px
5px
;
font-weight
:
normal
;
line-height
:
18px
;
text-align
:
center
;
text-shadow
:
0
1px
0
#fff
;
vertical-align
:
middle
;
background-color
:
#eee
;
border
:
1px
solid
#ccc
}
.input-prepend
.add-on
,
.input-append
.add-on
,
.input-prepend
.btn
,
.input-append
.btn
{
margin-left
:
-1px
;
-webkit-border-radius
:
0
;
-moz-border-radius
:
0
;
border-radius
:
0
}
.input-prepend
.active
,
.input-append
.active
{
background-color
:
#a9dba9
;
border-color
:
#46a546
}
.input-prepend
.add-on
,
.input-prepend
.btn
{
margin-right
:
-1px
}
.input-prepend
.add-on
:first-child
,
.input-prepend
.btn
:first-child
{
-webkit-border-radius
:
3px
0
0
3px
;
-moz-border-radius
:
3px
0
0
3px
;
border-radius
:
3px
0
0
3px
}
.input-append
input
,
.input-append
select
,
.input-append
.uneditable-input
{
-webkit-border-radius
:
3px
0
0
3px
;
-moz-border-radius
:
3px
0
0
3px
;
border-radius
:
3px
0
0
3px
}
.input-append
.uneditable-input
{
border-right-color
:
#ccc
;
border-left-color
:
#eee
}
.input-append
.add-on
:last-child
,
.input-append
.btn
:last-child
{
-webkit-border-radius
:
0
3px
3px
0
;
-moz-border-radius
:
0
3px
3px
0
;
border-radius
:
0
3px
3px
0
}
.input-prepend.input-append
input
,
.input-prepend.input-append
select
,
.input-prepend.input-append
.uneditable-input
{
-webkit-border-radius
:
0
;
-moz-border-radius
:
0
;
border-radius
:
0
}
.input-prepend.input-append
.add-on
:first-child
,
.input-prepend.input-append
.btn
:first-child
{
margin-right
:
-1px
;
-webkit-border-radius
:
3px
0
0
3px
;
-moz-border-radius
:
3px
0
0
3px
;
border-radius
:
3px
0
0
3px
}
.input-prepend.input-append
.add-on
:last-child
,
.input-prepend.input-append
.btn
:last-child
{
margin-left
:
-1px
;
-webkit-border-radius
:
0
3px
3px
0
;
-moz-border-radius
:
0
3px
3px
0
;
border-radius
:
0
3px
3px
0
}
.search-query
{
padding-right
:
14px
;
padding-right
:
4px
\
9
;
padding-left
:
14px
;
padding-left
:
4px
\
9
;
margin-bottom
:
0
;
-webkit-border-radius
:
14px
;
-moz-border-radius
:
14px
;
border-radius
:
14px
}
.form-search
input
,
.form-inline
input
,
.form-horizontal
input
,
.form-search
textarea
,
.form-inline
textarea
,
.form-horizontal
textarea
,
.form-search
select
,
.form-inline
select
,
.form-horizontal
select
,
.form-search
.help-inline
,
.form-inline
.help-inline
,
.form-horizontal
.help-inline
,
.form-search
.uneditable-input
,
.form-inline
.uneditable-input
,
.form-horizontal
.uneditable-input
,
.form-search
.input-prepend
,
.form-inline
.input-prepend
,
.form-horizontal
.input-prepend
,
.form-search
.input-append
,
.form-inline
.input-append
,
.form-horizontal
.input-append
{
display
:
inline-block
;
*
display
:
inline
;
margin-bottom
:
0
;
*
zoom
:
1
}
.form-search
.hide
,
.form-inline
.hide
,
.form-horizontal
.hide
{
display
:
none
}
.form-search
label
,
.form-inline
label
{
display
:
inline-block
}
.form-search
.input-append
,
.form-inline
.input-append
,
.form-search
.input-prepend
,
.form-inline
.input-prepend
{
margin-bottom
:
0
}
.form-search
.radio
,
.form-search
.checkbox
,
.form-inline
.radio
,
.form-inline
.checkbox
{
padding-left
:
0
;
margin-bottom
:
0
;
vertical-align
:
middle
}
.form-search
.radio
input
[
type
=
"radio"
],
.form-search
.checkbox
input
[
type
=
"checkbox"
],
.form-inline
.radio
input
[
type
=
"radio"
],
.form-inline
.checkbox
input
[
type
=
"checkbox"
]
{
float
:
left
;
margin-right
:
3px
;
margin-left
:
0
}
.control-group
{
margin-bottom
:
9px
}
legend
+
.control-group
{
margin-top
:
18px
;
-webkit-margin-top-collapse
:
separate
}
.form-horizontal
.control-group
{
margin-bottom
:
18px
;
*
zoom
:
1
}
.form-horizontal
.control-group
:before
,
.form-horizontal
.control-group
:after
{
display
:
table
;
content
:
""
}
.form-horizontal
.control-group
:after
{
clear
:
both
}
.form-horizontal
.control-label
{
float
:
left
;
width
:
140px
;
padding-top
:
5px
;
text-align
:
right
}
.form-horizontal
.controls
{
*
display
:
inline-block
;
*
padding-left
:
20px
;
margin-left
:
160px
;
*
margin-left
:
0
}
.form-horizontal
.controls
:first-child
{
*
padding-left
:
160px
}
.form-horizontal
.help-block
{
margin-top
:
9px
;
margin-bottom
:
0
}
.form-horizontal
.form-actions
{
padding-left
:
160px
}
table
{
max-width
:
100%
;
background-color
:
transparent
;
border-collapse
:
collapse
;
border-spacing
:
0
}
.table
{
width
:
100%
;
margin-bottom
:
18px
}
.table
th
,
.table
td
{
padding
:
8px
;
line-height
:
18px
;
text-align
:
left
;
vertical-align
:
top
;
border-top
:
1px
solid
#ddd
}
.table
th
{
font-weight
:
bold
}
.table
thead
th
{
vertical-align
:
bottom
}
.table
caption
+
thead
tr
:first-child
th
,
.table
caption
+
thead
tr
:first-child
td
,
.table
colgroup
+
thead
tr
:first-child
th
,
.table
colgroup
+
thead
tr
:first-child
td
,
.table
thead
:first-child
tr
:first-child
th
,
.table
thead
:first-child
tr
:first-child
td
{
border-top
:
0
}
.table
tbody
+
tbody
{
border-top
:
2px
solid
#ddd
}
.table-condensed
th
,
.table-condensed
td
{
padding
:
4px
5px
}
.table-bordered
{
border
:
1px
solid
#ddd
;
border-collapse
:
separate
;
*
border-collapse
:
collapsed
;
border-left
:
0
;
-webkit-border-radius
:
4px
;
-moz-border-radius
:
4px
;
border-radius
:
4px
}
.table-bordered
th
,
.table-bordered
td
{
border-left
:
1px
solid
#ddd
}
.table-bordered
caption
+
thead
tr
:first-child
th
,
.table-bordered
caption
+
tbody
tr
:first-child
th
,
.table-bordered
caption
+
tbody
tr
:first-child
td
,
.table-bordered
colgroup
+
thead
tr
:first-child
th
,
.table-bordered
colgroup
+
tbody
tr
:first-child
th
,
.table-bordered
colgroup
+
tbody
tr
:first-child
td
,
.table-bordered
thead
:first-child
tr
:first-child
th
,
.table-bordered
tbody
:first-child
tr
:first-child
th
,
.table-bordered
tbody
:first-child
tr
:first-child
td
{
border-top
:
0
}
.table-bordered
thead
:first-child
tr
:first-child
th
:first-child
,
.table-bordered
tbody
:first-child
tr
:first-child
td
:first-child
{
-webkit-border-top-left-radius
:
4px
;
border-top-left-radius
:
4px
;
-moz-border-radius-topleft
:
4px
}
.table-bordered
thead
:first-child
tr
:first-child
th
:last-child
,
.table-bordered
tbody
:first-child
tr
:first-child
td
:last-child
{
-webkit-border-top-right-radius
:
4px
;
border-top-right-radius
:
4px
;
-moz-border-radius-topright
:
4px
}
.table-bordered
thead
:last-child
tr
:last-child
th
:first-child
,
.table-bordered
tbody
:last-child
tr
:last-child
td
:first-child
{
-webkit-border-radius
:
0
0
0
4px
;
-moz-border-radius
:
0
0
0
4px
;
border-radius
:
0
0
0
4px
;
-webkit-border-bottom-left-radius
:
4px
;
border-bottom-left-radius
:
4px
;
-moz-border-radius-bottomleft
:
4px
}
.table-bordered
thead
:last-child
tr
:last-child
th
:last-child
,
.table-bordered
tbody
:last-child
tr
:last-child
td
:last-child
{
-webkit-border-bottom-right-radius
:
4px
;
border-bottom-right-radius
:
4px
;
-moz-border-radius-bottomright
:
4px
}
.table-striped
tbody
tr
:nth-child
(
odd
)
td
,
.table-striped
tbody
tr
:nth-child
(
odd
)
th
{
background-color
:
#f9f9f9
}
.table
tbody
tr
:hover
td
,
.table
tbody
tr
:hover
th
{
background-color
:
#f5f5f5
}
table
.span1
{
float
:
none
;
width
:
44px
;
margin-left
:
0
}
table
.span2
{
float
:
none
;
width
:
124px
;
margin-left
:
0
}
table
.span3
{
float
:
none
;
width
:
204px
;
margin-left
:
0
}
table
.span4
{
float
:
none
;
width
:
284px
;
margin-left
:
0
}
table
.span5
{
float
:
none
;
width
:
364px
;
margin-left
:
0
}
table
.span6
{
float
:
none
;
width
:
444px
;
margin-left
:
0
}
table
.span7
{
float
:
none
;
width
:
524px
;
margin-left
:
0
}
table
.span8
{
float
:
none
;
width
:
604px
;
margin-left
:
0
}
table
.span9
{
float
:
none
;
width
:
684px
;
margin-left
:
0
}
table
.span10
{
float
:
none
;
width
:
764px
;
margin-left
:
0
}
table
.span11
{
float
:
none
;
width
:
844px
;
margin-left
:
0
}
table
.span12
{
float
:
none
;
width
:
924px
;
margin-left
:
0
}
table
.span13
{
float
:
none
;
width
:
1004px
;
margin-left
:
0
}
table
.span14
{
float
:
none
;
width
:
1084px
;
margin-left
:
0
}
table
.span15
{
float
:
none
;
width
:
1164px
;
margin-left
:
0
}
table
.span16
{
float
:
none
;
width
:
1244px
;
margin-left
:
0
}
table
.span17
{
float
:
none
;
width
:
1324px
;
margin-left
:
0
}
table
.span18
{
float
:
none
;
width
:
1404px
;
margin-left
:
0
}
table
.span19
{
float
:
none
;
width
:
1484px
;
margin-left
:
0
}
table
.span20
{
float
:
none
;
width
:
1564px
;
margin-left
:
0
}
table
.span21
{
float
:
none
;
width
:
1644px
;
margin-left
:
0
}
table
.span22
{
float
:
none
;
width
:
1724px
;
margin-left
:
0
}
table
.span23
{
float
:
none
;
width
:
1804px
;
margin-left
:
0
}
table
.span24
{
float
:
none
;
width
:
1884px
;
margin-left
:
0
}
[
class
^=
"icon-"
],[
class
*=
" icon-"
]
{
display
:
inline-block
;
width
:
14px
;
height
:
14px
;
*
margin-right
:
.3em
;
line-height
:
14px
;
vertical-align
:
text-top
;
background-image
:
url("../img/glyphicons-halflings.png")
;
background-position
:
14px
14px
;
background-repeat
:
no-repeat
}
[
class
^=
"icon-"
]
:last-child
,[
class
*=
" icon-"
]
:last-child
{
*
margin-left
:
0
}
.icon-white
{
background-image
:
url("../img/glyphicons-halflings-white.png")
}
.icon-glass
{
background-position
:
0
0
}
.icon-music
{
background-position
:
-24px
0
}
.icon-search
{
background-position
:
-48px
0
}
.icon-envelope
{
background-position
:
-72px
0
}
.icon-heart
{
background-position
:
-96px
0
}
.icon-star
{
background-position
:
-120px
0
}
.icon-star-empty
{
background-position
:
-144px
0
}
.icon-user
{
background-position
:
-168px
0
}
.icon-film
{
background-position
:
-192px
0
}
.icon-th-large
{
background-position
:
-216px
0
}
.icon-th
{
background-position
:
-240px
0
}
.icon-th-list
{
background-position
:
-264px
0
}
.icon-ok
{
background-position
:
-288px
0
}
.icon-remove
{
background-position
:
-312px
0
}
.icon-zoom-in
{
background-position
:
-336px
0
}
.icon-zoom-out
{
background-position
:
-360px
0
}
.icon-off
{
background-position
:
-384px
0
}
.icon-signal
{
background-position
:
-408px
0
}
.icon-cog
{
background-position
:
-432px
0
}
.icon-trash
{
background-position
:
-456px
0
}
.icon-home
{
background-position
:
0
-24px
}
.icon-file
{
background-position
:
-24px
-24px
}
.icon-time
{
background-position
:
-48px
-24px
}
.icon-road
{
background-position
:
-72px
-24px
}
.icon-download-alt
{
background-position
:
-96px
-24px
}
.icon-download
{
background-position
:
-120px
-24px
}
.icon-upload
{
background-position
:
-144px
-24px
}
.icon-inbox
{
background-position
:
-168px
-24px
}
.icon-play-circle
{
background-position
:
-192px
-24px
}
.icon-repeat
{
background-position
:
-216px
-24px
}
.icon-refresh
{
background-position
:
-240px
-24px
}
.icon-list-alt
{
background-position
:
-264px
-24px
}
.icon-lock
{
background-position
:
-287px
-24px
}
.icon-flag
{
background-position
:
-312px
-24px
}
.icon-headphones
{
background-position
:
-336px
-24px
}
.icon-volume-off
{
background-position
:
-360px
-24px
}
.icon-volume-down
{
background-position
:
-384px
-24px
}
.icon-volume-up
{
background-position
:
-408px
-24px
}
.icon-qrcode
{
background-position
:
-432px
-24px
}
.icon-barcode
{
background-position
:
-456px
-24px
}
.icon-tag
{
background-position
:
0
-48px
}
.icon-tags
{
background-position
:
-25px
-48px
}
.icon-book
{
background-position
:
-48px
-48px
}
.icon-bookmark
{
background-position
:
-72px
-48px
}
.icon-print
{
background-position
:
-96px
-48px
}
.icon-camera
{
background-position
:
-120px
-48px
}
.icon-font
{
background-position
:
-144px
-48px
}
.icon-bold
{
background-position
:
-167px
-48px
}
.icon-italic
{
background-position
:
-192px
-48px
}
.icon-text-height
{
background-position
:
-216px
-48px
}
.icon-text-width
{
background-position
:
-240px
-48px
}
.icon-align-left
{
background-position
:
-264px
-48px
}
.icon-align-center
{
background-position
:
-288px
-48px
}
.icon-align-right
{
background-position
:
-312px
-48px
}
.icon-align-justify
{
background-position
:
-336px
-48px
}
.icon-list
{
background-position
:
-360px
-48px
}
.icon-indent-left
{
background-position
:
-384px
-48px
}
.icon-indent-right
{
background-position
:
-408px
-48px
}
.icon-facetime-video
{
background-position
:
-432px
-48px
}
.icon-picture
{
background-position
:
-456px
-48px
}
.icon-pencil
{
background-position
:
0
-72px
}
.icon-map-marker
{
background-position
:
-24px
-72px
}
.icon-adjust
{
background-position
:
-48px
-72px
}
.icon-tint
{
background-position
:
-72px
-72px
}
.icon-edit
{
background-position
:
-96px
-72px
}
.icon-share
{
background-position
:
-120px
-72px
}
.icon-check
{
background-position
:
-144px
-72px
}
.icon-move
{
background-position
:
-168px
-72px
}
.icon-step-backward
{
background-position
:
-192px
-72px
}
.icon-fast-backward
{
background-position
:
-216px
-72px
}
.icon-backward
{
background-position
:
-240px
-72px
}
.icon-play
{
background-position
:
-264px
-72px
}
.icon-pause
{
background-position
:
-288px
-72px
}
.icon-stop
{
background-position
:
-312px
-72px
}
.icon-forward
{
background-position
:
-336px
-72px
}
.icon-fast-forward
{
background-position
:
-360px
-72px
}
.icon-step-forward
{
background-position
:
-384px
-72px
}
.icon-eject
{
background-position
:
-408px
-72px
}
.icon-chevron-left
{
background-position
:
-432px
-72px
}
.icon-chevron-right
{
background-position
:
-456px
-72px
}
.icon-plus-sign
{
background-position
:
0
-96px
}
.icon-minus-sign
{
background-position
:
-24px
-96px
}
.icon-remove-sign
{
background-position
:
-48px
-96px
}
.icon-ok-sign
{
background-position
:
-72px
-96px
}
.icon-question-sign
{
background-position
:
-96px
-96px
}
.icon-info-sign
{
background-position
:
-120px
-96px
}
.icon-screenshot
{
background-position
:
-144px
-96px
}
.icon-remove-circle
{
background-position
:
-168px
-96px
}
.icon-ok-circle
{
background-position
:
-192px
-96px
}
.icon-ban-circle
{
background-position
:
-216px
-96px
}
.icon-arrow-left
{
background-position
:
-240px
-96px
}
.icon-arrow-right
{
background-position
:
-264px
-96px
}
.icon-arrow-up
{
background-position
:
-289px
-96px
}
.icon-arrow-down
{
background-position
:
-312px
-96px
}
.icon-share-alt
{
background-position
:
-336px
-96px
}
.icon-resize-full
{
background-position
:
-360px
-96px
}
.icon-resize-small
{
background-position
:
-384px
-96px
}
.icon-plus
{
background-position
:
-408px
-96px
}
.icon-minus
{
background-position
:
-433px
-96px
}
.icon-asterisk
{
background-position
:
-456px
-96px
}
.icon-exclamation-sign
{
background-position
:
0
-120px
}
.icon-gift
{
background-position
:
-24px
-120px
}
.icon-leaf
{
background-position
:
-48px
-120px
}
.icon-fire
{
background-position
:
-72px
-120px
}
.icon-eye-open
{
background-position
:
-96px
-120px
}
.icon-eye-close
{
background-position
:
-120px
-120px
}
.icon-warning-sign
{
background-position
:
-144px
-120px
}
.icon-plane
{
background-position
:
-168px
-120px
}
.icon-calendar
{
background-position
:
-192px
-120px
}
.icon-random
{
background-position
:
-216px
-120px
}
.icon-comment
{
background-position
:
-240px
-120px
}
.icon-magnet
{
background-position
:
-264px
-120px
}
.icon-chevron-up
{
background-position
:
-288px
-120px
}
.icon-chevron-down
{
background-position
:
-313px
-119px
}
.icon-retweet
{
background-position
:
-336px
-120px
}
.icon-shopping-cart
{
background-position
:
-360px
-120px
}
.icon-folder-close
{
background-position
:
-384px
-120px
}
.icon-folder-open
{
background-position
:
-408px
-120px
}
.icon-resize-vertical
{
background-position
:
-432px
-119px
}
.icon-resize-horizontal
{
background-position
:
-456px
-118px
}
.icon-hdd
{
background-position
:
0
-144px
}
.icon-bullhorn
{
background-position
:
-24px
-144px
}
.icon-bell
{
background-position
:
-48px
-144px
}
.icon-certificate
{
background-position
:
-72px
-144px
}
.icon-thumbs-up
{
background-position
:
-96px
-144px
}
.icon-thumbs-down
{
background-position
:
-120px
-144px
}
.icon-hand-right
{
background-position
:
-144px
-144px
}
.icon-hand-left
{
background-position
:
-168px
-144px
}
.icon-hand-up
{
background-position
:
-192px
-144px
}
.icon-hand-down
{
background-position
:
-216px
-144px
}
.icon-circle-arrow-right
{
background-position
:
-240px
-144px
}
.icon-circle-arrow-left
{
background-position
:
-264px
-144px
}
.icon-circle-arrow-up
{
background-position
:
-288px
-144px
}
.icon-circle-arrow-down
{
background-position
:
-312px
-144px
}
.icon-globe
{
background-position
:
-336px
-144px
}
.icon-wrench
{
background-position
:
-360px
-144px
}
.icon-tasks
{
background-position
:
-384px
-144px
}
.icon-filter
{
background-position
:
-408px
-144px
}
.icon-briefcase
{
background-position
:
-432px
-144px
}
.icon-fullscreen
{
background-position
:
-456px
-144px
}
.dropup
,
.dropdown
{
position
:
relative
}
.dropdown-toggle
{
*
margin-bottom
:
-3px
}
.dropdown-toggle
:active
,
.open
.dropdown-toggle
{
outline
:
0
}
.caret
{
display
:
inline-block
;
width
:
0
;
height
:
0
;
vertical-align
:
top
;
border-top
:
4px
solid
#000
;
border-right
:
4px
solid
transparent
;
border-left
:
4px
solid
transparent
;
content
:
""
;
opacity
:
.3
;
filter
:
alpha
(
opacity
=
30
)}
.dropdown
.caret
{
margin-top
:
8px
;
margin-left
:
2px
}
.dropdown
:hover
.caret
,
.open
.caret
{
opacity
:
1
;
filter
:
alpha
(
opacity
=
100
)}
.dropdown-menu
{
position
:
absolute
;
top
:
100%
;
left
:
0
;
z-index
:
1000
;
display
:
none
;
float
:
left
;
min-width
:
160px
;
padding
:
4px
0
;
margin
:
1px
0
0
;
list-style
:
none
;
background-color
:
#fff
;
border
:
1px
solid
#ccc
;
border
:
1px
solid
rgba
(
0
,
0
,
0
,
0.2
);
*
border-right-width
:
2px
;
*
border-bottom-width
:
2px
;
-webkit-border-radius
:
5px
;
-moz-border-radius
:
5px
;
border-radius
:
5px
;
-webkit-box-shadow
:
0
5px
10px
rgba
(
0
,
0
,
0
,
0.2
);
-moz-box-shadow
:
0
5px
10px
rgba
(
0
,
0
,
0
,
0.2
);
box-shadow
:
0
5px
10px
rgba
(
0
,
0
,
0
,
0.2
);
-webkit-background-clip
:
padding-box
;
-moz-background-clip
:
padding
;
background-clip
:
padding-box
}
.dropdown-menu.pull-right
{
right
:
0
;
left
:
auto
}
.dropdown-menu
.divider
{
*
width
:
100%
;
height
:
1px
;
margin
:
8px
1px
;
*
margin
:
-5px
0
5px
;
overflow
:
hidden
;
background-color
:
#e5e5e5
;
border-bottom
:
1px
solid
#fff
}
.dropdown-menu
a
{
display
:
block
;
padding
:
3px
15px
;
clear
:
both
;
font-weight
:
normal
;
line-height
:
18px
;
color
:
#333
;
white-space
:
nowrap
}
.dropdown-menu
li
>
a
:hover
,
.dropdown-menu
.active
>
a
,
.dropdown-menu
.active
>
a
:hover
{
color
:
#fff
;
text-decoration
:
none
;
background-color
:
#08c
}
.open
{
*
z-index
:
1000
}
.open
>
.dropdown-menu
{
display
:
block
}
.pull-right
>
.dropdown-menu
{
right
:
0
;
left
:
auto
}
.dropup
.caret
,
.navbar-fixed-bottom
.dropdown
.caret
{
border-top
:
0
;
border-bottom
:
4px
solid
#000
;
content
:
"\2191"
}
.dropup
.dropdown-menu
,
.navbar-fixed-bottom
.dropdown
.dropdown-menu
{
top
:
auto
;
bottom
:
100%
;
margin-bottom
:
1px
}
.typeahead
{
margin-top
:
2px
;
-webkit-border-radius
:
4px
;
-moz-border-radius
:
4px
;
border-radius
:
4px
}
.well
{
min-height
:
20px
;
padding
:
19px
;
margin-bottom
:
20px
;
background-color
:
#f5f5f5
;
border
:
1px
solid
#eee
;
border
:
1px
solid
rgba
(
0
,
0
,
0
,
0.05
);
-webkit-border-radius
:
4px
;
-moz-border-radius
:
4px
;
border-radius
:
4px
;
-webkit-box-shadow
:
inset
0
1px
1px
rgba
(
0
,
0
,
0
,
0.05
);
-moz-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-large
{
padding
:
24px
;
-webkit-border-radius
:
6px
;
-moz-border-radius
:
6px
;
border-radius
:
6px
}
.well-small
{
padding
:
9px
;
-webkit-border-radius
:
3px
;
-moz-border-radius
:
3px
;
border-radius
:
3px
}
.fade
{
opacity
:
0
;
-webkit-transition
:
opacity
.15s
linear
;
-moz-transition
:
opacity
.15s
linear
;
-ms-transition
:
opacity
.15s
linear
;
-o-transition
:
opacity
.15s
linear
;
transition
:
opacity
.15s
linear
}
.fade.in
{
opacity
:
1
}
.collapse
{
position
:
relative
;
height
:
0
;
overflow
:
hidden
;
-webkit-transition
:
height
.35s
ease
;
-moz-transition
:
height
.35s
ease
;
-ms-transition
:
height
.35s
ease
;
-o-transition
:
height
.35s
ease
;
transition
:
height
.35s
ease
}
.collapse.in
{
height
:
auto
}
.close
{
float
:
right
;
font-size
:
20px
;
font-weight
:
bold
;
line-height
:
18px
;
color
:
#000
;
text-shadow
:
0
1px
0
#fff
;
opacity
:
.2
;
filter
:
alpha
(
opacity
=
20
)}
.close
:hover
{
color
:
#000
;
text-decoration
:
none
;
cursor
:
pointer
;
opacity
:
.4
;
filter
:
alpha
(
opacity
=
40
)}
button
.close
{
padding
:
0
;
cursor
:
pointer
;
background
:
transparent
;
border
:
0
;
-webkit-appearance
:
none
}
.btn
{
display
:
inline-block
;
*
display
:
inline
;
padding
:
4px
10px
4px
;
margin-bottom
:
0
;
*
margin-left
:
.3em
;
font-size
:
13px
;
line-height
:
18px
;
*
line-height
:
20px
;
color
:
#333
;
text-align
:
center
;
text-shadow
:
0
1px
1px
rgba
(
255
,
255
,
255
,
0.75
);
vertical-align
:
middle
;
cursor
:
pointer
;
background-color
:
#f5f5f5
;
*
background-color
:
#e6e6e6
;
background-image
:
-ms-linear-gradient
(
top
,
#fff
,
#e6e6e6
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#fff
),
to
(
#e6e6e6
));
background-image
:
-webkit-linear-gradient
(
top
,
#fff
,
#e6e6e6
);
background-image
:
-o-linear-gradient
(
top
,
#fff
,
#e6e6e6
);
background-image
:
linear-gradient
(
top
,
#fff
,
#e6e6e6
);
background-image
:
-moz-linear-gradient
(
top
,
#fff
,
#e6e6e6
);
background-repeat
:
repeat-x
;
border
:
1px
solid
#ccc
;
*
border
:
0
;
border-color
:
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.25
);
border-color
:
#e6e6e6
#e6e6e6
#bfbfbf
;
border-bottom-color
:
#b3b3b3
;
-webkit-border-radius
:
4px
;
-moz-border-radius
:
4px
;
border-radius
:
4px
;
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
startColorstr
=
'#ffffff'
,
endColorstr
=
'#e6e6e6'
,
GradientType
=
0
);
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
enabled
=
false
);
*
zoom
:
1
;
-webkit-box-shadow
:
inset
0
1px
0
rgba
(
255
,
255
,
255
,
0.2
),
0
1px
2px
rgba
(
0
,
0
,
0
,
0.05
);
-moz-box-shadow
:
inset
0
1px
0
rgba
(
255
,
255
,
255
,
0.2
),
0
1px
2px
rgba
(
0
,
0
,
0
,
0.05
);
box-shadow
:
inset
0
1px
0
rgba
(
255
,
255
,
255
,
0.2
),
0
1px
2px
rgba
(
0
,
0
,
0
,
0.05
)}
.btn
:hover
,
.btn
:active
,
.btn.active
,
.btn.disabled
,
.btn
[
disabled
]
{
background-color
:
#e6e6e6
;
*
background-color
:
#d9d9d9
}
.btn
:active
,
.btn.active
{
background-color
:
#ccc
\
9
}
.btn
:first-child
{
*
margin-left
:
0
}
.btn
:hover
{
color
:
#333
;
text-decoration
:
none
;
background-color
:
#e6e6e6
;
*
background-color
:
#d9d9d9
;
background-position
:
0
-15px
;
-webkit-transition
:
background-position
.1s
linear
;
-moz-transition
:
background-position
.1s
linear
;
-ms-transition
:
background-position
.1s
linear
;
-o-transition
:
background-position
.1s
linear
;
transition
:
background-position
.1s
linear
}
.btn
:focus
{
outline
:
thin
dotted
#333
;
outline
:
5px
auto
-webkit-focus-ring-color
;
outline-offset
:
-2px
}
.btn.active
,
.btn
:active
{
background-color
:
#e6e6e6
;
background-color
:
#d9d9d9
\
9
;
background-image
:
none
;
outline
:
0
;
-webkit-box-shadow
:
inset
0
2px
4px
rgba
(
0
,
0
,
0
,
0.15
),
0
1px
2px
rgba
(
0
,
0
,
0
,
0.05
);
-moz-box-shadow
:
inset
0
2px
4px
rgba
(
0
,
0
,
0
,
0.15
),
0
1px
2px
rgba
(
0
,
0
,
0
,
0.05
);
box-shadow
:
inset
0
2px
4px
rgba
(
0
,
0
,
0
,
0.15
),
0
1px
2px
rgba
(
0
,
0
,
0
,
0.05
)}
.btn.disabled
,
.btn
[
disabled
]
{
cursor
:
default
;
background-color
:
#e6e6e6
;
background-image
:
none
;
opacity
:
.65
;
filter
:
alpha
(
opacity
=
65
);
-webkit-box-shadow
:
none
;
-moz-box-shadow
:
none
;
box-shadow
:
none
}
.btn-large
{
padding
:
9px
14px
;
font-size
:
15px
;
line-height
:
normal
;
-webkit-border-radius
:
5px
;
-moz-border-radius
:
5px
;
border-radius
:
5px
}
.btn-large
[
class
^=
"icon-"
]
{
margin-top
:
1px
}
.btn-small
{
padding
:
5px
9px
;
font-size
:
11px
;
line-height
:
16px
}
.btn-small
[
class
^=
"icon-"
]
{
margin-top
:
-1px
}
.btn-mini
{
padding
:
2px
6px
;
font-size
:
11px
;
line-height
:
14px
}
.btn-primary
,
.btn-primary
:hover
,
.btn-warning
,
.btn-warning
:hover
,
.btn-danger
,
.btn-danger
:hover
,
.btn-success
,
.btn-success
:hover
,
.btn-info
,
.btn-info
:hover
,
.btn-inverse
,
.btn-inverse
:hover
{
color
:
#fff
;
text-shadow
:
0
-1px
0
rgba
(
0
,
0
,
0
,
0.25
)}
.btn-primary.active
,
.btn-warning.active
,
.btn-danger.active
,
.btn-success.active
,
.btn-info.active
,
.btn-inverse.active
{
color
:
rgba
(
255
,
255
,
255
,
0.75
)}
.btn
{
border-color
:
#ccc
;
border-color
:
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.25
)}
.btn-primary
{
background-color
:
#0074cc
;
*
background-color
:
#05c
;
background-image
:
-ms-linear-gradient
(
top
,
#08c
,
#05c
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#08c
),
to
(
#05c
));
background-image
:
-webkit-linear-gradient
(
top
,
#08c
,
#05c
);
background-image
:
-o-linear-gradient
(
top
,
#08c
,
#05c
);
background-image
:
-moz-linear-gradient
(
top
,
#08c
,
#05c
);
background-image
:
linear-gradient
(
top
,
#08c
,
#05c
);
background-repeat
:
repeat-x
;
border-color
:
#05c
#05c
#003580
;
border-color
:
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.25
);
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
startColorstr
=
'#0088cc'
,
endColorstr
=
'#0055cc'
,
GradientType
=
0
);
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
enabled
=
false
)}
.btn-primary
:hover
,
.btn-primary
:active
,
.btn-primary.active
,
.btn-primary.disabled
,
.btn-primary
[
disabled
]
{
background-color
:
#05c
;
*
background-color
:
#004ab3
}
.btn-primary
:active
,
.btn-primary.active
{
background-color
:
#004099
\
9
}
.btn-warning
{
background-color
:
#faa732
;
*
background-color
:
#f89406
;
background-image
:
-ms-linear-gradient
(
top
,
#fbb450
,
#f89406
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#fbb450
),
to
(
#f89406
));
background-image
:
-webkit-linear-gradient
(
top
,
#fbb450
,
#f89406
);
background-image
:
-o-linear-gradient
(
top
,
#fbb450
,
#f89406
);
background-image
:
-moz-linear-gradient
(
top
,
#fbb450
,
#f89406
);
background-image
:
linear-gradient
(
top
,
#fbb450
,
#f89406
);
background-repeat
:
repeat-x
;
border-color
:
#f89406
#f89406
#ad6704
;
border-color
:
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.25
);
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
startColorstr
=
'#fbb450'
,
endColorstr
=
'#f89406'
,
GradientType
=
0
);
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
enabled
=
false
)}
.btn-warning
:hover
,
.btn-warning
:active
,
.btn-warning.active
,
.btn-warning.disabled
,
.btn-warning
[
disabled
]
{
background-color
:
#f89406
;
*
background-color
:
#df8505
}
.btn-warning
:active
,
.btn-warning.active
{
background-color
:
#c67605
\
9
}
.btn-danger
{
background-color
:
#da4f49
;
*
background-color
:
#bd362f
;
background-image
:
-ms-linear-gradient
(
top
,
#ee5f5b
,
#bd362f
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#ee5f5b
),
to
(
#bd362f
));
background-image
:
-webkit-linear-gradient
(
top
,
#ee5f5b
,
#bd362f
);
background-image
:
-o-linear-gradient
(
top
,
#ee5f5b
,
#bd362f
);
background-image
:
-moz-linear-gradient
(
top
,
#ee5f5b
,
#bd362f
);
background-image
:
linear-gradient
(
top
,
#ee5f5b
,
#bd362f
);
background-repeat
:
repeat-x
;
border-color
:
#bd362f
#bd362f
#802420
;
border-color
:
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.25
);
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
startColorstr
=
'#ee5f5b'
,
endColorstr
=
'#bd362f'
,
GradientType
=
0
);
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
enabled
=
false
)}
.btn-danger
:hover
,
.btn-danger
:active
,
.btn-danger.active
,
.btn-danger.disabled
,
.btn-danger
[
disabled
]
{
background-color
:
#bd362f
;
*
background-color
:
#a9302a
}
.btn-danger
:active
,
.btn-danger.active
{
background-color
:
#942a25
\
9
}
.btn-success
{
background-color
:
#5bb75b
;
*
background-color
:
#51a351
;
background-image
:
-ms-linear-gradient
(
top
,
#62c462
,
#51a351
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#62c462
),
to
(
#51a351
));
background-image
:
-webkit-linear-gradient
(
top
,
#62c462
,
#51a351
);
background-image
:
-o-linear-gradient
(
top
,
#62c462
,
#51a351
);
background-image
:
-moz-linear-gradient
(
top
,
#62c462
,
#51a351
);
background-image
:
linear-gradient
(
top
,
#62c462
,
#51a351
);
background-repeat
:
repeat-x
;
border-color
:
#51a351
#51a351
#387038
;
border-color
:
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.25
);
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
startColorstr
=
'#62c462'
,
endColorstr
=
'#51a351'
,
GradientType
=
0
);
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
enabled
=
false
)}
.btn-success
:hover
,
.btn-success
:active
,
.btn-success.active
,
.btn-success.disabled
,
.btn-success
[
disabled
]
{
background-color
:
#51a351
;
*
background-color
:
#499249
}
.btn-success
:active
,
.btn-success.active
{
background-color
:
#408140
\
9
}
.btn-info
{
background-color
:
#49afcd
;
*
background-color
:
#2f96b4
;
background-image
:
-ms-linear-gradient
(
top
,
#5bc0de
,
#2f96b4
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#5bc0de
),
to
(
#2f96b4
));
background-image
:
-webkit-linear-gradient
(
top
,
#5bc0de
,
#2f96b4
);
background-image
:
-o-linear-gradient
(
top
,
#5bc0de
,
#2f96b4
);
background-image
:
-moz-linear-gradient
(
top
,
#5bc0de
,
#2f96b4
);
background-image
:
linear-gradient
(
top
,
#5bc0de
,
#2f96b4
);
background-repeat
:
repeat-x
;
border-color
:
#2f96b4
#2f96b4
#1f6377
;
border-color
:
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.25
);
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
startColorstr
=
'#5bc0de'
,
endColorstr
=
'#2f96b4'
,
GradientType
=
0
);
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
enabled
=
false
)}
.btn-info
:hover
,
.btn-info
:active
,
.btn-info.active
,
.btn-info.disabled
,
.btn-info
[
disabled
]
{
background-color
:
#2f96b4
;
*
background-color
:
#2a85a0
}
.btn-info
:active
,
.btn-info.active
{
background-color
:
#24748c
\
9
}
.btn-inverse
{
background-color
:
#414141
;
*
background-color
:
#222
;
background-image
:
-ms-linear-gradient
(
top
,
#555
,
#222
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#555
),
to
(
#222
));
background-image
:
-webkit-linear-gradient
(
top
,
#555
,
#222
);
background-image
:
-o-linear-gradient
(
top
,
#555
,
#222
);
background-image
:
-moz-linear-gradient
(
top
,
#555
,
#222
);
background-image
:
linear-gradient
(
top
,
#555
,
#222
);
background-repeat
:
repeat-x
;
border-color
:
#222
#222
#000
;
border-color
:
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.25
);
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
startColorstr
=
'#555555'
,
endColorstr
=
'#222222'
,
GradientType
=
0
);
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
enabled
=
false
)}
.btn-inverse
:hover
,
.btn-inverse
:active
,
.btn-inverse.active
,
.btn-inverse.disabled
,
.btn-inverse
[
disabled
]
{
background-color
:
#222
;
*
background-color
:
#151515
}
.btn-inverse
:active
,
.btn-inverse.active
{
background-color
:
#080808
\
9
}
button
.btn
,
input
[
type
=
"submit"
]
.btn
{
*
padding-top
:
2px
;
*
padding-bottom
:
2px
}
button
.btn
::-moz-focus-inner
,
input
[
type
=
"submit"
]
.btn
::-moz-focus-inner
{
padding
:
0
;
border
:
0
}
button
.btn.btn-large
,
input
[
type
=
"submit"
]
.btn.btn-large
{
*
padding-top
:
7px
;
*
padding-bottom
:
7px
}
button
.btn.btn-small
,
input
[
type
=
"submit"
]
.btn.btn-small
{
*
padding-top
:
3px
;
*
padding-bottom
:
3px
}
button
.btn.btn-mini
,
input
[
type
=
"submit"
]
.btn.btn-mini
{
*
padding-top
:
1px
;
*
padding-bottom
:
1px
}
.btn-group
{
position
:
relative
;
*
margin-left
:
.3em
;
*
zoom
:
1
}
.btn-group
:before
,
.btn-group
:after
{
display
:
table
;
content
:
""
}
.btn-group
:after
{
clear
:
both
}
.btn-group
:first-child
{
*
margin-left
:
0
}
.btn-group
+
.btn-group
{
margin-left
:
5px
}
.btn-toolbar
{
margin-top
:
9px
;
margin-bottom
:
9px
}
.btn-toolbar
.btn-group
{
display
:
inline-block
;
*
display
:
inline
;
*
zoom
:
1
}
.btn-group
>
.btn
{
position
:
relative
;
float
:
left
;
margin-left
:
-1px
;
-webkit-border-radius
:
0
;
-moz-border-radius
:
0
;
border-radius
:
0
}
.btn-group
>
.btn
:first-child
{
margin-left
:
0
;
-webkit-border-bottom-left-radius
:
4px
;
border-bottom-left-radius
:
4px
;
-webkit-border-top-left-radius
:
4px
;
border-top-left-radius
:
4px
;
-moz-border-radius-bottomleft
:
4px
;
-moz-border-radius-topleft
:
4px
}
.btn-group
>
.btn
:last-child
,
.btn-group
>
.dropdown-toggle
{
-webkit-border-top-right-radius
:
4px
;
border-top-right-radius
:
4px
;
-webkit-border-bottom-right-radius
:
4px
;
border-bottom-right-radius
:
4px
;
-moz-border-radius-topright
:
4px
;
-moz-border-radius-bottomright
:
4px
}
.btn-group
>
.btn.large
:first-child
{
margin-left
:
0
;
-webkit-border-bottom-left-radius
:
6px
;
border-bottom-left-radius
:
6px
;
-webkit-border-top-left-radius
:
6px
;
border-top-left-radius
:
6px
;
-moz-border-radius-bottomleft
:
6px
;
-moz-border-radius-topleft
:
6px
}
.btn-group
>
.btn.large
:last-child
,
.btn-group
>
.large.dropdown-toggle
{
-webkit-border-top-right-radius
:
6px
;
border-top-right-radius
:
6px
;
-webkit-border-bottom-right-radius
:
6px
;
border-bottom-right-radius
:
6px
;
-moz-border-radius-topright
:
6px
;
-moz-border-radius-bottomright
:
6px
}
.btn-group
>
.btn
:hover
,
.btn-group
>
.btn
:focus
,
.btn-group
>
.btn
:active
,
.btn-group
>
.btn.active
{
z-index
:
2
}
.btn-group
.dropdown-toggle
:active
,
.btn-group.open
.dropdown-toggle
{
outline
:
0
}
.btn-group
>
.dropdown-toggle
{
*
padding-top
:
4px
;
padding-right
:
8px
;
*
padding-bottom
:
4px
;
padding-left
:
8px
;
-webkit-box-shadow
:
inset
1px
0
0
rgba
(
255
,
255
,
255
,
0.125
),
inset
0
1px
0
rgba
(
255
,
255
,
255
,
0.2
),
0
1px
2px
rgba
(
0
,
0
,
0
,
0.05
);
-moz-box-shadow
:
inset
1px
0
0
rgba
(
255
,
255
,
255
,
0.125
),
inset
0
1px
0
rgba
(
255
,
255
,
255
,
0.2
),
0
1px
2px
rgba
(
0
,
0
,
0
,
0.05
);
box-shadow
:
inset
1px
0
0
rgba
(
255
,
255
,
255
,
0.125
),
inset
0
1px
0
rgba
(
255
,
255
,
255
,
0.2
),
0
1px
2px
rgba
(
0
,
0
,
0
,
0.05
)}
.btn-group
>
.btn-mini.dropdown-toggle
{
padding-right
:
5px
;
padding-left
:
5px
}
.btn-group
>
.btn-small.dropdown-toggle
{
*
padding-top
:
4px
;
*
padding-bottom
:
4px
}
.btn-group
>
.btn-large.dropdown-toggle
{
padding-right
:
12px
;
padding-left
:
12px
}
.btn-group.open
.dropdown-toggle
{
background-image
:
none
;
-webkit-box-shadow
:
inset
0
2px
4px
rgba
(
0
,
0
,
0
,
0.15
),
0
1px
2px
rgba
(
0
,
0
,
0
,
0.05
);
-moz-box-shadow
:
inset
0
2px
4px
rgba
(
0
,
0
,
0
,
0.15
),
0
1px
2px
rgba
(
0
,
0
,
0
,
0.05
);
box-shadow
:
inset
0
2px
4px
rgba
(
0
,
0
,
0
,
0.15
),
0
1px
2px
rgba
(
0
,
0
,
0
,
0.05
)}
.btn-group.open
.btn.dropdown-toggle
{
background-color
:
#e6e6e6
}
.btn-group.open
.btn-primary.dropdown-toggle
{
background-color
:
#05c
}
.btn-group.open
.btn-warning.dropdown-toggle
{
background-color
:
#f89406
}
.btn-group.open
.btn-danger.dropdown-toggle
{
background-color
:
#bd362f
}
.btn-group.open
.btn-success.dropdown-toggle
{
background-color
:
#51a351
}
.btn-group.open
.btn-info.dropdown-toggle
{
background-color
:
#2f96b4
}
.btn-group.open
.btn-inverse.dropdown-toggle
{
background-color
:
#222
}
.btn
.caret
{
margin-top
:
7px
;
margin-left
:
0
}
.btn
:hover
.caret
,
.open.btn-group
.caret
{
opacity
:
1
;
filter
:
alpha
(
opacity
=
100
)}
.btn-mini
.caret
{
margin-top
:
5px
}
.btn-small
.caret
{
margin-top
:
6px
}
.btn-large
.caret
{
margin-top
:
6px
;
border-top-width
:
5px
;
border-right-width
:
5px
;
border-left-width
:
5px
}
.dropup
.btn-large
.caret
{
border-top
:
0
;
border-bottom
:
5px
solid
#000
}
.btn-primary
.caret
,
.btn-warning
.caret
,
.btn-danger
.caret
,
.btn-info
.caret
,
.btn-success
.caret
,
.btn-inverse
.caret
{
border-top-color
:
#fff
;
border-bottom-color
:
#fff
;
opacity
:
.75
;
filter
:
alpha
(
opacity
=
75
)}
.alert
{
padding
:
8px
35px
8px
14px
;
margin-bottom
:
18px
;
color
:
#c09853
;
text-shadow
:
0
1px
0
rgba
(
255
,
255
,
255
,
0.5
);
background-color
:
#fcf8e3
;
border
:
1px
solid
#fbeed5
;
-webkit-border-radius
:
4px
;
-moz-border-radius
:
4px
;
border-radius
:
4px
}
.alert-heading
{
color
:
inherit
}
.alert
.close
{
position
:
relative
;
top
:
-2px
;
right
:
-21px
;
line-height
:
18px
}
.alert-success
{
color
:
#468847
;
background-color
:
#dff0d8
;
border-color
:
#d6e9c6
}
.alert-danger
,
.alert-error
{
color
:
#b94a48
;
background-color
:
#f2dede
;
border-color
:
#eed3d7
}
.alert-info
{
color
:
#3a87ad
;
background-color
:
#d9edf7
;
border-color
:
#bce8f1
}
.alert-block
{
padding-top
:
14px
;
padding-bottom
:
14px
}
.alert-block
>
p
,
.alert-block
>
ul
{
margin-bottom
:
0
}
.alert-block
p
+
p
{
margin-top
:
5px
}
.nav
{
margin-bottom
:
18px
;
margin-left
:
0
;
list-style
:
none
}
.nav
>
li
>
a
{
display
:
block
}
.nav
>
li
>
a
:hover
{
text-decoration
:
none
;
background-color
:
#eee
}
.nav
>
.pull-right
{
float
:
right
}
.nav
.nav-header
{
display
:
block
;
padding
:
3px
15px
;
font-size
:
11px
;
font-weight
:
bold
;
line-height
:
18px
;
color
:
#999
;
text-shadow
:
0
1px
0
rgba
(
255
,
255
,
255
,
0.5
);
text-transform
:
uppercase
}
.nav
li
+
.nav-header
{
margin-top
:
9px
}
.nav-list
{
padding-right
:
15px
;
padding-left
:
15px
;
margin-bottom
:
0
}
.nav-list
>
li
>
a
,
.nav-list
.nav-header
{
margin-right
:
-15px
;
margin-left
:
-15px
;
text-shadow
:
0
1px
0
rgba
(
255
,
255
,
255
,
0.5
)}
.nav-list
>
li
>
a
{
padding
:
3px
15px
}
.nav-list
>
.active
>
a
,
.nav-list
>
.active
>
a
:hover
{
color
:
#fff
;
text-shadow
:
0
-1px
0
rgba
(
0
,
0
,
0
,
0.2
);
background-color
:
#08c
}
.nav-list
[
class
^=
"icon-"
]
{
margin-right
:
2px
}
.nav-list
.divider
{
*
width
:
100%
;
height
:
1px
;
margin
:
8px
1px
;
*
margin
:
-5px
0
5px
;
overflow
:
hidden
;
background-color
:
#e5e5e5
;
border-bottom
:
1px
solid
#fff
}
.nav-tabs
,
.nav-pills
{
*
zoom
:
1
}
.nav-tabs
:before
,
.nav-pills
:before
,
.nav-tabs
:after
,
.nav-pills
:after
{
display
:
table
;
content
:
""
}
.nav-tabs
:after
,
.nav-pills
:after
{
clear
:
both
}
.nav-tabs
>
li
,
.nav-pills
>
li
{
float
:
left
}
.nav-tabs
>
li
>
a
,
.nav-pills
>
li
>
a
{
padding-right
:
12px
;
padding-left
:
12px
;
margin-right
:
2px
;
line-height
:
14px
}
.nav-tabs
{
border-bottom
:
1px
solid
#ddd
}
.nav-tabs
>
li
{
margin-bottom
:
-1px
}
.nav-tabs
>
li
>
a
{
padding-top
:
8px
;
padding-bottom
:
8px
;
line-height
:
18px
;
border
:
1px
solid
transparent
;
-webkit-border-radius
:
4px
4px
0
0
;
-moz-border-radius
:
4px
4px
0
0
;
border-radius
:
4px
4px
0
0
}
.nav-tabs
>
li
>
a
:hover
{
border-color
:
#eee
#eee
#ddd
}
.nav-tabs
>
.active
>
a
,
.nav-tabs
>
.active
>
a
:hover
{
color
:
#555
;
cursor
:
default
;
background-color
:
#fff
;
border
:
1px
solid
#ddd
;
border-bottom-color
:
transparent
}
.nav-pills
>
li
>
a
{
padding-top
:
8px
;
padding-bottom
:
8px
;
margin-top
:
2px
;
margin-bottom
:
2px
;
-webkit-border-radius
:
5px
;
-moz-border-radius
:
5px
;
border-radius
:
5px
}
.nav-pills
>
.active
>
a
,
.nav-pills
>
.active
>
a
:hover
{
color
:
#fff
;
background-color
:
#08c
}
.nav-stacked
>
li
{
float
:
none
}
.nav-stacked
>
li
>
a
{
margin-right
:
0
}
.nav-tabs.nav-stacked
{
border-bottom
:
0
}
.nav-tabs.nav-stacked
>
li
>
a
{
border
:
1px
solid
#ddd
;
-webkit-border-radius
:
0
;
-moz-border-radius
:
0
;
border-radius
:
0
}
.nav-tabs.nav-stacked
>
li
:first-child
>
a
{
-webkit-border-radius
:
4px
4px
0
0
;
-moz-border-radius
:
4px
4px
0
0
;
border-radius
:
4px
4px
0
0
}
.nav-tabs.nav-stacked
>
li
:last-child
>
a
{
-webkit-border-radius
:
0
0
4px
4px
;
-moz-border-radius
:
0
0
4px
4px
;
border-radius
:
0
0
4px
4px
}
.nav-tabs.nav-stacked
>
li
>
a
:hover
{
z-index
:
2
;
border-color
:
#ddd
}
.nav-pills.nav-stacked
>
li
>
a
{
margin-bottom
:
3px
}
.nav-pills.nav-stacked
>
li
:last-child
>
a
{
margin-bottom
:
1px
}
.nav-tabs
.dropdown-menu
{
-webkit-border-radius
:
0
0
5px
5px
;
-moz-border-radius
:
0
0
5px
5px
;
border-radius
:
0
0
5px
5px
}
.nav-pills
.dropdown-menu
{
-webkit-border-radius
:
4px
;
-moz-border-radius
:
4px
;
border-radius
:
4px
}
.nav-tabs
.dropdown-toggle
.caret
,
.nav-pills
.dropdown-toggle
.caret
{
margin-top
:
6px
;
border-top-color
:
#08c
;
border-bottom-color
:
#08c
}
.nav-tabs
.dropdown-toggle
:hover
.caret
,
.nav-pills
.dropdown-toggle
:hover
.caret
{
border-top-color
:
#005580
;
border-bottom-color
:
#005580
}
.nav-tabs
.active
.dropdown-toggle
.caret
,
.nav-pills
.active
.dropdown-toggle
.caret
{
border-top-color
:
#333
;
border-bottom-color
:
#333
}
.nav
>
.dropdown.active
>
a
:hover
{
color
:
#000
;
cursor
:
pointer
}
.nav-tabs
.open
.dropdown-toggle
,
.nav-pills
.open
.dropdown-toggle
,
.nav
>
li
.dropdown.open.active
>
a
:hover
{
color
:
#fff
;
background-color
:
#999
;
border-color
:
#999
}
.nav
li
.dropdown.open
.caret
,
.nav
li
.dropdown.open.active
.caret
,
.nav
li
.dropdown.open
a
:hover
.caret
{
border-top-color
:
#fff
;
border-bottom-color
:
#fff
;
opacity
:
1
;
filter
:
alpha
(
opacity
=
100
)}
.tabs-stacked
.open
>
a
:hover
{
border-color
:
#999
}
.tabbable
{
*
zoom
:
1
}
.tabbable
:before
,
.tabbable
:after
{
display
:
table
;
content
:
""
}
.tabbable
:after
{
clear
:
both
}
.tab-content
{
overflow
:
auto
}
.tabs-below
>
.nav-tabs
,
.tabs-right
>
.nav-tabs
,
.tabs-left
>
.nav-tabs
{
border-bottom
:
0
}
.tab-content
>
.tab-pane
,
.pill-content
>
.pill-pane
{
display
:
none
}
.tab-content
>
.active
,
.pill-content
>
.active
{
display
:
block
}
.tabs-below
>
.nav-tabs
{
border-top
:
1px
solid
#ddd
}
.tabs-below
>
.nav-tabs
>
li
{
margin-top
:
-1px
;
margin-bottom
:
0
}
.tabs-below
>
.nav-tabs
>
li
>
a
{
-webkit-border-radius
:
0
0
4px
4px
;
-moz-border-radius
:
0
0
4px
4px
;
border-radius
:
0
0
4px
4px
}
.tabs-below
>
.nav-tabs
>
li
>
a
:hover
{
border-top-color
:
#ddd
;
border-bottom-color
:
transparent
}
.tabs-below
>
.nav-tabs
>
.active
>
a
,
.tabs-below
>
.nav-tabs
>
.active
>
a
:hover
{
border-color
:
transparent
#ddd
#ddd
#ddd
}
.tabs-left
>
.nav-tabs
>
li
,
.tabs-right
>
.nav-tabs
>
li
{
float
:
none
}
.tabs-left
>
.nav-tabs
>
li
>
a
,
.tabs-right
>
.nav-tabs
>
li
>
a
{
min-width
:
74px
;
margin-right
:
0
;
margin-bottom
:
3px
}
.tabs-left
>
.nav-tabs
{
float
:
left
;
margin-right
:
19px
;
border-right
:
1px
solid
#ddd
}
.tabs-left
>
.nav-tabs
>
li
>
a
{
margin-right
:
-1px
;
-webkit-border-radius
:
4px
0
0
4px
;
-moz-border-radius
:
4px
0
0
4px
;
border-radius
:
4px
0
0
4px
}
.tabs-left
>
.nav-tabs
>
li
>
a
:hover
{
border-color
:
#eee
#ddd
#eee
#eee
}
.tabs-left
>
.nav-tabs
.active
>
a
,
.tabs-left
>
.nav-tabs
.active
>
a
:hover
{
border-color
:
#ddd
transparent
#ddd
#ddd
;
*
border-right-color
:
#fff
}
.tabs-right
>
.nav-tabs
{
float
:
right
;
margin-left
:
19px
;
border-left
:
1px
solid
#ddd
}
.tabs-right
>
.nav-tabs
>
li
>
a
{
margin-left
:
-1px
;
-webkit-border-radius
:
0
4px
4px
0
;
-moz-border-radius
:
0
4px
4px
0
;
border-radius
:
0
4px
4px
0
}
.tabs-right
>
.nav-tabs
>
li
>
a
:hover
{
border-color
:
#eee
#eee
#eee
#ddd
}
.tabs-right
>
.nav-tabs
.active
>
a
,
.tabs-right
>
.nav-tabs
.active
>
a
:hover
{
border-color
:
#ddd
#ddd
#ddd
transparent
;
*
border-left-color
:
#fff
}
.navbar
{
*
position
:
relative
;
*
z-index
:
2
;
margin-bottom
:
18px
;
overflow
:
visible
}
.navbar-inner
{
min-height
:
40px
;
padding-right
:
20px
;
padding-left
:
20px
;
background-color
:
#2c2c2c
;
background-image
:
-moz-linear-gradient
(
top
,
#333
,
#222
);
background-image
:
-ms-linear-gradient
(
top
,
#333
,
#222
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#333
),
to
(
#222
));
background-image
:
-webkit-linear-gradient
(
top
,
#333
,
#222
);
background-image
:
-o-linear-gradient
(
top
,
#333
,
#222
);
background-image
:
linear-gradient
(
top
,
#333
,
#222
);
background-repeat
:
repeat-x
;
-webkit-border-radius
:
4px
;
-moz-border-radius
:
4px
;
border-radius
:
4px
;
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
startColorstr
=
'#333333'
,
endColorstr
=
'#222222'
,
GradientType
=
0
);
-webkit-box-shadow
:
0
1px
3px
rgba
(
0
,
0
,
0
,
0.25
),
inset
0
-1px
0
rgba
(
0
,
0
,
0
,
0.1
);
-moz-box-shadow
:
0
1px
3px
rgba
(
0
,
0
,
0
,
0.25
),
inset
0
-1px
0
rgba
(
0
,
0
,
0
,
0.1
);
box-shadow
:
0
1px
3px
rgba
(
0
,
0
,
0
,
0.25
),
inset
0
-1px
0
rgba
(
0
,
0
,
0
,
0.1
)}
.navbar
.container
{
width
:
auto
}
.nav-collapse.collapse
{
height
:
auto
}
.navbar
{
color
:
#999
}
.navbar
.brand
:hover
{
text-decoration
:
none
}
.navbar
.brand
{
display
:
block
;
float
:
left
;
padding
:
8px
20px
12px
;
margin-left
:
-20px
;
font-size
:
20px
;
font-weight
:
200
;
line-height
:
1
;
color
:
#999
}
.navbar
.navbar-text
{
margin-bottom
:
0
;
line-height
:
40px
}
.navbar
.navbar-link
{
color
:
#999
}
.navbar
.navbar-link
:hover
{
color
:
#fff
}
.navbar
.btn
,
.navbar
.btn-group
{
margin-top
:
5px
}
.navbar
.btn-group
.btn
{
margin
:
0
}
.navbar-form
{
margin-bottom
:
0
;
*
zoom
:
1
}
.navbar-form
:before
,
.navbar-form
:after
{
display
:
table
;
content
:
""
}
.navbar-form
:after
{
clear
:
both
}
.navbar-form
input
,
.navbar-form
select
,
.navbar-form
.radio
,
.navbar-form
.checkbox
{
margin-top
:
5px
}
.navbar-form
input
,
.navbar-form
select
{
display
:
inline-block
;
margin-bottom
:
0
}
.navbar-form
input
[
type
=
"image"
],
.navbar-form
input
[
type
=
"checkbox"
],
.navbar-form
input
[
type
=
"radio"
]
{
margin-top
:
3px
}
.navbar-form
.input-append
,
.navbar-form
.input-prepend
{
margin-top
:
6px
;
white-space
:
nowrap
}
.navbar-form
.input-append
input
,
.navbar-form
.input-prepend
input
{
margin-top
:
0
}
.navbar-search
{
position
:
relative
;
float
:
left
;
margin-top
:
6px
;
margin-bottom
:
0
}
.navbar-search
.search-query
{
padding
:
4px
9px
;
font-family
:
"Helvetica Neue"
,
Helvetica
,
Arial
,
sans-serif
;
font-size
:
13px
;
font-weight
:
normal
;
line-height
:
1
;
color
:
#fff
;
background-color
:
#626262
;
border
:
1px
solid
#151515
;
-webkit-box-shadow
:
inset
0
1px
2px
rgba
(
0
,
0
,
0
,
0.1
),
0
1px
0
rgba
(
255
,
255
,
255
,
0.15
);
-moz-box-shadow
:
inset
0
1px
2px
rgba
(
0
,
0
,
0
,
0.1
),
0
1px
0
rgba
(
255
,
255
,
255
,
0.15
);
box-shadow
:
inset
0
1px
2px
rgba
(
0
,
0
,
0
,
0.1
),
0
1px
0
rgba
(
255
,
255
,
255
,
0.15
);
-webkit-transition
:
none
;
-moz-transition
:
none
;
-ms-transition
:
none
;
-o-transition
:
none
;
transition
:
none
}
.navbar-search
.search-query
:-moz-placeholder
{
color
:
#ccc
}
.navbar-search
.search-query
:-ms-input-placeholder
{
color
:
#ccc
}
.navbar-search
.search-query
::-webkit-input-placeholder
{
color
:
#ccc
}
.navbar-search
.search-query
:focus
,
.navbar-search
.search-query.focused
{
padding
:
5px
10px
;
color
:
#333
;
text-shadow
:
0
1px
0
#fff
;
background-color
:
#fff
;
border
:
0
;
outline
:
0
;
-webkit-box-shadow
:
0
0
3px
rgba
(
0
,
0
,
0
,
0.15
);
-moz-box-shadow
:
0
0
3px
rgba
(
0
,
0
,
0
,
0.15
);
box-shadow
:
0
0
3px
rgba
(
0
,
0
,
0
,
0.15
)}
.navbar-fixed-top
,
.navbar-fixed-bottom
{
position
:
fixed
;
right
:
0
;
left
:
0
;
z-index
:
1030
;
margin-bottom
:
0
}
.navbar-fixed-top
.navbar-inner
,
.navbar-fixed-bottom
.navbar-inner
{
padding-right
:
0
;
padding-left
:
0
;
-webkit-border-radius
:
0
;
-moz-border-radius
:
0
;
border-radius
:
0
}
.navbar-fixed-top
.container
,
.navbar-fixed-bottom
.container
{
width
:
940px
}
.navbar-fixed-top
{
top
:
0
}
.navbar-fixed-bottom
{
bottom
:
0
}
.navbar
.nav
{
position
:
relative
;
left
:
0
;
display
:
block
;
float
:
left
;
margin
:
0
10px
0
0
}
.navbar
.nav.pull-right
{
float
:
right
}
.navbar
.nav
>
li
{
display
:
block
;
float
:
left
}
.navbar
.nav
>
li
>
a
{
float
:
none
;
padding
:
9px
10px
11px
;
line-height
:
19px
;
color
:
#999
;
text-decoration
:
none
;
text-shadow
:
0
-1px
0
rgba
(
0
,
0
,
0
,
0.25
)}
.navbar
.btn
{
display
:
inline-block
;
padding
:
4px
10px
4px
;
margin
:
5px
5px
6px
;
line-height
:
18px
}
.navbar
.btn-group
{
padding
:
5px
5px
6px
;
margin
:
0
}
.navbar
.nav
>
li
>
a
:hover
{
color
:
#fff
;
text-decoration
:
none
;
background-color
:
transparent
}
.navbar
.nav
.active
>
a
,
.navbar
.nav
.active
>
a
:hover
{
color
:
#fff
;
text-decoration
:
none
;
background-color
:
#222
}
.navbar
.divider-vertical
{
width
:
1px
;
height
:
40px
;
margin
:
0
9px
;
overflow
:
hidden
;
background-color
:
#222
;
border-right
:
1px
solid
#333
}
.navbar
.nav.pull-right
{
margin-right
:
0
;
margin-left
:
10px
}
.navbar
.btn-navbar
{
display
:
none
;
float
:
right
;
padding
:
7px
10px
;
margin-right
:
5px
;
margin-left
:
5px
;
background-color
:
#2c2c2c
;
*
background-color
:
#222
;
background-image
:
-ms-linear-gradient
(
top
,
#333
,
#222
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#333
),
to
(
#222
));
background-image
:
-webkit-linear-gradient
(
top
,
#333
,
#222
);
background-image
:
-o-linear-gradient
(
top
,
#333
,
#222
);
background-image
:
linear-gradient
(
top
,
#333
,
#222
);
background-image
:
-moz-linear-gradient
(
top
,
#333
,
#222
);
background-repeat
:
repeat-x
;
border-color
:
#222
#222
#000
;
border-color
:
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.25
);
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
startColorstr
=
'#333333'
,
endColorstr
=
'#222222'
,
GradientType
=
0
);
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
enabled
=
false
);
-webkit-box-shadow
:
inset
0
1px
0
rgba
(
255
,
255
,
255
,
0.1
),
0
1px
0
rgba
(
255
,
255
,
255
,
0.075
);
-moz-box-shadow
:
inset
0
1px
0
rgba
(
255
,
255
,
255
,
0.1
),
0
1px
0
rgba
(
255
,
255
,
255
,
0.075
);
box-shadow
:
inset
0
1px
0
rgba
(
255
,
255
,
255
,
0.1
),
0
1px
0
rgba
(
255
,
255
,
255
,
0.075
)}
.navbar
.btn-navbar
:hover
,
.navbar
.btn-navbar
:active
,
.navbar
.btn-navbar.active
,
.navbar
.btn-navbar.disabled
,
.navbar
.btn-navbar
[
disabled
]
{
background-color
:
#222
;
*
background-color
:
#151515
}
.navbar
.btn-navbar
:active
,
.navbar
.btn-navbar.active
{
background-color
:
#080808
\
9
}
.navbar
.btn-navbar
.icon-bar
{
display
:
block
;
width
:
18px
;
height
:
2px
;
background-color
:
#f5f5f5
;
-webkit-border-radius
:
1px
;
-moz-border-radius
:
1px
;
border-radius
:
1px
;
-webkit-box-shadow
:
0
1px
0
rgba
(
0
,
0
,
0
,
0.25
);
-moz-box-shadow
:
0
1px
0
rgba
(
0
,
0
,
0
,
0.25
);
box-shadow
:
0
1px
0
rgba
(
0
,
0
,
0
,
0.25
)}
.btn-navbar
.icon-bar
+
.icon-bar
{
margin-top
:
3px
}
.navbar
.dropdown-menu
:before
{
position
:
absolute
;
top
:
-7px
;
left
:
9px
;
display
:
inline-block
;
border-right
:
7px
solid
transparent
;
border-bottom
:
7px
solid
#ccc
;
border-left
:
7px
solid
transparent
;
border-bottom-color
:
rgba
(
0
,
0
,
0
,
0.2
);
content
:
''
}
.navbar
.dropdown-menu
:after
{
position
:
absolute
;
top
:
-6px
;
left
:
10px
;
display
:
inline-block
;
border-right
:
6px
solid
transparent
;
border-bottom
:
6px
solid
#fff
;
border-left
:
6px
solid
transparent
;
content
:
''
}
.navbar-fixed-bottom
.dropdown-menu
:before
{
top
:
auto
;
bottom
:
-7px
;
border-top
:
7px
solid
#ccc
;
border-bottom
:
0
;
border-top-color
:
rgba
(
0
,
0
,
0
,
0.2
)}
.navbar-fixed-bottom
.dropdown-menu
:after
{
top
:
auto
;
bottom
:
-6px
;
border-top
:
6px
solid
#fff
;
border-bottom
:
0
}
.navbar
.nav
li
.dropdown
.dropdown-toggle
.caret
,
.navbar
.nav
li
.dropdown.open
.caret
{
border-top-color
:
#fff
;
border-bottom-color
:
#fff
}
.navbar
.nav
li
.dropdown.active
.caret
{
opacity
:
1
;
filter
:
alpha
(
opacity
=
100
)}
.navbar
.nav
li
.dropdown.open
>
.dropdown-toggle
,
.navbar
.nav
li
.dropdown.active
>
.dropdown-toggle
,
.navbar
.nav
li
.dropdown.open.active
>
.dropdown-toggle
{
background-color
:
transparent
}
.navbar
.nav
li
.dropdown.active
>
.dropdown-toggle
:hover
{
color
:
#fff
}
.navbar
.pull-right
.dropdown-menu
,
.navbar
.dropdown-menu.pull-right
{
right
:
0
;
left
:
auto
}
.navbar
.pull-right
.dropdown-menu
:before
,
.navbar
.dropdown-menu.pull-right
:before
{
right
:
12px
;
left
:
auto
}
.navbar
.pull-right
.dropdown-menu
:after
,
.navbar
.dropdown-menu.pull-right
:after
{
right
:
13px
;
left
:
auto
}
.breadcrumb
{
padding
:
7px
14px
;
margin
:
0
0
18px
;
list-style
:
none
;
background-color
:
#fbfbfb
;
background-image
:
-moz-linear-gradient
(
top
,
#fff
,
#f5f5f5
);
background-image
:
-ms-linear-gradient
(
top
,
#fff
,
#f5f5f5
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#fff
),
to
(
#f5f5f5
));
background-image
:
-webkit-linear-gradient
(
top
,
#fff
,
#f5f5f5
);
background-image
:
-o-linear-gradient
(
top
,
#fff
,
#f5f5f5
);
background-image
:
linear-gradient
(
top
,
#fff
,
#f5f5f5
);
background-repeat
:
repeat-x
;
border
:
1px
solid
#ddd
;
-webkit-border-radius
:
3px
;
-moz-border-radius
:
3px
;
border-radius
:
3px
;
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
startColorstr
=
'#ffffff'
,
endColorstr
=
'#f5f5f5'
,
GradientType
=
0
);
-webkit-box-shadow
:
inset
0
1px
0
#fff
;
-moz-box-shadow
:
inset
0
1px
0
#fff
;
box-shadow
:
inset
0
1px
0
#fff
}
.breadcrumb
li
{
display
:
inline-block
;
*
display
:
inline
;
text-shadow
:
0
1px
0
#fff
;
*
zoom
:
1
}
.breadcrumb
.divider
{
padding
:
0
5px
;
color
:
#999
}
.breadcrumb
.active
a
{
color
:
#333
}
.pagination
{
height
:
36px
;
margin
:
18px
0
}
.pagination
ul
{
display
:
inline-block
;
*
display
:
inline
;
margin-bottom
:
0
;
margin-left
:
0
;
-webkit-border-radius
:
3px
;
-moz-border-radius
:
3px
;
border-radius
:
3px
;
*
zoom
:
1
;
-webkit-box-shadow
:
0
1px
2px
rgba
(
0
,
0
,
0
,
0.05
);
-moz-box-shadow
:
0
1px
2px
rgba
(
0
,
0
,
0
,
0.05
);
box-shadow
:
0
1px
2px
rgba
(
0
,
0
,
0
,
0.05
)}
.pagination
li
{
display
:
inline
}
.pagination
a
{
float
:
left
;
padding
:
0
14px
;
line-height
:
34px
;
text-decoration
:
none
;
border
:
1px
solid
#ddd
;
border-left-width
:
0
}
.pagination
a
:hover
,
.pagination
.active
a
{
background-color
:
#f5f5f5
}
.pagination
.active
a
{
color
:
#999
;
cursor
:
default
}
.pagination
.disabled
span
,
.pagination
.disabled
a
,
.pagination
.disabled
a
:hover
{
color
:
#999
;
cursor
:
default
;
background-color
:
transparent
}
.pagination
li
:first-child
a
{
border-left-width
:
1px
;
-webkit-border-radius
:
3px
0
0
3px
;
-moz-border-radius
:
3px
0
0
3px
;
border-radius
:
3px
0
0
3px
}
.pagination
li
:last-child
a
{
-webkit-border-radius
:
0
3px
3px
0
;
-moz-border-radius
:
0
3px
3px
0
;
border-radius
:
0
3px
3px
0
}
.pagination-centered
{
text-align
:
center
}
.pagination-right
{
text-align
:
right
}
.pager
{
margin-bottom
:
18px
;
margin-left
:
0
;
text-align
:
center
;
list-style
:
none
;
*
zoom
:
1
}
.pager
:before
,
.pager
:after
{
display
:
table
;
content
:
""
}
.pager
:after
{
clear
:
both
}
.pager
li
{
display
:
inline
}
.pager
a
{
display
:
inline-block
;
padding
:
5px
14px
;
background-color
:
#fff
;
border
:
1px
solid
#ddd
;
-webkit-border-radius
:
15px
;
-moz-border-radius
:
15px
;
border-radius
:
15px
}
.pager
a
:hover
{
text-decoration
:
none
;
background-color
:
#f5f5f5
}
.pager
.next
a
{
float
:
right
}
.pager
.previous
a
{
float
:
left
}
.pager
.disabled
a
,
.pager
.disabled
a
:hover
{
color
:
#999
;
cursor
:
default
;
background-color
:
#fff
}
.modal-open
.dropdown-menu
{
z-index
:
2050
}
.modal-open
.dropdown.open
{
*
z-index
:
2050
}
.modal-open
.popover
{
z-index
:
2060
}
.modal-open
.tooltip
{
z-index
:
2070
}
.modal-backdrop
{
position
:
fixed
;
top
:
0
;
right
:
0
;
bottom
:
0
;
left
:
0
;
z-index
:
1040
;
background-color
:
#000
}
.modal-backdrop.fade
{
opacity
:
0
}
.modal-backdrop
,
.modal-backdrop.fade.in
{
opacity
:
.8
;
filter
:
alpha
(
opacity
=
80
)}
.modal
{
position
:
fixed
;
top
:
50%
;
left
:
50%
;
z-index
:
1050
;
width
:
560px
;
margin
:
-250px
0
0
-280px
;
overflow
:
auto
;
background-color
:
#fff
;
border
:
1px
solid
#999
;
border
:
1px
solid
rgba
(
0
,
0
,
0
,
0.3
);
*
border
:
1px
solid
#999
;
-webkit-border-radius
:
6px
;
-moz-border-radius
:
6px
;
border-radius
:
6px
;
-webkit-box-shadow
:
0
3px
7px
rgba
(
0
,
0
,
0
,
0.3
);
-moz-box-shadow
:
0
3px
7px
rgba
(
0
,
0
,
0
,
0.3
);
box-shadow
:
0
3px
7px
rgba
(
0
,
0
,
0
,
0.3
);
-webkit-background-clip
:
padding-box
;
-moz-background-clip
:
padding-box
;
background-clip
:
padding-box
}
.modal.fade
{
top
:
-25%
;
-webkit-transition
:
opacity
.3s
linear
,
top
.3s
ease-out
;
-moz-transition
:
opacity
.3s
linear
,
top
.3s
ease-out
;
-ms-transition
:
opacity
.3s
linear
,
top
.3s
ease-out
;
-o-transition
:
opacity
.3s
linear
,
top
.3s
ease-out
;
transition
:
opacity
.3s
linear
,
top
.3s
ease-out
}
.modal.fade.in
{
top
:
50%
}
.modal-header
{
padding
:
9px
15px
;
border-bottom
:
1px
solid
#eee
}
.modal-header
.close
{
margin-top
:
2px
}
.modal-body
{
max-height
:
400px
;
padding
:
15px
;
overflow-y
:
auto
}
.modal-form
{
margin-bottom
:
0
}
.modal-footer
{
padding
:
14px
15px
15px
;
margin-bottom
:
0
;
text-align
:
right
;
background-color
:
#f5f5f5
;
border-top
:
1px
solid
#ddd
;
-webkit-border-radius
:
0
0
6px
6px
;
-moz-border-radius
:
0
0
6px
6px
;
border-radius
:
0
0
6px
6px
;
*
zoom
:
1
;
-webkit-box-shadow
:
inset
0
1px
0
#fff
;
-moz-box-shadow
:
inset
0
1px
0
#fff
;
box-shadow
:
inset
0
1px
0
#fff
}
.modal-footer
:before
,
.modal-footer
:after
{
display
:
table
;
content
:
""
}
.modal-footer
:after
{
clear
:
both
}
.modal-footer
.btn
+
.btn
{
margin-bottom
:
0
;
margin-left
:
5px
}
.modal-footer
.btn-group
.btn
+
.btn
{
margin-left
:
-1px
}
.tooltip
{
position
:
absolute
;
z-index
:
1020
;
display
:
block
;
padding
:
5px
;
font-size
:
11px
;
opacity
:
0
;
filter
:
alpha
(
opacity
=
0
);
visibility
:
visible
}
.tooltip.in
{
opacity
:
.8
;
filter
:
alpha
(
opacity
=
80
)}
.tooltip.top
{
margin-top
:
-2px
}
.tooltip.right
{
margin-left
:
2px
}
.tooltip.bottom
{
margin-top
:
2px
}
.tooltip.left
{
margin-left
:
-2px
}
.tooltip.top
.tooltip-arrow
{
bottom
:
0
;
left
:
50%
;
margin-left
:
-5px
;
border-top
:
5px
solid
#000
;
border-right
:
5px
solid
transparent
;
border-left
:
5px
solid
transparent
}
.tooltip.left
.tooltip-arrow
{
top
:
50%
;
right
:
0
;
margin-top
:
-5px
;
border-top
:
5px
solid
transparent
;
border-bottom
:
5px
solid
transparent
;
border-left
:
5px
solid
#000
}
.tooltip.bottom
.tooltip-arrow
{
top
:
0
;
left
:
50%
;
margin-left
:
-5px
;
border-right
:
5px
solid
transparent
;
border-bottom
:
5px
solid
#000
;
border-left
:
5px
solid
transparent
}
.tooltip.right
.tooltip-arrow
{
top
:
50%
;
left
:
0
;
margin-top
:
-5px
;
border-top
:
5px
solid
transparent
;
border-right
:
5px
solid
#000
;
border-bottom
:
5px
solid
transparent
}
.tooltip-inner
{
max-width
:
200px
;
padding
:
3px
8px
;
color
:
#fff
;
text-align
:
center
;
text-decoration
:
none
;
background-color
:
#000
;
-webkit-border-radius
:
4px
;
-moz-border-radius
:
4px
;
border-radius
:
4px
}
.tooltip-arrow
{
position
:
absolute
;
width
:
0
;
height
:
0
}
.popover
{
position
:
absolute
;
top
:
0
;
left
:
0
;
z-index
:
1010
;
display
:
none
;
padding
:
5px
}
.popover.top
{
margin-top
:
-5px
}
.popover.right
{
margin-left
:
5px
}
.popover.bottom
{
margin-top
:
5px
}
.popover.left
{
margin-left
:
-5px
}
.popover.top
.arrow
{
bottom
:
0
;
left
:
50%
;
margin-left
:
-5px
;
border-top
:
5px
solid
#000
;
border-right
:
5px
solid
transparent
;
border-left
:
5px
solid
transparent
}
.popover.right
.arrow
{
top
:
50%
;
left
:
0
;
margin-top
:
-5px
;
border-top
:
5px
solid
transparent
;
border-right
:
5px
solid
#000
;
border-bottom
:
5px
solid
transparent
}
.popover.bottom
.arrow
{
top
:
0
;
left
:
50%
;
margin-left
:
-5px
;
border-right
:
5px
solid
transparent
;
border-bottom
:
5px
solid
#000
;
border-left
:
5px
solid
transparent
}
.popover.left
.arrow
{
top
:
50%
;
right
:
0
;
margin-top
:
-5px
;
border-top
:
5px
solid
transparent
;
border-bottom
:
5px
solid
transparent
;
border-left
:
5px
solid
#000
}
.popover
.arrow
{
position
:
absolute
;
width
:
0
;
height
:
0
}
.popover-inner
{
width
:
280px
;
padding
:
3px
;
overflow
:
hidden
;
background
:
#000
;
background
:
rgba
(
0
,
0
,
0
,
0.8
);
-webkit-border-radius
:
6px
;
-moz-border-radius
:
6px
;
border-radius
:
6px
;
-webkit-box-shadow
:
0
3px
7px
rgba
(
0
,
0
,
0
,
0.3
);
-moz-box-shadow
:
0
3px
7px
rgba
(
0
,
0
,
0
,
0.3
);
box-shadow
:
0
3px
7px
rgba
(
0
,
0
,
0
,
0.3
)}
.popover-title
{
padding
:
9px
15px
;
line-height
:
1
;
background-color
:
#f5f5f5
;
border-bottom
:
1px
solid
#eee
;
-webkit-border-radius
:
3px
3px
0
0
;
-moz-border-radius
:
3px
3px
0
0
;
border-radius
:
3px
3px
0
0
}
.popover-content
{
padding
:
14px
;
background-color
:
#fff
;
-webkit-border-radius
:
0
0
3px
3px
;
-moz-border-radius
:
0
0
3px
3px
;
border-radius
:
0
0
3px
3px
;
-webkit-background-clip
:
padding-box
;
-moz-background-clip
:
padding-box
;
background-clip
:
padding-box
}
.popover-content
p
,
.popover-content
ul
,
.popover-content
ol
{
margin-bottom
:
0
}
.thumbnails
{
margin-left
:
-20px
;
list-style
:
none
;
*
zoom
:
1
}
.thumbnails
:before
,
.thumbnails
:after
{
display
:
table
;
content
:
""
}
.thumbnails
:after
{
clear
:
both
}
.row-fluid
.thumbnails
{
margin-left
:
0
}
.thumbnails
>
li
{
float
:
left
;
margin-bottom
:
18px
;
margin-left
:
20px
}
.thumbnail
{
display
:
block
;
padding
:
4px
;
line-height
:
1
;
border
:
1px
solid
#ddd
;
-webkit-border-radius
:
4px
;
-moz-border-radius
:
4px
;
border-radius
:
4px
;
-webkit-box-shadow
:
0
1px
1px
rgba
(
0
,
0
,
0
,
0.075
);
-moz-box-shadow
:
0
1px
1px
rgba
(
0
,
0
,
0
,
0.075
);
box-shadow
:
0
1px
1px
rgba
(
0
,
0
,
0
,
0.075
)}
a
.thumbnail
:hover
{
border-color
:
#08c
;
-webkit-box-shadow
:
0
1px
4px
rgba
(
0
,
105
,
214
,
0.25
);
-moz-box-shadow
:
0
1px
4px
rgba
(
0
,
105
,
214
,
0.25
);
box-shadow
:
0
1px
4px
rgba
(
0
,
105
,
214
,
0.25
)}
.thumbnail
>
img
{
display
:
block
;
max-width
:
100%
;
margin-right
:
auto
;
margin-left
:
auto
}
.thumbnail
.caption
{
padding
:
9px
}
.label
,
.badge
{
font-size
:
10.998px
;
font-weight
:
bold
;
line-height
:
14px
;
color
:
#fff
;
text-shadow
:
0
-1px
0
rgba
(
0
,
0
,
0
,
0.25
);
white-space
:
nowrap
;
vertical-align
:
baseline
;
background-color
:
#999
}
.label
{
padding
:
1px
4px
2px
;
-webkit-border-radius
:
3px
;
-moz-border-radius
:
3px
;
border-radius
:
3px
}
.badge
{
padding
:
1px
9px
2px
;
-webkit-border-radius
:
9px
;
-moz-border-radius
:
9px
;
border-radius
:
9px
}
a
.label
:hover
,
a
.badge
:hover
{
color
:
#fff
;
text-decoration
:
none
;
cursor
:
pointer
}
.label-important
,
.badge-important
{
background-color
:
#b94a48
}
.label-important
[
href
],
.badge-important
[
href
]
{
background-color
:
#953b39
}
.label-warning
,
.badge-warning
{
background-color
:
#f89406
}
.label-warning
[
href
],
.badge-warning
[
href
]
{
background-color
:
#c67605
}
.label-success
,
.badge-success
{
background-color
:
#468847
}
.label-success
[
href
],
.badge-success
[
href
]
{
background-color
:
#356635
}
.label-info
,
.badge-info
{
background-color
:
#3a87ad
}
.label-info
[
href
],
.badge-info
[
href
]
{
background-color
:
#2d6987
}
.label-inverse
,
.badge-inverse
{
background-color
:
#333
}
.label-inverse
[
href
],
.badge-inverse
[
href
]
{
background-color
:
#1a1a1a
}
@-webkit-keyframes
progress-bar-stripes
{
from
{
background-position
:
40px
0
}
to
{
background-position
:
0
0
}}
@-moz-keyframes
progress-bar-stripes
{
from
{
background-position
:
40px
0
}
to
{
background-position
:
0
0
}}
@-ms-keyframes
progress-bar-stripes
{
from
{
background-position
:
40px
0
}
to
{
background-position
:
0
0
}}
@-o-keyframes
progress-bar-stripes
{
from
{
background-position
:
0
0
}
to
{
background-position
:
40px
0
}}
@keyframes
progress-bar-stripes
{
from
{
background-position
:
40px
0
}
to
{
background-position
:
0
0
}}
.progress
{
height
:
18px
;
margin-bottom
:
18px
;
overflow
:
hidden
;
background-color
:
#f7f7f7
;
background-image
:
-moz-linear-gradient
(
top
,
#f5f5f5
,
#f9f9f9
);
background-image
:
-ms-linear-gradient
(
top
,
#f5f5f5
,
#f9f9f9
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#f5f5f5
),
to
(
#f9f9f9
));
background-image
:
-webkit-linear-gradient
(
top
,
#f5f5f5
,
#f9f9f9
);
background-image
:
-o-linear-gradient
(
top
,
#f5f5f5
,
#f9f9f9
);
background-image
:
linear-gradient
(
top
,
#f5f5f5
,
#f9f9f9
);
background-repeat
:
repeat-x
;
-webkit-border-radius
:
4px
;
-moz-border-radius
:
4px
;
border-radius
:
4px
;
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
startColorstr
=
'#f5f5f5'
,
endColorstr
=
'#f9f9f9'
,
GradientType
=
0
);
-webkit-box-shadow
:
inset
0
1px
2px
rgba
(
0
,
0
,
0
,
0.1
);
-moz-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
{
width
:
0
;
height
:
18px
;
font-size
:
12px
;
color
:
#fff
;
text-align
:
center
;
text-shadow
:
0
-1px
0
rgba
(
0
,
0
,
0
,
0.25
);
background-color
:
#0e90d2
;
background-image
:
-moz-linear-gradient
(
top
,
#149bdf
,
#0480be
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#149bdf
),
to
(
#0480be
));
background-image
:
-webkit-linear-gradient
(
top
,
#149bdf
,
#0480be
);
background-image
:
-o-linear-gradient
(
top
,
#149bdf
,
#0480be
);
background-image
:
linear-gradient
(
top
,
#149bdf
,
#0480be
);
background-image
:
-ms-linear-gradient
(
top
,
#149bdf
,
#0480be
);
background-repeat
:
repeat-x
;
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
startColorstr
=
'#149bdf'
,
endColorstr
=
'#0480be'
,
GradientType
=
0
);
-webkit-box-shadow
:
inset
0
-1px
0
rgba
(
0
,
0
,
0
,
0.15
);
-moz-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-box-sizing
:
border-box
;
-moz-box-sizing
:
border-box
;
-ms-box-sizing
:
border-box
;
box-sizing
:
border-box
;
-webkit-transition
:
width
.6s
ease
;
-moz-transition
:
width
.6s
ease
;
-ms-transition
:
width
.6s
ease
;
-o-transition
:
width
.6s
ease
;
transition
:
width
.6s
ease
}
.progress-striped
.bar
{
background-color
:
#149bdf
;
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
:
-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
:
-moz-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
:
-ms-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
:
-webkit-gradient
(
linear
,
0
100%
,
100%
0
,
color-stop
(
0.25
,
rgba
(
255
,
255
,
255
,
0.15
)),
color-stop
(
0.25
,
transparent
),
color-stop
(
0.5
,
transparent
),
color-stop
(
0.5
,
rgba
(
255
,
255
,
255
,
0.15
)),
color-stop
(
0.75
,
rgba
(
255
,
255
,
255
,
0.15
)),
color-stop
(
0.75
,
transparent
),
to
(
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
);
-webkit-background-size
:
40px
40px
;
-moz-background-size
:
40px
40px
;
-o-background-size
:
40px
40px
;
background-size
:
40px
40px
}
.progress.active
.bar
{
-webkit-animation
:
progress-bar-stripes
2s
linear
infinite
;
-moz-animation
:
progress-bar-stripes
2s
linear
infinite
;
-ms-animation
:
progress-bar-stripes
2s
linear
infinite
;
-o-animation
:
progress-bar-stripes
2s
linear
infinite
;
animation
:
progress-bar-stripes
2s
linear
infinite
}
.progress-danger
.bar
{
background-color
:
#dd514c
;
background-image
:
-moz-linear-gradient
(
top
,
#ee5f5b
,
#c43c35
);
background-image
:
-ms-linear-gradient
(
top
,
#ee5f5b
,
#c43c35
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#ee5f5b
),
to
(
#c43c35
));
background-image
:
-webkit-linear-gradient
(
top
,
#ee5f5b
,
#c43c35
);
background-image
:
-o-linear-gradient
(
top
,
#ee5f5b
,
#c43c35
);
background-image
:
linear-gradient
(
top
,
#ee5f5b
,
#c43c35
);
background-repeat
:
repeat-x
;
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
startColorstr
=
'#ee5f5b'
,
endColorstr
=
'#c43c35'
,
GradientType
=
0
)}
.progress-danger.progress-striped
.bar
{
background-color
:
#ee5f5b
;
background-image
:
-webkit-gradient
(
linear
,
0
100%
,
100%
0
,
color-stop
(
0.25
,
rgba
(
255
,
255
,
255
,
0.15
)),
color-stop
(
0.25
,
transparent
),
color-stop
(
0.5
,
transparent
),
color-stop
(
0.5
,
rgba
(
255
,
255
,
255
,
0.15
)),
color-stop
(
0.75
,
rgba
(
255
,
255
,
255
,
0.15
)),
color-stop
(
0.75
,
transparent
),
to
(
transparent
));
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
:
-moz-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
:
-ms-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-success
.bar
{
background-color
:
#5eb95e
;
background-image
:
-moz-linear-gradient
(
top
,
#62c462
,
#57a957
);
background-image
:
-ms-linear-gradient
(
top
,
#62c462
,
#57a957
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#62c462
),
to
(
#57a957
));
background-image
:
-webkit-linear-gradient
(
top
,
#62c462
,
#57a957
);
background-image
:
-o-linear-gradient
(
top
,
#62c462
,
#57a957
);
background-image
:
linear-gradient
(
top
,
#62c462
,
#57a957
);
background-repeat
:
repeat-x
;
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
startColorstr
=
'#62c462'
,
endColorstr
=
'#57a957'
,
GradientType
=
0
)}
.progress-success.progress-striped
.bar
{
background-color
:
#62c462
;
background-image
:
-webkit-gradient
(
linear
,
0
100%
,
100%
0
,
color-stop
(
0.25
,
rgba
(
255
,
255
,
255
,
0.15
)),
color-stop
(
0.25
,
transparent
),
color-stop
(
0.5
,
transparent
),
color-stop
(
0.5
,
rgba
(
255
,
255
,
255
,
0.15
)),
color-stop
(
0.75
,
rgba
(
255
,
255
,
255
,
0.15
)),
color-stop
(
0.75
,
transparent
),
to
(
transparent
));
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
:
-moz-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
:
-ms-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-info
.bar
{
background-color
:
#4bb1cf
;
background-image
:
-moz-linear-gradient
(
top
,
#5bc0de
,
#339bb9
);
background-image
:
-ms-linear-gradient
(
top
,
#5bc0de
,
#339bb9
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#5bc0de
),
to
(
#339bb9
));
background-image
:
-webkit-linear-gradient
(
top
,
#5bc0de
,
#339bb9
);
background-image
:
-o-linear-gradient
(
top
,
#5bc0de
,
#339bb9
);
background-image
:
linear-gradient
(
top
,
#5bc0de
,
#339bb9
);
background-repeat
:
repeat-x
;
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
startColorstr
=
'#5bc0de'
,
endColorstr
=
'#339bb9'
,
GradientType
=
0
)}
.progress-info.progress-striped
.bar
{
background-color
:
#5bc0de
;
background-image
:
-webkit-gradient
(
linear
,
0
100%
,
100%
0
,
color-stop
(
0.25
,
rgba
(
255
,
255
,
255
,
0.15
)),
color-stop
(
0.25
,
transparent
),
color-stop
(
0.5
,
transparent
),
color-stop
(
0.5
,
rgba
(
255
,
255
,
255
,
0.15
)),
color-stop
(
0.75
,
rgba
(
255
,
255
,
255
,
0.15
)),
color-stop
(
0.75
,
transparent
),
to
(
transparent
));
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
:
-moz-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
:
-ms-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-warning
.bar
{
background-color
:
#faa732
;
background-image
:
-moz-linear-gradient
(
top
,
#fbb450
,
#f89406
);
background-image
:
-ms-linear-gradient
(
top
,
#fbb450
,
#f89406
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#fbb450
),
to
(
#f89406
));
background-image
:
-webkit-linear-gradient
(
top
,
#fbb450
,
#f89406
);
background-image
:
-o-linear-gradient
(
top
,
#fbb450
,
#f89406
);
background-image
:
linear-gradient
(
top
,
#fbb450
,
#f89406
);
background-repeat
:
repeat-x
;
filter
:
progid
:
dximagetransform
.
microsoft
.
gradient
(
startColorstr
=
'#fbb450'
,
endColorstr
=
'#f89406'
,
GradientType
=
0
)}
.progress-warning.progress-striped
.bar
{
background-color
:
#fbb450
;
background-image
:
-webkit-gradient
(
linear
,
0
100%
,
100%
0
,
color-stop
(
0.25
,
rgba
(
255
,
255
,
255
,
0.15
)),
color-stop
(
0.25
,
transparent
),
color-stop
(
0.5
,
transparent
),
color-stop
(
0.5
,
rgba
(
255
,
255
,
255
,
0.15
)),
color-stop
(
0.75
,
rgba
(
255
,
255
,
255
,
0.15
)),
color-stop
(
0.75
,
transparent
),
to
(
transparent
));
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
:
-moz-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
:
-ms-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
)}
.accordion
{
margin-bottom
:
18px
}
.accordion-group
{
margin-bottom
:
2px
;
border
:
1px
solid
#e5e5e5
;
-webkit-border-radius
:
4px
;
-moz-border-radius
:
4px
;
border-radius
:
4px
}
.accordion-heading
{
border-bottom
:
0
}
.accordion-heading
.accordion-toggle
{
display
:
block
;
padding
:
8px
15px
}
.accordion-toggle
{
cursor
:
pointer
}
.accordion-inner
{
padding
:
9px
15px
;
border-top
:
1px
solid
#e5e5e5
}
.carousel
{
position
:
relative
;
margin-bottom
:
18px
;
line-height
:
1
}
.carousel-inner
{
position
:
relative
;
width
:
100%
;
overflow
:
hidden
}
.carousel
.item
{
position
:
relative
;
display
:
none
;
-webkit-transition
:
.6s
ease-in-out
left
;
-moz-transition
:
.6s
ease-in-out
left
;
-ms-transition
:
.6s
ease-in-out
left
;
-o-transition
:
.6s
ease-in-out
left
;
transition
:
.6s
ease-in-out
left
}
.carousel
.item
>
img
{
display
:
block
;
line-height
:
1
}
.carousel
.active
,
.carousel
.next
,
.carousel
.prev
{
display
:
block
}
.carousel
.active
{
left
:
0
}
.carousel
.next
,
.carousel
.prev
{
position
:
absolute
;
top
:
0
;
width
:
100%
}
.carousel
.next
{
left
:
100%
}
.carousel
.prev
{
left
:
-100%
}
.carousel
.next.left
,
.carousel
.prev.right
{
left
:
0
}
.carousel
.active.left
{
left
:
-100%
}
.carousel
.active.right
{
left
:
100%
}
.carousel-control
{
position
:
absolute
;
top
:
40%
;
left
:
15px
;
width
:
40px
;
height
:
40px
;
margin-top
:
-20px
;
font-size
:
60px
;
font-weight
:
100
;
line-height
:
30px
;
color
:
#fff
;
text-align
:
center
;
background
:
#222
;
border
:
3px
solid
#fff
;
-webkit-border-radius
:
23px
;
-moz-border-radius
:
23px
;
border-radius
:
23px
;
opacity
:
.5
;
filter
:
alpha
(
opacity
=
50
)}
.carousel-control.right
{
right
:
15px
;
left
:
auto
}
.carousel-control
:hover
{
color
:
#fff
;
text-decoration
:
none
;
opacity
:
.9
;
filter
:
alpha
(
opacity
=
90
)}
.carousel-caption
{
position
:
absolute
;
right
:
0
;
bottom
:
0
;
left
:
0
;
padding
:
10px
15px
5px
;
background
:
#333
;
background
:
rgba
(
0
,
0
,
0
,
0.75
)}
.carousel-caption
h4
,
.carousel-caption
p
{
color
:
#fff
}
.hero-unit
{
padding
:
60px
;
margin-bottom
:
30px
;
background-color
:
#eee
;
-webkit-border-radius
:
6px
;
-moz-border-radius
:
6px
;
border-radius
:
6px
}
.hero-unit
h1
{
margin-bottom
:
0
;
font-size
:
60px
;
line-height
:
1
;
letter-spacing
:
-1px
;
color
:
inherit
}
.hero-unit
p
{
font-size
:
18px
;
font-weight
:
200
;
line-height
:
27px
;
color
:
inherit
}
.pull-right
{
float
:
right
}
.pull-left
{
float
:
left
}
.hide
{
display
:
none
}
.show
{
display
:
block
}
.invisible
{
visibility
:
hidden
}
input
.field-error
,
textarea
.field-error
{
border
:
1px
solid
#B94A48
;
}
\ No newline at end of file
spring-boot-samples/spring-boot-sample-web-thymeleaf3/src/main/resources/static/favicon.ico
0 → 100644
View file @
db83e899
2.79 KB
spring-boot-samples/spring-boot-sample-web-thymeleaf3/src/main/resources/static/js/jquery-1.7.2.js
0 → 100644
View file @
db83e899
This source diff could not be displayed because it is too large. You can
view the blob
instead.
spring-boot-samples/spring-boot-sample-web-thymeleaf3/src/main/resources/static/js/jquery.validate.js
0 → 100644
View file @
db83e899
/**
* jQuery Validation Plugin @VERSION
*
* http://bassistance.de/jquery-plugins/jquery-plugin-validation/
* http://docs.jquery.com/Plugins/Validation
*
* Copyright (c) 2012 Jörn Zaefferer
*
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*/
(
function
(
$
)
{
$
.
extend
(
$
.
fn
,
{
// http://docs.jquery.com/Plugins/Validation/validate
validate
:
function
(
options
)
{
// if nothing is selected, return nothing; can't chain anyway
if
(
!
this
.
length
)
{
if
(
options
&&
options
.
debug
&&
window
.
console
)
{
console
.
warn
(
"nothing selected, can't validate, returning nothing"
);
}
return
;
}
// check if a validator for this form was already created
var
validator
=
$
.
data
(
this
[
0
],
'validator'
);
if
(
validator
)
{
return
validator
;
}
// Add novalidate tag if HTML5.
this
.
attr
(
'novalidate'
,
'novalidate'
);
validator
=
new
$
.
validator
(
options
,
this
[
0
]
);
$
.
data
(
this
[
0
],
'validator'
,
validator
);
if
(
validator
.
settings
.
onsubmit
)
{
this
.
validateDelegate
(
":submit"
,
"click"
,
function
(
ev
)
{
if
(
validator
.
settings
.
submitHandler
)
{
validator
.
submitButton
=
ev
.
target
;
}
// allow suppressing validation by adding a cancel class to the submit button
if
(
$
(
ev
.
target
).
hasClass
(
'cancel'
)
)
{
validator
.
cancelSubmit
=
true
;
}
});
// validate the form on submit
this
.
submit
(
function
(
event
)
{
if
(
validator
.
settings
.
debug
)
{
// prevent form submit to be able to see console output
event
.
preventDefault
();
}
function
handle
()
{
var
hidden
;
if
(
validator
.
settings
.
submitHandler
)
{
if
(
validator
.
submitButton
)
{
// insert a hidden input as a replacement for the missing submit button
hidden
=
$
(
"<input type='hidden'/>"
).
attr
(
"name"
,
validator
.
submitButton
.
name
).
val
(
validator
.
submitButton
.
value
).
appendTo
(
validator
.
currentForm
);
}
validator
.
settings
.
submitHandler
.
call
(
validator
,
validator
.
currentForm
,
event
);
if
(
validator
.
submitButton
)
{
// and clean up afterwards; thanks to no-block-scope, hidden can be referenced
hidden
.
remove
();
}
return
false
;
}
return
true
;
}
// prevent submit for invalid forms or custom submit handlers
if
(
validator
.
cancelSubmit
)
{
validator
.
cancelSubmit
=
false
;
return
handle
();
}
if
(
validator
.
form
()
)
{
if
(
validator
.
pendingRequest
)
{
validator
.
formSubmitted
=
true
;
return
false
;
}
return
handle
();
}
else
{
validator
.
focusInvalid
();
return
false
;
}
});
}
return
validator
;
},
// http://docs.jquery.com/Plugins/Validation/valid
valid
:
function
()
{
if
(
$
(
this
[
0
]).
is
(
'form'
))
{
return
this
.
validate
().
form
();
}
else
{
var
valid
=
true
;
var
validator
=
$
(
this
[
0
].
form
).
validate
();
this
.
each
(
function
()
{
valid
&=
validator
.
element
(
this
);
});
return
valid
;
}
},
// attributes: space seperated list of attributes to retrieve and remove
removeAttrs
:
function
(
attributes
)
{
var
result
=
{},
$element
=
this
;
$
.
each
(
attributes
.
split
(
/
\s
/
),
function
(
index
,
value
)
{
result
[
value
]
=
$element
.
attr
(
value
);
$element
.
removeAttr
(
value
);
});
return
result
;
},
// http://docs.jquery.com/Plugins/Validation/rules
rules
:
function
(
command
,
argument
)
{
var
element
=
this
[
0
];
if
(
command
)
{
var
settings
=
$
.
data
(
element
.
form
,
'validator'
).
settings
;
var
staticRules
=
settings
.
rules
;
var
existingRules
=
$
.
validator
.
staticRules
(
element
);
switch
(
command
)
{
case
"add"
:
$
.
extend
(
existingRules
,
$
.
validator
.
normalizeRule
(
argument
));
staticRules
[
element
.
name
]
=
existingRules
;
if
(
argument
.
messages
)
{
settings
.
messages
[
element
.
name
]
=
$
.
extend
(
settings
.
messages
[
element
.
name
],
argument
.
messages
);
}
break
;
case
"remove"
:
if
(
!
argument
)
{
delete
staticRules
[
element
.
name
];
return
existingRules
;
}
var
filtered
=
{};
$
.
each
(
argument
.
split
(
/
\s
/
),
function
(
index
,
method
)
{
filtered
[
method
]
=
existingRules
[
method
];
delete
existingRules
[
method
];
});
return
filtered
;
}
}
var
data
=
$
.
validator
.
normalizeRules
(
$
.
extend
(
{},
$
.
validator
.
metadataRules
(
element
),
$
.
validator
.
classRules
(
element
),
$
.
validator
.
attributeRules
(
element
),
$
.
validator
.
staticRules
(
element
)
),
element
);
// make sure required is at front
if
(
data
.
required
)
{
var
param
=
data
.
required
;
delete
data
.
required
;
data
=
$
.
extend
({
required
:
param
},
data
);
}
return
data
;
}
});
// Custom selectors
$
.
extend
(
$
.
expr
[
":"
],
{
// http://docs.jquery.com/Plugins/Validation/blank
blank
:
function
(
a
)
{
return
!
$
.
trim
(
""
+
a
.
value
);},
// http://docs.jquery.com/Plugins/Validation/filled
filled
:
function
(
a
)
{
return
!!
$
.
trim
(
""
+
a
.
value
);},
// http://docs.jquery.com/Plugins/Validation/unchecked
unchecked
:
function
(
a
)
{
return
!
a
.
checked
;}
});
// constructor for validator
$
.
validator
=
function
(
options
,
form
)
{
this
.
settings
=
$
.
extend
(
true
,
{},
$
.
validator
.
defaults
,
options
);
this
.
currentForm
=
form
;
this
.
init
();
};
$
.
validator
.
format
=
function
(
source
,
params
)
{
if
(
arguments
.
length
===
1
)
{
return
function
()
{
var
args
=
$
.
makeArray
(
arguments
);
args
.
unshift
(
source
);
return
$
.
validator
.
format
.
apply
(
this
,
args
);
};
}
if
(
arguments
.
length
>
2
&&
params
.
constructor
!==
Array
)
{
params
=
$
.
makeArray
(
arguments
).
slice
(
1
);
}
if
(
params
.
constructor
!==
Array
)
{
params
=
[
params
];
}
$
.
each
(
params
,
function
(
i
,
n
)
{
source
=
source
.
replace
(
new
RegExp
(
"
\\
{"
+
i
+
"
\\
}"
,
"g"
),
n
);
});
return
source
;
};
$
.
extend
(
$
.
validator
,
{
defaults
:
{
messages
:
{},
groups
:
{},
rules
:
{},
errorClass
:
"error"
,
validClass
:
"valid"
,
errorElement
:
"label"
,
focusInvalid
:
true
,
errorContainer
:
$
(
[]
),
errorLabelContainer
:
$
(
[]
),
onsubmit
:
true
,
ignore
:
":hidden"
,
ignoreTitle
:
false
,
onfocusin
:
function
(
element
,
event
)
{
this
.
lastActive
=
element
;
// hide error label and remove error class on focus if enabled
if
(
this
.
settings
.
focusCleanup
&&
!
this
.
blockFocusCleanup
)
{
if
(
this
.
settings
.
unhighlight
)
{
this
.
settings
.
unhighlight
.
call
(
this
,
element
,
this
.
settings
.
errorClass
,
this
.
settings
.
validClass
);
}
this
.
addWrapper
(
this
.
errorsFor
(
element
)).
hide
();
}
},
onfocusout
:
function
(
element
,
event
)
{
if
(
!
this
.
checkable
(
element
)
&&
(
element
.
name
in
this
.
submitted
||
!
this
.
optional
(
element
))
)
{
this
.
element
(
element
);
}
},
onkeyup
:
function
(
element
,
event
)
{
if
(
element
.
name
in
this
.
submitted
||
element
===
this
.
lastElement
)
{
this
.
element
(
element
);
}
},
onclick
:
function
(
element
,
event
)
{
// click on selects, radiobuttons and checkboxes
if
(
element
.
name
in
this
.
submitted
)
{
this
.
element
(
element
);
}
// or option elements, check parent select in that case
else
if
(
element
.
parentNode
.
name
in
this
.
submitted
)
{
this
.
element
(
element
.
parentNode
);
}
},
highlight
:
function
(
element
,
errorClass
,
validClass
)
{
if
(
element
.
type
===
'radio'
)
{
this
.
findByName
(
element
.
name
).
addClass
(
errorClass
).
removeClass
(
validClass
);
}
else
{
$
(
element
).
addClass
(
errorClass
).
removeClass
(
validClass
);
}
},
unhighlight
:
function
(
element
,
errorClass
,
validClass
)
{
if
(
element
.
type
===
'radio'
)
{
this
.
findByName
(
element
.
name
).
removeClass
(
errorClass
).
addClass
(
validClass
);
}
else
{
$
(
element
).
removeClass
(
errorClass
).
addClass
(
validClass
);
}
}
},
// http://docs.jquery.com/Plugins/Validation/Validator/setDefaults
setDefaults
:
function
(
settings
)
{
$
.
extend
(
$
.
validator
.
defaults
,
settings
);
},
messages
:
{
required
:
"This field is required."
,
remote
:
"Please fix this field."
,
email
:
"Please enter a valid email address."
,
url
:
"Please enter a valid URL."
,
date
:
"Please enter a valid date."
,
dateISO
:
"Please enter a valid date (ISO)."
,
number
:
"Please enter a valid number."
,
digits
:
"Please enter only digits."
,
creditcard
:
"Please enter a valid credit card number."
,
equalTo
:
"Please enter the same value again."
,
accept
:
"Please enter a value with a valid extension."
,
maxlength
:
$
.
validator
.
format
(
"Please enter no more than {0} characters."
),
minlength
:
$
.
validator
.
format
(
"Please enter at least {0} characters."
),
rangelength
:
$
.
validator
.
format
(
"Please enter a value between {0} and {1} characters long."
),
range
:
$
.
validator
.
format
(
"Please enter a value between {0} and {1}."
),
max
:
$
.
validator
.
format
(
"Please enter a value less than or equal to {0}."
),
min
:
$
.
validator
.
format
(
"Please enter a value greater than or equal to {0}."
)
},
autoCreateRanges
:
false
,
prototype
:
{
init
:
function
()
{
this
.
labelContainer
=
$
(
this
.
settings
.
errorLabelContainer
);
this
.
errorContext
=
this
.
labelContainer
.
length
&&
this
.
labelContainer
||
$
(
this
.
currentForm
);
this
.
containers
=
$
(
this
.
settings
.
errorContainer
).
add
(
this
.
settings
.
errorLabelContainer
);
this
.
submitted
=
{};
this
.
valueCache
=
{};
this
.
pendingRequest
=
0
;
this
.
pending
=
{};
this
.
invalid
=
{};
this
.
reset
();
var
groups
=
(
this
.
groups
=
{});
$
.
each
(
this
.
settings
.
groups
,
function
(
key
,
value
)
{
$
.
each
(
value
.
split
(
/
\s
/
),
function
(
index
,
name
)
{
groups
[
name
]
=
key
;
});
});
var
rules
=
this
.
settings
.
rules
;
$
.
each
(
rules
,
function
(
key
,
value
)
{
rules
[
key
]
=
$
.
validator
.
normalizeRule
(
value
);
});
function
delegate
(
event
)
{
var
validator
=
$
.
data
(
this
[
0
].
form
,
"validator"
),
eventType
=
"on"
+
event
.
type
.
replace
(
/^validate/
,
""
);
if
(
validator
.
settings
[
eventType
])
{
validator
.
settings
[
eventType
].
call
(
validator
,
this
[
0
],
event
);
}
}
$
(
this
.
currentForm
)
.
validateDelegate
(
"[type='text'], [type='password'], [type='file'], select, textarea, "
+
"[type='number'], [type='search'] ,[type='tel'], [type='url'], "
+
"[type='email'], [type='datetime'], [type='date'], [type='month'], "
+
"[type='week'], [type='time'], [type='datetime-local'], "
+
"[type='range'], [type='color'] "
,
"focusin focusout keyup"
,
delegate
)
.
validateDelegate
(
"[type='radio'], [type='checkbox'], select, option"
,
"click"
,
delegate
);
if
(
this
.
settings
.
invalidHandler
)
{
$
(
this
.
currentForm
).
bind
(
"invalid-form.validate"
,
this
.
settings
.
invalidHandler
);
}
},
// http://docs.jquery.com/Plugins/Validation/Validator/form
form
:
function
()
{
this
.
checkForm
();
$
.
extend
(
this
.
submitted
,
this
.
errorMap
);
this
.
invalid
=
$
.
extend
({},
this
.
errorMap
);
if
(
!
this
.
valid
())
{
$
(
this
.
currentForm
).
triggerHandler
(
"invalid-form"
,
[
this
]);
}
this
.
showErrors
();
return
this
.
valid
();
},
checkForm
:
function
()
{
this
.
prepareForm
();
for
(
var
i
=
0
,
elements
=
(
this
.
currentElements
=
this
.
elements
());
elements
[
i
];
i
++
)
{
this
.
check
(
elements
[
i
]
);
}
return
this
.
valid
();
},
// http://docs.jquery.com/Plugins/Validation/Validator/element
element
:
function
(
element
)
{
element
=
this
.
validationTargetFor
(
this
.
clean
(
element
)
);
this
.
lastElement
=
element
;
this
.
prepareElement
(
element
);
this
.
currentElements
=
$
(
element
);
var
result
=
this
.
check
(
element
)
!==
false
;
if
(
result
)
{
delete
this
.
invalid
[
element
.
name
];
}
else
{
this
.
invalid
[
element
.
name
]
=
true
;
}
if
(
!
this
.
numberOfInvalids
()
)
{
// Hide error containers on last error
this
.
toHide
=
this
.
toHide
.
add
(
this
.
containers
);
}
this
.
showErrors
();
return
result
;
},
// http://docs.jquery.com/Plugins/Validation/Validator/showErrors
showErrors
:
function
(
errors
)
{
if
(
errors
)
{
// add items to error list and map
$
.
extend
(
this
.
errorMap
,
errors
);
this
.
errorList
=
[];
for
(
var
name
in
errors
)
{
this
.
errorList
.
push
({
message
:
errors
[
name
],
element
:
this
.
findByName
(
name
)[
0
]
});
}
// remove items from success list
this
.
successList
=
$
.
grep
(
this
.
successList
,
function
(
element
)
{
return
!
(
element
.
name
in
errors
);
});
}
if
(
this
.
settings
.
showErrors
)
{
this
.
settings
.
showErrors
.
call
(
this
,
this
.
errorMap
,
this
.
errorList
);
}
else
{
this
.
defaultShowErrors
();
}
},
// http://docs.jquery.com/Plugins/Validation/Validator/resetForm
resetForm
:
function
()
{
if
(
$
.
fn
.
resetForm
)
{
$
(
this
.
currentForm
).
resetForm
();
}
this
.
submitted
=
{};
this
.
lastElement
=
null
;
this
.
prepareForm
();
this
.
hideErrors
();
this
.
elements
().
removeClass
(
this
.
settings
.
errorClass
);
},
numberOfInvalids
:
function
()
{
return
this
.
objectLength
(
this
.
invalid
);
},
objectLength
:
function
(
obj
)
{
var
count
=
0
;
for
(
var
i
in
obj
)
{
count
++
;
}
return
count
;
},
hideErrors
:
function
()
{
this
.
addWrapper
(
this
.
toHide
).
hide
();
},
valid
:
function
()
{
return
this
.
size
()
===
0
;
},
size
:
function
()
{
return
this
.
errorList
.
length
;
},
focusInvalid
:
function
()
{
if
(
this
.
settings
.
focusInvalid
)
{
try
{
$
(
this
.
findLastActive
()
||
this
.
errorList
.
length
&&
this
.
errorList
[
0
].
element
||
[])
.
filter
(
":visible"
)
.
focus
()
// manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
.
trigger
(
"focusin"
);
}
catch
(
e
)
{
// ignore IE throwing errors when focusing hidden elements
}
}
},
findLastActive
:
function
()
{
var
lastActive
=
this
.
lastActive
;
return
lastActive
&&
$
.
grep
(
this
.
errorList
,
function
(
n
)
{
return
n
.
element
.
name
===
lastActive
.
name
;
}).
length
===
1
&&
lastActive
;
},
elements
:
function
()
{
var
validator
=
this
,
rulesCache
=
{};
// select all valid inputs inside the form (no submit or reset buttons)
return
$
(
this
.
currentForm
)
.
find
(
"input, select, textarea"
)
.
not
(
":submit, :reset, :image, [disabled]"
)
.
not
(
this
.
settings
.
ignore
)
.
filter
(
function
()
{
if
(
!
this
.
name
&&
validator
.
settings
.
debug
&&
window
.
console
)
{
console
.
error
(
"%o has no name assigned"
,
this
);
}
// select only the first element for each name, and only those with rules specified
if
(
this
.
name
in
rulesCache
||
!
validator
.
objectLength
(
$
(
this
).
rules
())
)
{
return
false
;
}
rulesCache
[
this
.
name
]
=
true
;
return
true
;
});
},
clean
:
function
(
selector
)
{
return
$
(
selector
)[
0
];
},
errors
:
function
()
{
var
errorClass
=
this
.
settings
.
errorClass
.
replace
(
' '
,
'.'
);
return
$
(
this
.
settings
.
errorElement
+
"."
+
errorClass
,
this
.
errorContext
);
},
reset
:
function
()
{
this
.
successList
=
[];
this
.
errorList
=
[];
this
.
errorMap
=
{};
this
.
toShow
=
$
([]);
this
.
toHide
=
$
([]);
this
.
currentElements
=
$
([]);
},
prepareForm
:
function
()
{
this
.
reset
();
this
.
toHide
=
this
.
errors
().
add
(
this
.
containers
);
},
prepareElement
:
function
(
element
)
{
this
.
reset
();
this
.
toHide
=
this
.
errorsFor
(
element
);
},
elementValue
:
function
(
element
)
{
var
val
=
$
(
element
).
val
();
if
(
typeof
val
===
'string'
)
{
return
val
.
replace
(
/
\r
/g
,
""
);
}
return
val
;
},
check
:
function
(
element
)
{
element
=
this
.
validationTargetFor
(
this
.
clean
(
element
)
);
var
rules
=
$
(
element
).
rules
();
var
dependencyMismatch
=
false
;
var
val
=
this
.
elementValue
(
element
);
var
result
;
for
(
var
method
in
rules
)
{
var
rule
=
{
method
:
method
,
parameters
:
rules
[
method
]
};
try
{
result
=
$
.
validator
.
methods
[
method
].
call
(
this
,
val
,
element
,
rule
.
parameters
);
// if a method indicates that the field is optional and therefore valid,
// don't mark it as valid when there are no other rules
if
(
result
===
"dependency-mismatch"
)
{
dependencyMismatch
=
true
;
continue
;
}
dependencyMismatch
=
false
;
if
(
result
===
"pending"
)
{
this
.
toHide
=
this
.
toHide
.
not
(
this
.
errorsFor
(
element
)
);
return
;
}
if
(
!
result
)
{
this
.
formatAndAdd
(
element
,
rule
);
return
false
;
}
}
catch
(
e
)
{
if
(
this
.
settings
.
debug
&&
window
.
console
)
{
console
.
log
(
"exception occured when checking element "
+
element
.
id
+
", check the '"
+
rule
.
method
+
"' method"
,
e
);
}
throw
e
;
}
}
if
(
dependencyMismatch
)
{
return
;
}
if
(
this
.
objectLength
(
rules
)
)
{
this
.
successList
.
push
(
element
);
}
return
true
;
},
// return the custom message for the given element and validation method
// specified in the element's "messages" metadata
customMetaMessage
:
function
(
element
,
method
)
{
if
(
!
$
.
metadata
)
{
return
;
}
var
meta
=
this
.
settings
.
meta
?
$
(
element
).
metadata
()[
this
.
settings
.
meta
]
:
$
(
element
).
metadata
();
return
meta
&&
meta
.
messages
&&
meta
.
messages
[
method
];
},
// return the custom message for the given element name and validation method
customMessage
:
function
(
name
,
method
)
{
var
m
=
this
.
settings
.
messages
[
name
];
return
m
&&
(
m
.
constructor
===
String
?
m
:
m
[
method
]);
},
// return the first defined argument, allowing empty strings
findDefined
:
function
()
{
for
(
var
i
=
0
;
i
<
arguments
.
length
;
i
++
)
{
if
(
arguments
[
i
]
!==
undefined
)
{
return
arguments
[
i
];
}
}
return
undefined
;
},
defaultMessage
:
function
(
element
,
method
)
{
return
this
.
findDefined
(
this
.
customMessage
(
element
.
name
,
method
),
this
.
customMetaMessage
(
element
,
method
),
// title is never undefined, so handle empty string as undefined
!
this
.
settings
.
ignoreTitle
&&
element
.
title
||
undefined
,
$
.
validator
.
messages
[
method
],
"<strong>Warning: No message defined for "
+
element
.
name
+
"</strong>"
);
},
formatAndAdd
:
function
(
element
,
rule
)
{
var
message
=
this
.
defaultMessage
(
element
,
rule
.
method
),
theregex
=
/
\$?\{(\d
+
)\}
/g
;
if
(
typeof
message
===
"function"
)
{
message
=
message
.
call
(
this
,
rule
.
parameters
,
element
);
}
else
if
(
theregex
.
test
(
message
))
{
message
=
$
.
validator
.
format
(
message
.
replace
(
theregex
,
'{$1}'
),
rule
.
parameters
);
}
this
.
errorList
.
push
({
message
:
message
,
element
:
element
});
this
.
errorMap
[
element
.
name
]
=
message
;
this
.
submitted
[
element
.
name
]
=
message
;
},
addWrapper
:
function
(
toToggle
)
{
if
(
this
.
settings
.
wrapper
)
{
toToggle
=
toToggle
.
add
(
toToggle
.
parent
(
this
.
settings
.
wrapper
)
);
}
return
toToggle
;
},
defaultShowErrors
:
function
()
{
var
i
,
elements
;
for
(
i
=
0
;
this
.
errorList
[
i
];
i
++
)
{
var
error
=
this
.
errorList
[
i
];
if
(
this
.
settings
.
highlight
)
{
this
.
settings
.
highlight
.
call
(
this
,
error
.
element
,
this
.
settings
.
errorClass
,
this
.
settings
.
validClass
);
}
this
.
showLabel
(
error
.
element
,
error
.
message
);
}
if
(
this
.
errorList
.
length
)
{
this
.
toShow
=
this
.
toShow
.
add
(
this
.
containers
);
}
if
(
this
.
settings
.
success
)
{
for
(
i
=
0
;
this
.
successList
[
i
];
i
++
)
{
this
.
showLabel
(
this
.
successList
[
i
]
);
}
}
if
(
this
.
settings
.
unhighlight
)
{
for
(
i
=
0
,
elements
=
this
.
validElements
();
elements
[
i
];
i
++
)
{
this
.
settings
.
unhighlight
.
call
(
this
,
elements
[
i
],
this
.
settings
.
errorClass
,
this
.
settings
.
validClass
);
}
}
this
.
toHide
=
this
.
toHide
.
not
(
this
.
toShow
);
this
.
hideErrors
();
this
.
addWrapper
(
this
.
toShow
).
show
();
},
validElements
:
function
()
{
return
this
.
currentElements
.
not
(
this
.
invalidElements
());
},
invalidElements
:
function
()
{
return
$
(
this
.
errorList
).
map
(
function
()
{
return
this
.
element
;
});
},
showLabel
:
function
(
element
,
message
)
{
var
label
=
this
.
errorsFor
(
element
);
if
(
label
.
length
)
{
// refresh error/success class
label
.
removeClass
(
this
.
settings
.
validClass
).
addClass
(
this
.
settings
.
errorClass
);
// check if we have a generated label, replace the message then
if
(
label
.
attr
(
"generated"
)
)
{
label
.
html
(
message
);
}
}
else
{
// create label
label
=
$
(
"<"
+
this
.
settings
.
errorElement
+
"/>"
)
.
attr
({
"for"
:
this
.
idOrName
(
element
),
generated
:
true
})
.
addClass
(
this
.
settings
.
errorClass
)
.
html
(
message
||
""
);
if
(
this
.
settings
.
wrapper
)
{
// make sure the element is visible, even in IE
// actually showing the wrapped element is handled elsewhere
label
=
label
.
hide
().
show
().
wrap
(
"<"
+
this
.
settings
.
wrapper
+
"/>"
).
parent
();
}
if
(
!
this
.
labelContainer
.
append
(
label
).
length
)
{
if
(
this
.
settings
.
errorPlacement
)
{
this
.
settings
.
errorPlacement
(
label
,
$
(
element
)
);
}
else
{
label
.
insertAfter
(
element
);
}
}
}
if
(
!
message
&&
this
.
settings
.
success
)
{
label
.
text
(
""
);
if
(
typeof
this
.
settings
.
success
===
"string"
)
{
label
.
addClass
(
this
.
settings
.
success
);
}
else
{
this
.
settings
.
success
(
label
);
}
}
this
.
toShow
=
this
.
toShow
.
add
(
label
);
},
errorsFor
:
function
(
element
)
{
var
name
=
this
.
idOrName
(
element
);
return
this
.
errors
().
filter
(
function
()
{
return
$
(
this
).
attr
(
'for'
)
===
name
;
});
},
idOrName
:
function
(
element
)
{
return
this
.
groups
[
element
.
name
]
||
(
this
.
checkable
(
element
)
?
element
.
name
:
element
.
id
||
element
.
name
);
},
validationTargetFor
:
function
(
element
)
{
// if radio/checkbox, validate first element in group instead
if
(
this
.
checkable
(
element
))
{
element
=
this
.
findByName
(
element
.
name
).
not
(
this
.
settings
.
ignore
)[
0
];
}
return
element
;
},
checkable
:
function
(
element
)
{
return
(
/radio|checkbox/i
).
test
(
element
.
type
);
},
findByName
:
function
(
name
)
{
// select by name and filter by form for performance over form.find("[name=...]")
var
form
=
this
.
currentForm
;
return
$
(
document
.
getElementsByName
(
name
)).
map
(
function
(
index
,
element
)
{
return
element
.
form
===
form
&&
element
.
name
===
name
&&
element
||
null
;
});
},
getLength
:
function
(
value
,
element
)
{
switch
(
element
.
nodeName
.
toLowerCase
()
)
{
case
'select'
:
return
$
(
"option:selected"
,
element
).
length
;
case
'input'
:
if
(
this
.
checkable
(
element
)
)
{
return
this
.
findByName
(
element
.
name
).
filter
(
':checked'
).
length
;
}
}
return
value
.
length
;
},
depend
:
function
(
param
,
element
)
{
return
this
.
dependTypes
[
typeof
param
]
?
this
.
dependTypes
[
typeof
param
](
param
,
element
)
:
true
;
},
dependTypes
:
{
"boolean"
:
function
(
param
,
element
)
{
return
param
;
},
"string"
:
function
(
param
,
element
)
{
return
!!
$
(
param
,
element
.
form
).
length
;
},
"function"
:
function
(
param
,
element
)
{
return
param
(
element
);
}
},
optional
:
function
(
element
)
{
var
val
=
this
.
elementValue
(
element
);
return
!
$
.
validator
.
methods
.
required
.
call
(
this
,
val
,
element
)
&&
"dependency-mismatch"
;
},
startRequest
:
function
(
element
)
{
if
(
!
this
.
pending
[
element
.
name
])
{
this
.
pendingRequest
++
;
this
.
pending
[
element
.
name
]
=
true
;
}
},
stopRequest
:
function
(
element
,
valid
)
{
this
.
pendingRequest
--
;
// sometimes synchronization fails, make sure pendingRequest is never < 0
if
(
this
.
pendingRequest
<
0
)
{
this
.
pendingRequest
=
0
;
}
delete
this
.
pending
[
element
.
name
];
if
(
valid
&&
this
.
pendingRequest
===
0
&&
this
.
formSubmitted
&&
this
.
form
()
)
{
$
(
this
.
currentForm
).
submit
();
this
.
formSubmitted
=
false
;
}
else
if
(
!
valid
&&
this
.
pendingRequest
===
0
&&
this
.
formSubmitted
)
{
$
(
this
.
currentForm
).
triggerHandler
(
"invalid-form"
,
[
this
]);
this
.
formSubmitted
=
false
;
}
},
previousValue
:
function
(
element
)
{
return
$
.
data
(
element
,
"previousValue"
)
||
$
.
data
(
element
,
"previousValue"
,
{
old
:
null
,
valid
:
true
,
message
:
this
.
defaultMessage
(
element
,
"remote"
)
});
}
},
classRuleSettings
:
{
required
:
{
required
:
true
},
email
:
{
email
:
true
},
url
:
{
url
:
true
},
date
:
{
date
:
true
},
dateISO
:
{
dateISO
:
true
},
number
:
{
number
:
true
},
digits
:
{
digits
:
true
},
creditcard
:
{
creditcard
:
true
}
},
addClassRules
:
function
(
className
,
rules
)
{
if
(
className
.
constructor
===
String
)
{
this
.
classRuleSettings
[
className
]
=
rules
;
}
else
{
$
.
extend
(
this
.
classRuleSettings
,
className
);
}
},
classRules
:
function
(
element
)
{
var
rules
=
{};
var
classes
=
$
(
element
).
attr
(
'class'
);
if
(
classes
)
{
$
.
each
(
classes
.
split
(
' '
),
function
()
{
if
(
this
in
$
.
validator
.
classRuleSettings
)
{
$
.
extend
(
rules
,
$
.
validator
.
classRuleSettings
[
this
]);
}
});
}
return
rules
;
},
attributeRules
:
function
(
element
)
{
var
rules
=
{};
var
$element
=
$
(
element
);
for
(
var
method
in
$
.
validator
.
methods
)
{
var
value
;
// support for <input required> in both html5 and older browsers
if
(
method
===
'required'
)
{
value
=
$element
.
get
(
0
).
getAttribute
(
method
);
// Some browsers return an empty string for the required attribute
// and non-HTML5 browsers might have required="" markup
if
(
value
===
""
)
{
value
=
true
;
}
else
if
(
value
===
"false"
)
{
value
=
false
;
}
// force non-HTML5 browsers to return bool
value
=
!!
value
;
}
else
{
value
=
$element
.
attr
(
method
);
}
if
(
value
)
{
rules
[
method
]
=
value
;
}
else
if
(
$element
[
0
].
getAttribute
(
"type"
)
===
method
)
{
rules
[
method
]
=
true
;
}
}
// maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs
if
(
rules
.
maxlength
&&
/-1|2147483647|524288/
.
test
(
rules
.
maxlength
))
{
delete
rules
.
maxlength
;
}
return
rules
;
},
metadataRules
:
function
(
element
)
{
if
(
!
$
.
metadata
)
{
return
{};
}
var
meta
=
$
.
data
(
element
.
form
,
'validator'
).
settings
.
meta
;
return
meta
?
$
(
element
).
metadata
()[
meta
]
:
$
(
element
).
metadata
();
},
staticRules
:
function
(
element
)
{
var
rules
=
{};
var
validator
=
$
.
data
(
element
.
form
,
'validator'
);
if
(
validator
.
settings
.
rules
)
{
rules
=
$
.
validator
.
normalizeRule
(
validator
.
settings
.
rules
[
element
.
name
])
||
{};
}
return
rules
;
},
normalizeRules
:
function
(
rules
,
element
)
{
// handle dependency check
$
.
each
(
rules
,
function
(
prop
,
val
)
{
// ignore rule when param is explicitly false, eg. required:false
if
(
val
===
false
)
{
delete
rules
[
prop
];
return
;
}
if
(
val
.
param
||
val
.
depends
)
{
var
keepRule
=
true
;
switch
(
typeof
val
.
depends
)
{
case
"string"
:
keepRule
=
!!
$
(
val
.
depends
,
element
.
form
).
length
;
break
;
case
"function"
:
keepRule
=
val
.
depends
.
call
(
element
,
element
);
break
;
}
if
(
keepRule
)
{
rules
[
prop
]
=
val
.
param
!==
undefined
?
val
.
param
:
true
;
}
else
{
delete
rules
[
prop
];
}
}
});
// evaluate parameters
$
.
each
(
rules
,
function
(
rule
,
parameter
)
{
rules
[
rule
]
=
$
.
isFunction
(
parameter
)
?
parameter
(
element
)
:
parameter
;
});
// clean number parameters
$
.
each
([
'minlength'
,
'maxlength'
,
'min'
,
'max'
],
function
()
{
if
(
rules
[
this
])
{
rules
[
this
]
=
Number
(
rules
[
this
]);
}
});
$
.
each
([
'rangelength'
,
'range'
],
function
()
{
if
(
rules
[
this
])
{
rules
[
this
]
=
[
Number
(
rules
[
this
][
0
]),
Number
(
rules
[
this
][
1
])];
}
});
if
(
$
.
validator
.
autoCreateRanges
)
{
// auto-create ranges
if
(
rules
.
min
&&
rules
.
max
)
{
rules
.
range
=
[
rules
.
min
,
rules
.
max
];
delete
rules
.
min
;
delete
rules
.
max
;
}
if
(
rules
.
minlength
&&
rules
.
maxlength
)
{
rules
.
rangelength
=
[
rules
.
minlength
,
rules
.
maxlength
];
delete
rules
.
minlength
;
delete
rules
.
maxlength
;
}
}
// To support custom messages in metadata ignore rule methods titled "messages"
if
(
rules
.
messages
)
{
delete
rules
.
messages
;
}
return
rules
;
},
// Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
normalizeRule
:
function
(
data
)
{
if
(
typeof
data
===
"string"
)
{
var
transformed
=
{};
$
.
each
(
data
.
split
(
/
\s
/
),
function
()
{
transformed
[
this
]
=
true
;
});
data
=
transformed
;
}
return
data
;
},
// http://docs.jquery.com/Plugins/Validation/Validator/addMethod
addMethod
:
function
(
name
,
method
,
message
)
{
$
.
validator
.
methods
[
name
]
=
method
;
$
.
validator
.
messages
[
name
]
=
message
!==
undefined
?
message
:
$
.
validator
.
messages
[
name
];
if
(
method
.
length
<
3
)
{
$
.
validator
.
addClassRules
(
name
,
$
.
validator
.
normalizeRule
(
name
));
}
},
methods
:
{
// http://docs.jquery.com/Plugins/Validation/Methods/required
required
:
function
(
value
,
element
,
param
)
{
// check if dependency is met
if
(
!
this
.
depend
(
param
,
element
)
)
{
return
"dependency-mismatch"
;
}
if
(
element
.
nodeName
.
toLowerCase
()
===
"select"
)
{
// could be an array for select-multiple or a string, both are fine this way
var
val
=
$
(
element
).
val
();
return
val
&&
val
.
length
>
0
;
}
if
(
this
.
checkable
(
element
)
)
{
return
this
.
getLength
(
value
,
element
)
>
0
;
}
return
$
.
trim
(
value
).
length
>
0
;
},
// http://docs.jquery.com/Plugins/Validation/Methods/remote
remote
:
function
(
value
,
element
,
param
)
{
if
(
this
.
optional
(
element
)
)
{
return
"dependency-mismatch"
;
}
var
previous
=
this
.
previousValue
(
element
);
if
(
!
this
.
settings
.
messages
[
element
.
name
]
)
{
this
.
settings
.
messages
[
element
.
name
]
=
{};
}
previous
.
originalMessage
=
this
.
settings
.
messages
[
element
.
name
].
remote
;
this
.
settings
.
messages
[
element
.
name
].
remote
=
previous
.
message
;
param
=
typeof
param
===
"string"
&&
{
url
:
param
}
||
param
;
if
(
this
.
pending
[
element
.
name
]
)
{
return
"pending"
;
}
if
(
previous
.
old
===
value
)
{
return
previous
.
valid
;
}
previous
.
old
=
value
;
var
validator
=
this
;
this
.
startRequest
(
element
);
var
data
=
{};
data
[
element
.
name
]
=
value
;
$
.
ajax
(
$
.
extend
(
true
,
{
url
:
param
,
mode
:
"abort"
,
port
:
"validate"
+
element
.
name
,
dataType
:
"json"
,
data
:
data
,
success
:
function
(
response
)
{
validator
.
settings
.
messages
[
element
.
name
].
remote
=
previous
.
originalMessage
;
var
valid
=
response
===
true
;
if
(
valid
)
{
var
submitted
=
validator
.
formSubmitted
;
validator
.
prepareElement
(
element
);
validator
.
formSubmitted
=
submitted
;
validator
.
successList
.
push
(
element
);
validator
.
showErrors
();
}
else
{
var
errors
=
{};
var
message
=
response
||
validator
.
defaultMessage
(
element
,
"remote"
);
errors
[
element
.
name
]
=
previous
.
message
=
$
.
isFunction
(
message
)
?
message
(
value
)
:
message
;
validator
.
showErrors
(
errors
);
}
previous
.
valid
=
valid
;
validator
.
stopRequest
(
element
,
valid
);
}
},
param
));
return
"pending"
;
},
// http://docs.jquery.com/Plugins/Validation/Methods/minlength
minlength
:
function
(
value
,
element
,
param
)
{
var
length
=
$
.
isArray
(
value
)
?
value
.
length
:
this
.
getLength
(
$
.
trim
(
value
),
element
);
return
this
.
optional
(
element
)
||
length
>=
param
;
},
// http://docs.jquery.com/Plugins/Validation/Methods/maxlength
maxlength
:
function
(
value
,
element
,
param
)
{
var
length
=
$
.
isArray
(
value
)
?
value
.
length
:
this
.
getLength
(
$
.
trim
(
value
),
element
);
return
this
.
optional
(
element
)
||
length
<=
param
;
},
// http://docs.jquery.com/Plugins/Validation/Methods/rangelength
rangelength
:
function
(
value
,
element
,
param
)
{
var
length
=
$
.
isArray
(
value
)
?
value
.
length
:
this
.
getLength
(
$
.
trim
(
value
),
element
);
return
this
.
optional
(
element
)
||
(
length
>=
param
[
0
]
&&
length
<=
param
[
1
]
);
},
// http://docs.jquery.com/Plugins/Validation/Methods/min
min
:
function
(
value
,
element
,
param
)
{
return
this
.
optional
(
element
)
||
value
>=
param
;
},
// http://docs.jquery.com/Plugins/Validation/Methods/max
max
:
function
(
value
,
element
,
param
)
{
return
this
.
optional
(
element
)
||
value
<=
param
;
},
// http://docs.jquery.com/Plugins/Validation/Methods/range
range
:
function
(
value
,
element
,
param
)
{
return
this
.
optional
(
element
)
||
(
value
>=
param
[
0
]
&&
value
<=
param
[
1
]
);
},
// http://docs.jquery.com/Plugins/Validation/Methods/email
email
:
function
(
value
,
element
)
{
// contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
return
this
.
optional
(
element
)
||
/^
((([
a-z
]
|
\d
|
[
!#
\$
%&'
\*\+\-\/
=
\?\^
_`{
\|
}~
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
+
(\.([
a-z
]
|
\d
|
[
!#
\$
%&'
\*\+\-\/
=
\?\^
_`{
\|
}~
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
+
)
*
)
|
((\x
22
)((((\x
20|
\x
09
)
*
(\x
0d
\x
0a
))?(\x
20|
\x
09
)
+
)?(([\x
01-
\x
08
\x
0b
\x
0c
\x
0e-
\x
1f
\x
7f
]
|
\x
21|
[\x
23-
\x
5b
]
|
[\x
5d-
\x
7e
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
|
(\\([\x
01-
\x
09
\x
0b
\x
0c
\x
0d-
\x
7f
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
]))))
*
(((\x
20|
\x
09
)
*
(\x
0d
\x
0a
))?(\x
20|
\x
09
)
+
)?(\x
22
)))
@
((([
a-z
]
|
\d
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
|
(([
a-z
]
|
\d
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])([
a-z
]
|
\d
|-|
\.
|_|~|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
*
([
a-z
]
|
\d
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])))\.)
+
(([
a-z
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
|
(([
a-z
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])([
a-z
]
|
\d
|-|
\.
|_|~|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
*
([
a-z
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])))
$/i
.
test
(
value
);
},
// http://docs.jquery.com/Plugins/Validation/Methods/url
url
:
function
(
value
,
element
)
{
// contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
return
this
.
optional
(
element
)
||
/^
(
https
?
|ftp
)
:
\/\/(((([
a-z
]
|
\d
|-|
\.
|_|~|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
|
(
%
[\d
a-f
]{2})
|
[
!
\$
&'
\(\)\*\+
,;=
]
|:
)
*@
)?(((\d
|
[
1-9
]\d
|1
\d\d
|2
[
0-4
]\d
|25
[
0-5
])\.(\d
|
[
1-9
]\d
|1
\d\d
|2
[
0-4
]\d
|25
[
0-5
])\.(\d
|
[
1-9
]\d
|1
\d\d
|2
[
0-4
]\d
|25
[
0-5
])\.(\d
|
[
1-9
]\d
|1
\d\d
|2
[
0-4
]\d
|25
[
0-5
]))
|
((([
a-z
]
|
\d
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
|
(([
a-z
]
|
\d
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])([
a-z
]
|
\d
|-|
\.
|_|~|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
*
([
a-z
]
|
\d
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])))\.)
+
(([
a-z
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
|
(([
a-z
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])([
a-z
]
|
\d
|-|
\.
|_|~|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
*
([
a-z
]
|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])))\.?)(
:
\d
*
)?)(\/((([
a-z
]
|
\d
|-|
\.
|_|~|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
|
(
%
[\d
a-f
]{2})
|
[
!
\$
&'
\(\)\*\+
,;=
]
|:|@
)
+
(\/(([
a-z
]
|
\d
|-|
\.
|_|~|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
|
(
%
[\d
a-f
]{2})
|
[
!
\$
&'
\(\)\*\+
,;=
]
|:|@
)
*
)
*
)?)?(\?((([
a-z
]
|
\d
|-|
\.
|_|~|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
|
(
%
[\d
a-f
]{2})
|
[
!
\$
&'
\(\)\*\+
,;=
]
|:|@
)
|
[\u
E000-
\u
F8FF
]
|
\/
|
\?)
*
)?(\#((([
a-z
]
|
\d
|-|
\.
|_|~|
[\u
00A0-
\u
D7FF
\u
F900-
\u
FDCF
\u
FDF0-
\u
FFEF
])
|
(
%
[\d
a-f
]{2})
|
[
!
\$
&'
\(\)\*\+
,;=
]
|:|@
)
|
\/
|
\?)
*
)?
$/i
.
test
(
value
);
},
// http://docs.jquery.com/Plugins/Validation/Methods/date
date
:
function
(
value
,
element
)
{
return
this
.
optional
(
element
)
||
!
/Invalid|NaN/
.
test
(
new
Date
(
value
));
},
// http://docs.jquery.com/Plugins/Validation/Methods/dateISO
dateISO
:
function
(
value
,
element
)
{
return
this
.
optional
(
element
)
||
/^
\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}
$/
.
test
(
value
);
},
// http://docs.jquery.com/Plugins/Validation/Methods/number
number
:
function
(
value
,
element
)
{
return
this
.
optional
(
element
)
||
/^-
?(?:\d
+|
\d{1,3}(?:
,
\d{3})
+
)?(?:\.\d
+
)?
$/
.
test
(
value
);
},
// http://docs.jquery.com/Plugins/Validation/Methods/digits
digits
:
function
(
value
,
element
)
{
return
this
.
optional
(
element
)
||
/^
\d
+$/
.
test
(
value
);
},
// http://docs.jquery.com/Plugins/Validation/Methods/creditcard
// based on http://en.wikipedia.org/wiki/Luhn
creditcard
:
function
(
value
,
element
)
{
if
(
this
.
optional
(
element
)
)
{
return
"dependency-mismatch"
;
}
// accept only spaces, digits and dashes
if
(
/
[^
0-9
\-]
+/
.
test
(
value
))
{
return
false
;
}
var
nCheck
=
0
,
nDigit
=
0
,
bEven
=
false
;
value
=
value
.
replace
(
/
\D
/g
,
""
);
for
(
var
n
=
value
.
length
-
1
;
n
>=
0
;
n
--
)
{
var
cDigit
=
value
.
charAt
(
n
);
nDigit
=
parseInt
(
cDigit
,
10
);
if
(
bEven
)
{
if
((
nDigit
*=
2
)
>
9
)
{
nDigit
-=
9
;
}
}
nCheck
+=
nDigit
;
bEven
=
!
bEven
;
}
return
(
nCheck
%
10
)
===
0
;
},
// http://docs.jquery.com/Plugins/Validation/Methods/accept
accept
:
function
(
value
,
element
,
param
)
{
param
=
typeof
param
===
"string"
?
param
.
replace
(
/,/g
,
'|'
)
:
"png|jpe?g|gif"
;
return
this
.
optional
(
element
)
||
value
.
match
(
new
RegExp
(
".("
+
param
+
")$"
,
"i"
));
},
// http://docs.jquery.com/Plugins/Validation/Methods/equalTo
equalTo
:
function
(
value
,
element
,
param
)
{
// bind to the blur event of the target in order to revalidate whenever the target field is updated
// TODO find a way to bind the event just once, avoiding the unbind-rebind overhead
var
target
=
$
(
param
).
unbind
(
".validate-equalTo"
).
bind
(
"blur.validate-equalTo"
,
function
()
{
$
(
element
).
valid
();
});
return
value
===
target
.
val
();
}
}
});
// deprecated, use $.validator.format instead
$
.
format
=
$
.
validator
.
format
;
}(
jQuery
));
// ajax mode: abort
// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
(
function
(
$
)
{
var
pendingRequests
=
{};
// Use a prefilter if available (1.5+)
if
(
$
.
ajaxPrefilter
)
{
$
.
ajaxPrefilter
(
function
(
settings
,
_
,
xhr
)
{
var
port
=
settings
.
port
;
if
(
settings
.
mode
===
"abort"
)
{
if
(
pendingRequests
[
port
]
)
{
pendingRequests
[
port
].
abort
();
}
pendingRequests
[
port
]
=
xhr
;
}
});
}
else
{
// Proxy ajax
var
ajax
=
$
.
ajax
;
$
.
ajax
=
function
(
settings
)
{
var
mode
=
(
"mode"
in
settings
?
settings
:
$
.
ajaxSettings
).
mode
,
port
=
(
"port"
in
settings
?
settings
:
$
.
ajaxSettings
).
port
;
if
(
mode
===
"abort"
)
{
if
(
pendingRequests
[
port
]
)
{
pendingRequests
[
port
].
abort
();
}
return
(
pendingRequests
[
port
]
=
ajax
.
apply
(
this
,
arguments
));
}
return
ajax
.
apply
(
this
,
arguments
);
};
}
}(
jQuery
));
// provides cross-browser focusin and focusout events
// IE has native support, in other browsers, use event caputuring (neither bubbles)
// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation
// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target
(
function
(
$
)
{
// only implement if not provided by jQuery core (since 1.4)
// TODO verify if jQuery 1.4's implementation is compatible with older jQuery special-event APIs
if
(
!
jQuery
.
event
.
special
.
focusin
&&
!
jQuery
.
event
.
special
.
focusout
&&
document
.
addEventListener
)
{
$
.
each
({
focus
:
'focusin'
,
blur
:
'focusout'
},
function
(
original
,
fix
){
$
.
event
.
special
[
fix
]
=
{
setup
:
function
()
{
this
.
addEventListener
(
original
,
handler
,
true
);
},
teardown
:
function
()
{
this
.
removeEventListener
(
original
,
handler
,
true
);
},
handler
:
function
(
e
)
{
var
args
=
arguments
;
args
[
0
]
=
$
.
event
.
fix
(
e
);
args
[
0
].
type
=
fix
;
return
$
.
event
.
handle
.
apply
(
this
,
args
);
}
};
function
handler
(
e
)
{
e
=
$
.
event
.
fix
(
e
);
e
.
type
=
fix
;
return
$
.
event
.
handle
.
call
(
this
,
e
);
}
});
}
$
.
extend
(
$
.
fn
,
{
validateDelegate
:
function
(
delegate
,
type
,
handler
)
{
return
this
.
bind
(
type
,
function
(
event
)
{
var
target
=
$
(
event
.
target
);
if
(
target
.
is
(
delegate
))
{
return
handler
.
apply
(
target
,
arguments
);
}
});
}
});
}(
jQuery
));
\ No newline at end of file
spring-boot-samples/spring-boot-sample-web-thymeleaf3/src/main/resources/templates/layout.html
0 → 100644
View file @
db83e899
<!DOCTYPE html>
<html
xmlns:th=
"http://www.thymeleaf.org"
xmlns:layout=
"http://www.ultraq.net.nz/web/thymeleaf/layout"
>
<head>
<title>
Layout
</title>
<link
rel=
"stylesheet"
th:href=
"@{/css/bootstrap.min.css}"
href=
"../../css/bootstrap.min.css"
/>
</head>
<body>
<div
class=
"container"
>
<div
class=
"navbar"
>
<div
class=
"navbar-inner"
>
<a
class=
"brand"
href=
"https://github.com/ultraq/thymeleaf-layout-dialect"
>
Thymeleaf - Layout
</a>
<ul
class=
"nav"
>
<li><a
th:href=
"@{/}"
href=
"messages.html"
>
Messages
</a></li>
</ul>
</div>
</div>
<h1
layout:fragment=
"header"
>
Layout
</h1>
<div
layout:fragment=
"content"
>
Fake content
</div>
</div>
</body>
</html>
spring-boot-samples/spring-boot-sample-web-thymeleaf3/src/main/resources/templates/messages/form.html
0 → 100644
View file @
db83e899
<!DOCTYPE html>
<html
xmlns:th=
"http://www.thymeleaf.org"
xmlns:layout=
"http://www.ultraq.net.nz/web/thymeleaf/layout"
layout:decorate=
"layout"
>
<head>
<title>
Messages : Create
</title>
</head>
<body>
<h1
layout:fragment=
"header"
>
Messages : Create
</h1>
<div
layout:fragment=
"content"
class=
"container"
>
<form
id=
"messageForm"
th:action=
"@{/(form)}"
th:object=
"${message}"
action=
"#"
method=
"post"
>
<div
th:if=
"${#fields.hasErrors('*')}"
class=
"alert alert-error"
>
<p
th:each=
"error : ${#fields.errors('*')}"
th:text=
"${error}"
>
Validation error
</p>
</div>
<div
class=
"pull-right"
>
<a
th:href=
"@{/}"
href=
"messages.html"
>
Messages
</a>
</div>
<input
type=
"hidden"
th:field=
"*{id}"
th:class=
"${#fields.hasErrors('id')} ? 'field-error'"
/>
<label
for=
"summary"
>
Summary
</label>
<input
type=
"text"
th:field=
"*{summary}"
th:class=
"${#fields.hasErrors('summary')} ? 'field-error'"
/>
<label
for=
"text"
>
Message
</label>
<textarea
th:field=
"*{text}"
th:class=
"${#fields.hasErrors('text')} ? 'field-error'"
></textarea>
<div
class=
"form-actions"
>
<input
type=
"submit"
value=
"Save"
/>
</div>
</form>
</div>
</body>
</html>
spring-boot-samples/spring-boot-sample-web-thymeleaf3/src/main/resources/templates/messages/list.html
0 → 100644
View file @
db83e899
<!DOCTYPE html>
<html
xmlns:th=
"http://www.thymeleaf.org"
xmlns:layout=
"http://www.ultraq.net.nz/web/thymeleaf/layout"
layout:decorate=
"layout"
>
<head>
<title>
Messages : View all
</title>
</head>
<body>
<h1
layout:fragment=
"header"
>
Messages : View all
</h1>
<div
layout:fragment=
"content"
class=
"container"
>
<div
class=
"pull-right"
>
<a
href=
"form.html"
th:href=
"@{/(form)}"
>
Create Message
</a>
</div>
<table
class=
"table table-bordered table-striped"
>
<thead>
<tr>
<td>
ID
</td>
<td>
Created
</td>
<td>
Summary
</td>
</tr>
</thead>
<tbody>
<tr
th:if=
"${messages.empty}"
>
<td
colspan=
"3"
>
No messages
</td>
</tr>
<tr
th:each=
"message : ${messages}"
>
<td
th:text=
"${message.id}"
>
1
</td>
<td
th:text=
"${#calendars.format(message.created)}"
>
July 11,
2012 2:17:16 PM CDT
</td>
<td><a
href=
"view.html"
th:href=
"@{'/' + ${message.id}}"
th:text=
"${message.summary}"
>
The summary
</a></td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
spring-boot-samples/spring-boot-sample-web-thymeleaf3/src/main/resources/templates/messages/view.html
0 → 100644
View file @
db83e899
<html
xmlns:th=
"http://www.thymeleaf.org"
xmlns:layout=
"http://www.ultraq.net.nz/web/thymeleaf/layout"
layout:decorate=
"layout"
>
<head>
<title>
Messages : View
</title>
</head>
<body>
<h1
layout:fragment=
"header"
>
Messages : Create
</h1>
<div
layout:fragment=
"content"
class=
"container"
>
<div
class=
"alert alert-success"
th:if=
"${globalMessage}"
th:text=
"${globalMessage}"
>
Some Success message
</div>
<div
class=
"pull-right"
>
<a
th:href=
"@{/}"
href=
"list.html"
>
Messages
</a>
</div>
<dl>
<dt>
ID
</dt>
<dd
id=
"id"
th:text=
"${message.id}"
>
123
</dd>
<dt>
Date
</dt>
<dd
id=
"created"
th:text=
"${#calendars.format(message.created)}"
>
July 11, 2012 2:17:16 PM CDT
</dd>
<dt>
Summary
</dt>
<dd
id=
"summary"
th:text=
"${message.summary}"
>
A short summary...
</dd>
<dt>
Message
</dt>
<dd
id=
"text"
th:text=
"${message.text}"
>
A detailed message that
is longer than the summary.
</dd>
</dl>
<div
class=
"pull-left"
>
<a
href=
"messages"
th:href=
"@{'/delete/' + ${message.id}}"
>
delete
</a>
|
<a
href=
"form.html"
th:href=
"@{'/modify/' + ${message.id}}"
>
modify
</a>
</div>
</div>
</body>
</html>
spring-boot-samples/spring-boot-sample-web-thymeleaf3/src/test/java/sample/web/thymeleaf3/MessageControllerWebTests.java
0 → 100644
View file @
db83e899
/*
* Copyright 2012-2016 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.
*/
package
sample
.
web
.
thymeleaf3
;
import
java.util.regex.Pattern
;
import
org.hamcrest.Description
;
import
org.hamcrest.TypeSafeMatcher
;
import
org.junit.Before
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
import
sample.web.thymeleaf3.SampleWebThymeleaf3Application
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.test.context.ContextConfiguration
;
import
org.springframework.test.context.junit4.SpringRunner
;
import
org.springframework.test.context.web.WebAppConfiguration
;
import
org.springframework.test.web.servlet.MockMvc
;
import
org.springframework.test.web.servlet.setup.MockMvcBuilders
;
import
org.springframework.web.context.WebApplicationContext
;
import
static
org
.
hamcrest
.
Matchers
.
containsString
;
import
static
org
.
springframework
.
test
.
web
.
servlet
.
request
.
MockMvcRequestBuilders
.
get
;
import
static
org
.
springframework
.
test
.
web
.
servlet
.
request
.
MockMvcRequestBuilders
.
post
;
import
static
org
.
springframework
.
test
.
web
.
servlet
.
result
.
MockMvcResultMatchers
.
content
;
import
static
org
.
springframework
.
test
.
web
.
servlet
.
result
.
MockMvcResultMatchers
.
header
;
import
static
org
.
springframework
.
test
.
web
.
servlet
.
result
.
MockMvcResultMatchers
.
status
;
/**
* A Basic Spring MVC Test for the Sample Controller"
*
* @author Biju Kunjummen
* @author Doo-Hwan, Kwak
*/
@RunWith
(
SpringRunner
.
class
)
@WebAppConfiguration
@ContextConfiguration
(
classes
=
SampleWebThymeleaf3Application
.
class
)
public
class
MessageControllerWebTests
{
@Autowired
private
WebApplicationContext
wac
;
private
MockMvc
mockMvc
;
@Before
public
void
setup
()
{
this
.
mockMvc
=
MockMvcBuilders
.
webAppContextSetup
(
this
.
wac
).
build
();
}
@Test
public
void
testHome
()
throws
Exception
{
this
.
mockMvc
.
perform
(
get
(
"/"
)).
andExpect
(
status
().
isOk
())
.
andExpect
(
content
().
string
(
containsString
(
"<title>Messages"
)));
}
@Test
public
void
testCreate
()
throws
Exception
{
this
.
mockMvc
.
perform
(
post
(
"/"
).
param
(
"text"
,
"FOO text"
).
param
(
"summary"
,
"FOO"
))
.
andExpect
(
status
().
isFound
())
.
andExpect
(
header
().
string
(
"location"
,
RegexMatcher
.
matches
(
"/[0-9]+"
)));
}
@Test
public
void
testCreateValidation
()
throws
Exception
{
this
.
mockMvc
.
perform
(
post
(
"/"
).
param
(
"text"
,
""
).
param
(
"summary"
,
""
))
.
andExpect
(
status
().
isOk
())
.
andExpect
(
content
().
string
(
containsString
(
"is required"
)));
}
private
static
class
RegexMatcher
extends
TypeSafeMatcher
<
String
>
{
private
final
String
regex
;
public
RegexMatcher
(
String
regex
)
{
this
.
regex
=
regex
;
}
public
static
org
.
hamcrest
.
Matcher
<
java
.
lang
.
String
>
matches
(
String
regex
)
{
return
new
RegexMatcher
(
regex
);
}
@Override
public
boolean
matchesSafely
(
String
item
)
{
return
Pattern
.
compile
(
this
.
regex
).
matcher
(
item
).
find
();
}
@Override
public
void
describeMismatchSafely
(
String
item
,
Description
mismatchDescription
)
{
mismatchDescription
.
appendText
(
"was \""
).
appendText
(
item
).
appendText
(
"\""
);
}
@Override
public
void
describeTo
(
Description
description
)
{
description
.
appendText
(
"a string that matches regex: "
)
.
appendText
(
this
.
regex
);
}
}
}
spring-boot-samples/spring-boot-sample-web-thymeleaf3/src/test/java/sample/web/thymeleaf3/SampleWebThymeleaf3ApplicationTests.java
0 → 100644
View file @
db83e899
/*
* Copyright 2012-2016 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.
*/
package
sample
.
web
.
thymeleaf3
;
import
java.net.URI
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
import
org.springframework.boot.context.embedded.LocalServerPort
;
import
org.springframework.boot.test.context.SpringBootTest
;
import
org.springframework.boot.test.context.SpringBootTest.WebEnvironment
;
import
org.springframework.boot.test.web.client.TestRestTemplate
;
import
org.springframework.http.HttpStatus
;
import
org.springframework.http.ResponseEntity
;
import
org.springframework.test.annotation.DirtiesContext
;
import
org.springframework.test.context.junit4.SpringRunner
;
import
org.springframework.util.LinkedMultiValueMap
;
import
org.springframework.util.MultiValueMap
;
import
static
org
.
assertj
.
core
.
api
.
Assertions
.
assertThat
;
/**
* Basic integration tests for {@link SampleWebThymeleaf3Application}.
*
* @author Dave Syer
*/
@RunWith
(
SpringRunner
.
class
)
@SpringBootTest
(
webEnvironment
=
WebEnvironment
.
RANDOM_PORT
)
@DirtiesContext
public
class
SampleWebThymeleaf3ApplicationTests
{
@LocalServerPort
private
int
port
;
@Test
public
void
testHome
()
throws
Exception
{
ResponseEntity
<
String
>
entity
=
new
TestRestTemplate
()
.
getForEntity
(
"http://localhost:"
+
this
.
port
,
String
.
class
);
assertThat
(
entity
.
getStatusCode
()).
isEqualTo
(
HttpStatus
.
OK
);
assertThat
(
entity
.
getBody
()).
contains
(
"<title>Messages"
);
assertThat
(
entity
.
getBody
()).
doesNotContain
(
"layout:fragment"
);
}
@Test
public
void
testCreate
()
throws
Exception
{
MultiValueMap
<
String
,
String
>
map
=
new
LinkedMultiValueMap
<
String
,
String
>();
map
.
set
(
"text"
,
"FOO text"
);
map
.
set
(
"summary"
,
"FOO"
);
URI
location
=
new
TestRestTemplate
()
.
postForLocation
(
"http://localhost:"
+
this
.
port
,
map
);
assertThat
(
location
.
toString
()).
contains
(
"localhost:"
+
this
.
port
);
}
@Test
public
void
testCss
()
throws
Exception
{
ResponseEntity
<
String
>
entity
=
new
TestRestTemplate
().
getForEntity
(
"http://localhost:"
+
this
.
port
+
"/css/bootstrap.min.css"
,
String
.
class
);
assertThat
(
entity
.
getStatusCode
()).
isEqualTo
(
HttpStatus
.
OK
);
assertThat
(
entity
.
getBody
()).
contains
(
"body"
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment