diff --git a/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/jdbc/interceptor/ConnectionCloseInterceptor.java b/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/jdbc/interceptor/ConnectionCloseInterceptor.java index 0d832b2e1..09c64a215 100644 --- a/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/jdbc/interceptor/ConnectionCloseInterceptor.java +++ b/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/jdbc/interceptor/ConnectionCloseInterceptor.java @@ -38,7 +38,9 @@ public class ConnectionCloseInterceptor implements AroundInterceptor { logger.beforeInterceptor(target, args); } // In case of close, we have to delete data even if the invocation failed. - ((DatabaseInfoAccessor)target)._$PINPOINT$_setDatabaseInfo(null); + if (target instanceof DatabaseInfoAccessor) { + ((DatabaseInfoAccessor) target)._$PINPOINT$_setDatabaseInfo(null); + } } @IgnoreMethod diff --git a/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/jdbc/interceptor/DriverConnectInterceptor.java b/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/jdbc/interceptor/DriverConnectInterceptor.java index 8324b9f24..e1c0f4cb8 100644 --- a/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/jdbc/interceptor/DriverConnectInterceptor.java +++ b/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/jdbc/interceptor/DriverConnectInterceptor.java @@ -76,7 +76,9 @@ public class DriverConnectInterceptor extends SpanEventSimpleAroundInterceptorFo DatabaseInfo databaseInfo = createDatabaseInfo(driverUrl); if (success) { if (recordConnection) { - ((DatabaseInfoAccessor)result)._$PINPOINT$_setDatabaseInfo(databaseInfo); + if (result instanceof DatabaseInfoAccessor) { + ((DatabaseInfoAccessor) result)._$PINPOINT$_setDatabaseInfo(databaseInfo); + } } } } @@ -86,7 +88,7 @@ public class DriverConnectInterceptor extends SpanEventSimpleAroundInterceptorFo if (recordConnection) { DatabaseInfo databaseInfo = (result instanceof DatabaseInfoAccessor) ? ((DatabaseInfoAccessor)result)._$PINPOINT$_getDatabaseInfo() : null; - + if (databaseInfo == null) { databaseInfo = UnKnownDatabaseInfo.INSTANCE; } diff --git a/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/jdbc/interceptor/StatementCreateInterceptor.java b/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/jdbc/interceptor/StatementCreateInterceptor.java index c3d07024d..39e2afcdd 100644 --- a/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/jdbc/interceptor/StatementCreateInterceptor.java +++ b/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/jdbc/interceptor/StatementCreateInterceptor.java @@ -75,8 +75,9 @@ public class StatementCreateInterceptor implements AroundInterceptor { if (databaseInfo == null) { databaseInfo = UnKnownDatabaseInfo.INSTANCE; } - - ((DatabaseInfoAccessor)result)._$PINPOINT$_setDatabaseInfo(databaseInfo); + if (result instanceof DatabaseInfoAccessor) { + ((DatabaseInfoAccessor) result)._$PINPOINT$_setDatabaseInfo(databaseInfo); + } } } } diff --git a/collector/src/main/java/com/navercorp/pinpoint/collector/cluster/zookeeper/ZookeeperProfilerClusterManager.java b/collector/src/main/java/com/navercorp/pinpoint/collector/cluster/zookeeper/ZookeeperProfilerClusterManager.java index 5753cad87..449098372 100644 --- a/collector/src/main/java/com/navercorp/pinpoint/collector/cluster/zookeeper/ZookeeperProfilerClusterManager.java +++ b/collector/src/main/java/com/navercorp/pinpoint/collector/cluster/zookeeper/ZookeeperProfilerClusterManager.java @@ -126,13 +126,11 @@ public class ZookeeperProfilerClusterManager implements ServerStateChangeEventHa if (SocketStateCode.RUN_DUPLEX == stateCode) { UpdateJob job = new UpdateJob(pinpointServer, new byte[0]); - worker.putJob(job); - profileCluster.addClusterPoint(new PinpointServerClusterPoint(pinpointServer)); + worker.putJob(job); } else if (SocketStateCode.isClosed(stateCode)) { DeleteJob job = new DeleteJob(pinpointServer); worker.putJob(job); - profileCluster.removeClusterPoint(new PinpointServerClusterPoint(pinpointServer)); } } else { diff --git a/collector/src/main/java/com/navercorp/pinpoint/collector/receiver/tcp/TCPReceiver.java b/collector/src/main/java/com/navercorp/pinpoint/collector/receiver/tcp/TCPReceiver.java index 457f73396..ce25b7598 100644 --- a/collector/src/main/java/com/navercorp/pinpoint/collector/receiver/tcp/TCPReceiver.java +++ b/collector/src/main/java/com/navercorp/pinpoint/collector/receiver/tcp/TCPReceiver.java @@ -271,13 +271,6 @@ public class TCPReceiver { SocketAddress remoteAddress = pinpointSocket.getRemoteAddress(); try { TBase tBase = SerializationUtils.deserialize(bytes, deserializerFactory); - if (tBase instanceof L4Packet) { - if (logger.isDebugEnabled()) { - L4Packet packet = (L4Packet) tBase; - logger.debug("tcp l4 packet {}", packet.getHeader()); - } - return; - } TBase result = dispatchHandler.dispatchRequestMessage(tBase); if (result != null) { byte[] resultBytes = SerializationUtils.serialize(result, serializerFactory); diff --git a/collector/src/main/java/com/navercorp/pinpoint/collector/receiver/udp/BaseUDPHandlerFactory.java b/collector/src/main/java/com/navercorp/pinpoint/collector/receiver/udp/BaseUDPHandlerFactory.java index a2ace36dc..3b40b32f1 100644 --- a/collector/src/main/java/com/navercorp/pinpoint/collector/receiver/udp/BaseUDPHandlerFactory.java +++ b/collector/src/main/java/com/navercorp/pinpoint/collector/receiver/udp/BaseUDPHandlerFactory.java @@ -20,16 +20,23 @@ import com.navercorp.pinpoint.collector.receiver.DispatchHandler; import com.navercorp.pinpoint.collector.util.PacketUtils; import com.navercorp.pinpoint.thrift.io.*; +import org.apache.commons.lang3.StringUtils; import org.apache.thrift.TBase; import org.apache.thrift.TException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.net.*; +import java.net.DatagramPacket; +import java.net.InetAddress; +import java.net.SocketAddress; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.List; /** * @author emeroad * @author netspider + * @author minwoo.jung */ public class BaseUDPHandlerFactory implements PacketHandlerFactory { @@ -42,8 +49,10 @@ public class BaseUDPHandlerFactory implements PacketHa private final TBaseFilter filter; private final PacketHandler dispatchPacket = new DispatchPacket(); + + private final InetAddress[] ignoreAddresses; - public BaseUDPHandlerFactory(DispatchHandler dispatchHandler, TBaseFilter filter) { + public BaseUDPHandlerFactory(DispatchHandler dispatchHandler, TBaseFilter filter, List l4IpList) { if (dispatchHandler == null) { throw new NullPointerException("dispatchHandler must not be null"); } @@ -52,6 +61,34 @@ public class BaseUDPHandlerFactory implements PacketHa } this.dispatchHandler = dispatchHandler; this.filter = filter; + this.ignoreAddresses = setIgnoreAddressList(l4IpList); + } + + private InetAddress[] setIgnoreAddressList(List l4IpList) { + if (l4IpList == null) { + return null; + } + try { + List inetAddressList = new ArrayList(); + for (int i = 0; i < l4IpList.size(); i++) { + String l4Ip = l4IpList.get(i); + if (StringUtils.isBlank(l4Ip)) { + continue; + } + + InetAddress address = InetAddress.getByName(l4Ip); + if (address != null) { + inetAddressList.add(address); + } + } + + InetAddress[] inetAddressArray = new InetAddress[inetAddressList.size()]; + return inetAddressList.toArray(inetAddressArray); + } catch (UnknownHostException e) { + logger.warn("l4ipList error {}", l4IpList, e); + } + + return null; } @Override @@ -67,9 +104,14 @@ public class BaseUDPHandlerFactory implements PacketHa @Override public void receive(T packet) { + if (isIgnoreAddress(packet.getAddress())) { + return; + } + final HeaderTBaseDeserializer deserializer = deserializerFactory.createDeserializer(); - TBase tBase = null; SocketAddress socketAddress = packet.getSocketAddress(); + TBase tBase = null; + try { tBase = deserializer.deserialize(packet.getData()); if (filter.filter(tBase, socketAddress) == TBaseFilter.BREAK) { @@ -94,6 +136,24 @@ public class BaseUDPHandlerFactory implements PacketHa } } } + + private boolean isIgnoreAddress(InetAddress remoteAddress) { + if (ignoreAddresses == null) { + return false; + } + if (remoteAddress == null) { + return false; + } + for (InetAddress ignore : ignoreAddresses) { + if (ignore.equals(remoteAddress)) { + if (logger.isDebugEnabled()) { + logger.debug("UDP Connected ignore address. IP : " + remoteAddress.getHostAddress()); + } + return true; + } + } + return false; + } } } diff --git a/collector/src/main/java/com/navercorp/pinpoint/collector/receiver/udp/L4PacketFilter.java b/collector/src/main/java/com/navercorp/pinpoint/collector/receiver/udp/L4PacketFilter.java deleted file mode 100644 index a7c7cf736..000000000 --- a/collector/src/main/java/com/navercorp/pinpoint/collector/receiver/udp/L4PacketFilter.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * 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 com.navercorp.pinpoint.collector.receiver.udp; - -import com.navercorp.pinpoint.thrift.io.L4Packet; -import org.apache.thrift.TBase; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author emeroad - */ -public class L4PacketFilter implements TBaseFilter { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @Override - public boolean filter(TBase tBase, T remoteAddress) { - if (tBase instanceof L4Packet) { - if (logger.isDebugEnabled()) { - L4Packet l4Packet = (L4Packet) tBase; - logger.debug("udp l4 packet {} {}", l4Packet.getHeader(), remoteAddress); - } - return BREAK; - } - return CONTINUE; - } -} diff --git a/collector/src/main/resources/applicationContext-collector.xml b/collector/src/main/resources/applicationContext-collector.xml index db03da50b..bbb65f47a 100644 --- a/collector/src/main/resources/applicationContext-collector.xml +++ b/collector/src/main/resources/applicationContext-collector.xml @@ -206,18 +206,17 @@ + - - @@ -237,6 +236,7 @@ + diff --git a/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/AddOpInterceptor.java b/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/AddOpInterceptor.java index 8d86710f8..a856686f1 100644 --- a/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/AddOpInterceptor.java +++ b/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/AddOpInterceptor.java @@ -37,9 +37,11 @@ public class AddOpInterceptor implements AroundInterceptor { if (isDebug) { logger.beforeInterceptor(target, args); } - - String serviceCode = ((ServiceCodeAccessor)target)._$PINPOINT$_getServiceCode(); - ((ServiceCodeAccessor)args[1])._$PINPOINT$_setServiceCode(serviceCode); + final Object serviceCodeAccessor = args[1]; + if (target instanceof ServiceCodeAccessor && serviceCodeAccessor instanceof ServiceCodeAccessor) { + String serviceCode = ((ServiceCodeAccessor) target)._$PINPOINT$_getServiceCode(); + ((ServiceCodeAccessor) serviceCodeAccessor)._$PINPOINT$_setServiceCode(serviceCode); + } } @Override diff --git a/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/ApiInterceptor.java b/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/ApiInterceptor.java index 4ec41a41f..7d737a16f 100644 --- a/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/ApiInterceptor.java +++ b/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/ApiInterceptor.java @@ -162,6 +162,7 @@ public class ApiInterceptor implements AroundInterceptor { this.traceContext.getAsyncId(); final AsyncTraceId asyncTraceId = trace.getAsyncTraceId(); recorder.recordNextAsyncId(asyncTraceId.getAsyncId()); + // type check isAsynchronousInvocation ((AsyncTraceIdAccessor)result)._$PINPOINT$_setAsyncTraceId(asyncTraceId); if (isDebug) { logger.debug("Set asyncTraceId metadata {}", asyncTraceId); diff --git a/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/CacheManagerConstructInterceptor.java b/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/CacheManagerConstructInterceptor.java index c47494747..637037736 100644 --- a/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/CacheManagerConstructInterceptor.java +++ b/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/CacheManagerConstructInterceptor.java @@ -41,7 +41,8 @@ public class CacheManagerConstructInterceptor implements AroundInterceptor { if (isDebug) { logger.afterInterceptor(target, args, result, throwable); } - - ((ServiceCodeAccessor)target)._$PINPOINT$_setServiceCode((String)args[1]); + if (target instanceof ServiceCodeAccessor) { + ((ServiceCodeAccessor) target)._$PINPOINT$_setServiceCode((String) args[1]); + } } } diff --git a/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FrontCacheGetFutureConstructInterceptor.java b/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FrontCacheGetFutureConstructInterceptor.java index 3b14607a5..9fc9cc077 100644 --- a/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FrontCacheGetFutureConstructInterceptor.java +++ b/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FrontCacheGetFutureConstructInterceptor.java @@ -47,11 +47,16 @@ public class FrontCacheGetFutureConstructInterceptor implements AroundIntercepto } try { - ((CacheNameAccessor)target)._$PINPOINT$_setCacheName(DEFAULT_FRONTCACHE_NAME); - - if (args[0] instanceof Element) { - Element element = (Element) args[0]; - ((CacheKeyAccessor)target)._$PINPOINT$_setCacheKey(element.getObjectKey()); + if (target instanceof CacheNameAccessor) { + ((CacheNameAccessor) target)._$PINPOINT$_setCacheName(DEFAULT_FRONTCACHE_NAME); + } + + final Object elementArg = args[0]; + if (elementArg instanceof Element) { + final Element element = (Element) elementArg; + if (target instanceof CacheKeyAccessor) { + ((CacheKeyAccessor) target)._$PINPOINT$_setCacheKey(element.getObjectKey()); + } } } catch (Exception e) { logger.error("failed to add metadata: {}", e); diff --git a/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FrontCacheGetFutureGetInterceptor.java b/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FrontCacheGetFutureGetInterceptor.java index 150ccfd9f..ac8db6865 100644 --- a/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FrontCacheGetFutureGetInterceptor.java +++ b/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FrontCacheGetFutureGetInterceptor.java @@ -70,9 +70,11 @@ public class FrontCacheGetFutureGetInterceptor implements AroundInterceptor { try { final SpanEventRecorder recorder = trace.currentSpanEventRecorder(); recorder.recordApi(methodDescriptor); - String cacheName = ((CacheNameAccessor)target)._$PINPOINT$_getCacheName(); - if (cacheName != null) { - recorder.recordDestinationId(cacheName); + if (target instanceof CacheNameAccessor) { + final String cacheName = ((CacheNameAccessor) target)._$PINPOINT$_getCacheName(); + if (cacheName != null) { + recorder.recordDestinationId(cacheName); + } } recorder.recordServiceType(ArcusConstants.ARCUS_EHCACHE_FUTURE_GET); diff --git a/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FutureSetOperationInterceptor.java b/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FutureSetOperationInterceptor.java index a4d024d25..8c73c26fc 100644 --- a/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FutureSetOperationInterceptor.java +++ b/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FutureSetOperationInterceptor.java @@ -37,7 +37,9 @@ public class FutureSetOperationInterceptor implements AroundInterceptor { logger.beforeInterceptor(target, args); } - ((OperationAccessor)target)._$PINPOINT$_setOperation((Operation)args[0]); + if (target instanceof OperationAccessor) { + ((OperationAccessor) target)._$PINPOINT$_setOperation((Operation) args[0]); + } } @Override diff --git a/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/SetCacheManagerInterceptor.java b/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/SetCacheManagerInterceptor.java index c26cab955..c8efb6627 100644 --- a/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/SetCacheManagerInterceptor.java +++ b/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/SetCacheManagerInterceptor.java @@ -38,8 +38,11 @@ public class SetCacheManagerInterceptor implements AroundInterceptor { logger.beforeInterceptor(target, args); } - String serviceCode = ((ServiceCodeAccessor)args[0])._$PINPOINT$_getServiceCode(); - ((ServiceCodeAccessor)target)._$PINPOINT$_setServiceCode(serviceCode); + final Object serviceCodeObject = args[0]; + if (serviceCodeObject instanceof ServiceCodeAccessor && target instanceof ServiceCodeAccessor) { + String serviceCode = ((ServiceCodeAccessor) serviceCodeObject)._$PINPOINT$_getServiceCode(); + ((ServiceCodeAccessor) target)._$PINPOINT$_setServiceCode(serviceCode); + } } @IgnoreMethod diff --git a/plugins/google-httpclient/src/main/java/com/navercorp/pinpoint/plugin/google/httpclient/interceptor/HttpRequestExecuteAsyncMethodInnerClassConstructorInterceptor.java b/plugins/google-httpclient/src/main/java/com/navercorp/pinpoint/plugin/google/httpclient/interceptor/HttpRequestExecuteAsyncMethodInnerClassConstructorInterceptor.java index 2b1fbdcaf..205ce8530 100644 --- a/plugins/google-httpclient/src/main/java/com/navercorp/pinpoint/plugin/google/httpclient/interceptor/HttpRequestExecuteAsyncMethodInnerClassConstructorInterceptor.java +++ b/plugins/google-httpclient/src/main/java/com/navercorp/pinpoint/plugin/google/httpclient/interceptor/HttpRequestExecuteAsyncMethodInnerClassConstructorInterceptor.java @@ -58,6 +58,7 @@ public class HttpRequestExecuteAsyncMethodInnerClassConstructorInterceptor imple final InterceptorScopeInvocation transaction = interceptorScope.getCurrentInvocation(); if (transaction != null && transaction.getAttachment() != null) { final AsyncTraceId asyncTraceId = (AsyncTraceId) transaction.getAttachment(); + // type check validate(); ((AsyncTraceIdAccessor)target)._$PINPOINT$_setAsyncTraceId(asyncTraceId); // clear. transaction.removeAttachment(); diff --git a/plugins/httpclient4/src/main/java/com/navercorp/pinpoint/plugin/httpclient4/interceptor/DefaultClientExchangeHandlerImplStartMethodInterceptor.java b/plugins/httpclient4/src/main/java/com/navercorp/pinpoint/plugin/httpclient4/interceptor/DefaultClientExchangeHandlerImplStartMethodInterceptor.java index 9574dbb55..54cdb5553 100644 --- a/plugins/httpclient4/src/main/java/com/navercorp/pinpoint/plugin/httpclient4/interceptor/DefaultClientExchangeHandlerImplStartMethodInterceptor.java +++ b/plugins/httpclient4/src/main/java/com/navercorp/pinpoint/plugin/httpclient4/interceptor/DefaultClientExchangeHandlerImplStartMethodInterceptor.java @@ -152,6 +152,7 @@ public class DefaultClientExchangeHandlerImplStartMethodInterceptor implements A // set asynchronous trace final AsyncTraceId asyncTraceId = trace.getAsyncTraceId(); recorder.recordNextAsyncId(asyncTraceId.getAsyncId()); + // check type isAsynchronousInvocation() ((AsyncTraceIdAccessor)((ResultFutureGetter)target)._$PINPOINT$_getResultFuture())._$PINPOINT$_setAsyncTraceId(asyncTraceId); if (isDebug) { logger.debug("Set asyncTraceId metadata {}", asyncTraceId); diff --git a/plugins/httpclient4/src/main/java/com/navercorp/pinpoint/plugin/httpclient4/interceptor/HttpRequestExecutorDoSendRequestAndDoReceiveResponseMethodInterceptor.java b/plugins/httpclient4/src/main/java/com/navercorp/pinpoint/plugin/httpclient4/interceptor/HttpRequestExecutorDoSendRequestAndDoReceiveResponseMethodInterceptor.java index 89a75e955..24b50196d 100644 --- a/plugins/httpclient4/src/main/java/com/navercorp/pinpoint/plugin/httpclient4/interceptor/HttpRequestExecutorDoSendRequestAndDoReceiveResponseMethodInterceptor.java +++ b/plugins/httpclient4/src/main/java/com/navercorp/pinpoint/plugin/httpclient4/interceptor/HttpRequestExecutorDoSendRequestAndDoReceiveResponseMethodInterceptor.java @@ -62,6 +62,7 @@ public class HttpRequestExecutorDoSendRequestAndDoReceiveResponseMethodIntercept InterceptorScopeInvocation invocation = interceptorScope.getCurrentInvocation(); if(invocation != null && invocation.getAttachment() != null) { + // TODO type check HttpCallContext callContext = (HttpCallContext) invocation.getAttachment(); if(methodDescriptor.getMethodName().equals("doSendRequest")) { callContext.setWriteBeginTime(System.currentTimeMillis()); @@ -85,6 +86,7 @@ public class HttpRequestExecutorDoSendRequestAndDoReceiveResponseMethodIntercept InterceptorScopeInvocation invocation = interceptorScope.getCurrentInvocation(); if(invocation != null && invocation.getAttachment() != null) { + // TODO type check HttpCallContext callContext = (HttpCallContext) invocation.getAttachment(); if(methodDescriptor.getMethodName().equals("doSendRequest")) { callContext.setWriteEndTime(System.currentTimeMillis()); diff --git a/plugins/jdk-http/src/main/java/com/navercorp/pinpoint/plugin/jdk/http/interceptor/HttpURLConnectionInterceptor.java b/plugins/jdk-http/src/main/java/com/navercorp/pinpoint/plugin/jdk/http/interceptor/HttpURLConnectionInterceptor.java index e07e313e9..d93eb1e34 100644 --- a/plugins/jdk-http/src/main/java/com/navercorp/pinpoint/plugin/jdk/http/interceptor/HttpURLConnectionInterceptor.java +++ b/plugins/jdk-http/src/main/java/com/navercorp/pinpoint/plugin/jdk/http/interceptor/HttpURLConnectionInterceptor.java @@ -79,10 +79,16 @@ public class HttpURLConnectionInterceptor implements AroundInterceptor { return; } - HttpURLConnection request = (HttpURLConnection) target; - - boolean connected = ((ConnectedGetter)target)._$PINPOINT$_isConnected(); - boolean connecting = (target instanceof ConnectingGetter) && ((ConnectingGetter)target)._$PINPOINT$_isConnecting(); + final HttpURLConnection request = (HttpURLConnection) target; + + boolean connected = false; + if (target instanceof ConnectedGetter) { + connected = ((ConnectedGetter) target)._$PINPOINT$_isConnected(); + } + boolean connecting = false; + if (target instanceof ConnectingGetter) { + connecting = ((ConnectingGetter) target)._$PINPOINT$_isConnecting(); + } if (connected || connecting) { return; diff --git a/plugins/jetty/src/main/java/com/navercorp/pinpoint/plugin/jetty/interceptor/Jetty8ServerHandleInterceptor.java b/plugins/jetty/src/main/java/com/navercorp/pinpoint/plugin/jetty/interceptor/Jetty8ServerHandleInterceptor.java index 41daf7caa..0017c7838 100644 --- a/plugins/jetty/src/main/java/com/navercorp/pinpoint/plugin/jetty/interceptor/Jetty8ServerHandleInterceptor.java +++ b/plugins/jetty/src/main/java/com/navercorp/pinpoint/plugin/jetty/interceptor/Jetty8ServerHandleInterceptor.java @@ -14,6 +14,8 @@ import java.lang.reflect.Method; @TargetMethod(name = "handle", paramTypes = { "org.eclipse.jetty.server.AbstractHttpConnection" }) public class Jetty8ServerHandleInterceptor extends AbstractServerHandleInterceptor { + private volatile Method getRequestMethod; + public Jetty8ServerHandleInterceptor(TraceContext traceContext, MethodDescriptor descriptor, Filter excludeFilter) { super(traceContext, descriptor, excludeFilter); } @@ -23,7 +25,7 @@ public class Jetty8ServerHandleInterceptor extends AbstractServerHandleIntercept try { Object object = args[0]; - Method getRequestMethod = getMethod(object.getClass(), "getRequest"); + Method getRequestMethod = getGetRequestMethod(object.getClass()); Request request = (Request) getRequestMethod.invoke(object); return request; } catch (Exception e) { @@ -33,24 +35,26 @@ public class Jetty8ServerHandleInterceptor extends AbstractServerHandleIntercept return null; } - private Method getMethod(Class clazz, String methodName) { - Class targetClazz = clazz; - - while (targetClazz != null) { - try { - Method method = targetClazz.getMethod(methodName); - if (method != null) { - return method; - } - - } catch (NoSuchMethodException e) { - Class superclass = targetClazz.getSuperclass(); - if (superclass != null) { - targetClazz = superclass; - } - } + private Method getGetRequestMethod(Class clazz) { + if (getRequestMethod != null) { + return getRequestMethod; } + synchronized (this) { + if (getRequestMethod != null) { + return getRequestMethod; + } + + try { + Method findedMethod = clazz.getMethod("getRequest"); + if (findedMethod != null) { + getRequestMethod = findedMethod; + return getRequestMethod; + } + } catch (NoSuchMethodException e) { + logger.warn(e.getMessage(), e); + } + } return null; }; diff --git a/plugins/jetty/src/main/java/com/navercorp/pinpoint/plugin/jetty/interceptor/ServerHandleInterceptor.java b/plugins/jetty/src/main/java/com/navercorp/pinpoint/plugin/jetty/interceptor/ServerHandleInterceptor.java index 7756187c2..f947a680e 100644 --- a/plugins/jetty/src/main/java/com/navercorp/pinpoint/plugin/jetty/interceptor/ServerHandleInterceptor.java +++ b/plugins/jetty/src/main/java/com/navercorp/pinpoint/plugin/jetty/interceptor/ServerHandleInterceptor.java @@ -19,7 +19,11 @@ public class ServerHandleInterceptor extends AbstractServerHandleInterceptor { @Override protected Request getRequest(Object[] args) { - final HttpChannel channel = (HttpChannel) args[0]; + final Object httpChannelObject = args[0]; + if (!(httpChannelObject instanceof HttpChannel)) { + return null; + } + final HttpChannel channel = (HttpChannel) httpChannelObject; final Request request = channel.getRequest(); return request; } diff --git a/plugins/json-lib/src/main/java/com/navercorp/pinpoint/plugin/json_lib/interceptor/ParsingInterceptor.java b/plugins/json-lib/src/main/java/com/navercorp/pinpoint/plugin/json_lib/interceptor/ParsingInterceptor.java index 44db0648e..e9ded1885 100644 --- a/plugins/json-lib/src/main/java/com/navercorp/pinpoint/plugin/json_lib/interceptor/ParsingInterceptor.java +++ b/plugins/json-lib/src/main/java/com/navercorp/pinpoint/plugin/json_lib/interceptor/ParsingInterceptor.java @@ -69,8 +69,7 @@ public class ParsingInterceptor implements AroundInterceptor { recorder.recordServiceType(JsonLibConstants.SERVICE_TYPE); recorder.recordApi(descriptor); recorder.recordException(throwable); - - if (args.length > 0 && args[0] instanceof String) { + if (args != null && args.length > 0 && args[0] instanceof String) { recorder.recordAttribute(JsonLibConstants.JSON_LIB_ANNOTATION_KEY_JSON_LENGTH, ((String) args[0]).length()); } } finally { diff --git a/plugins/okhttp/src/main/java/com/navercorp/pinpoint/plugin/okhttp/interceptor/DispatcherEnqueueMethodInterceptor.java b/plugins/okhttp/src/main/java/com/navercorp/pinpoint/plugin/okhttp/interceptor/DispatcherEnqueueMethodInterceptor.java index a71be0e3c..f0da4fc7a 100644 --- a/plugins/okhttp/src/main/java/com/navercorp/pinpoint/plugin/okhttp/interceptor/DispatcherEnqueueMethodInterceptor.java +++ b/plugins/okhttp/src/main/java/com/navercorp/pinpoint/plugin/okhttp/interceptor/DispatcherEnqueueMethodInterceptor.java @@ -67,6 +67,7 @@ public class DispatcherEnqueueMethodInterceptor implements AroundInterceptor { recorder.recordNextAsyncId(asyncTraceId.getAsyncId()); // set async id. + // AsyncTraceIdAccessor typeCheck validate(); ((AsyncTraceIdAccessor)args[0])._$PINPOINT$_setAsyncTraceId(asyncTraceId); if (isDebug) { logger.debug("Set asyncTraceId metadata {}", asyncTraceId); diff --git a/plugins/okhttp/src/main/java/com/navercorp/pinpoint/plugin/okhttp/interceptor/HttpEngineReadResponseMethodInterceptor.java b/plugins/okhttp/src/main/java/com/navercorp/pinpoint/plugin/okhttp/interceptor/HttpEngineReadResponseMethodInterceptor.java index 785c8b6ff..faaa8c1e8 100644 --- a/plugins/okhttp/src/main/java/com/navercorp/pinpoint/plugin/okhttp/interceptor/HttpEngineReadResponseMethodInterceptor.java +++ b/plugins/okhttp/src/main/java/com/navercorp/pinpoint/plugin/okhttp/interceptor/HttpEngineReadResponseMethodInterceptor.java @@ -104,6 +104,7 @@ public class HttpEngineReadResponseMethodInterceptor implements AroundIntercepto recorder.recordException(throwable); if (statusCode) { + // type check validate(); Response response = ((UserResponseGetter) target)._$PINPOINT$_getUserResponse(); if (response != null) { recorder.recordAttribute(AnnotationKey.HTTP_STATUS_CODE, response.code()); diff --git a/plugins/okhttp/src/main/java/com/navercorp/pinpoint/plugin/okhttp/interceptor/HttpEngineSendRequestMethodInterceptor.java b/plugins/okhttp/src/main/java/com/navercorp/pinpoint/plugin/okhttp/interceptor/HttpEngineSendRequestMethodInterceptor.java index a16101aa9..aa30d7981 100644 --- a/plugins/okhttp/src/main/java/com/navercorp/pinpoint/plugin/okhttp/interceptor/HttpEngineSendRequestMethodInterceptor.java +++ b/plugins/okhttp/src/main/java/com/navercorp/pinpoint/plugin/okhttp/interceptor/HttpEngineSendRequestMethodInterceptor.java @@ -143,7 +143,7 @@ public class HttpEngineSendRequestMethodInterceptor implements AroundInterceptor SpanEventRecorder recorder = trace.currentSpanEventRecorder(); recorder.recordApi(methodDescriptor); recorder.recordException(throwable); - + // typeCheck validate(); Request request = ((UserRequestGetter) target)._$PINPOINT$_getUserRequest(); if (request != null) { try { diff --git a/plugins/okhttp/src/main/java/com/navercorp/pinpoint/plugin/okhttp/interceptor/RequestBuilderBuildMethodBackwardCompatibilityInterceptor.java b/plugins/okhttp/src/main/java/com/navercorp/pinpoint/plugin/okhttp/interceptor/RequestBuilderBuildMethodBackwardCompatibilityInterceptor.java index 054710470..b813a97f8 100644 --- a/plugins/okhttp/src/main/java/com/navercorp/pinpoint/plugin/okhttp/interceptor/RequestBuilderBuildMethodBackwardCompatibilityInterceptor.java +++ b/plugins/okhttp/src/main/java/com/navercorp/pinpoint/plugin/okhttp/interceptor/RequestBuilderBuildMethodBackwardCompatibilityInterceptor.java @@ -60,6 +60,9 @@ public class RequestBuilderBuildMethodBackwardCompatibilityInterceptor implement } try { + if (!(target instanceof Request.Builder)) { + return; + } final Request.Builder builder = ((Request.Builder) target); if (!trace.canSampled()) { if (isDebug) { diff --git a/plugins/okhttp/src/main/java/com/navercorp/pinpoint/plugin/okhttp/interceptor/RequestBuilderBuildMethodInterceptor.java b/plugins/okhttp/src/main/java/com/navercorp/pinpoint/plugin/okhttp/interceptor/RequestBuilderBuildMethodInterceptor.java index 462f14dbb..ed117cb57 100644 --- a/plugins/okhttp/src/main/java/com/navercorp/pinpoint/plugin/okhttp/interceptor/RequestBuilderBuildMethodInterceptor.java +++ b/plugins/okhttp/src/main/java/com/navercorp/pinpoint/plugin/okhttp/interceptor/RequestBuilderBuildMethodInterceptor.java @@ -58,6 +58,9 @@ public class RequestBuilderBuildMethodInterceptor implements AroundInterceptor { } try { + if(!(target instanceof Request.Builder)) { + return; + } final Request.Builder builder = ((Request.Builder) target); if (!trace.canSampled()) { if (isDebug) { diff --git a/plugins/postgresql-jdbc/src/main/java/com/navercorp/pinpoint/plugin/jdbc/postgresql/interceptor/PostgreSQLConnectionCreateInterceptor.java b/plugins/postgresql-jdbc/src/main/java/com/navercorp/pinpoint/plugin/jdbc/postgresql/interceptor/PostgreSQLConnectionCreateInterceptor.java index 6adbd7a71..58ac88164 100644 --- a/plugins/postgresql-jdbc/src/main/java/com/navercorp/pinpoint/plugin/jdbc/postgresql/interceptor/PostgreSQLConnectionCreateInterceptor.java +++ b/plugins/postgresql-jdbc/src/main/java/com/navercorp/pinpoint/plugin/jdbc/postgresql/interceptor/PostgreSQLConnectionCreateInterceptor.java @@ -56,9 +56,6 @@ public class PostgreSQLConnectionCreateInterceptor implements AroundInterceptor return; } - for(Object o:args) { - logger.info("test: "+o.toString()); - } Properties properties = getProperties(args[3]); diff --git a/plugins/postgresql-jdbc/src/main/java/com/navercorp/pinpoint/plugin/jdbc/postgresql/interceptor/PostgreSqlPreparedStatementCreateInterceptor1.java b/plugins/postgresql-jdbc/src/main/java/com/navercorp/pinpoint/plugin/jdbc/postgresql/interceptor/PostgreSqlPreparedStatementCreateInterceptor1.java index 73526cd3d..41b432f32 100644 --- a/plugins/postgresql-jdbc/src/main/java/com/navercorp/pinpoint/plugin/jdbc/postgresql/interceptor/PostgreSqlPreparedStatementCreateInterceptor1.java +++ b/plugins/postgresql-jdbc/src/main/java/com/navercorp/pinpoint/plugin/jdbc/postgresql/interceptor/PostgreSqlPreparedStatementCreateInterceptor1.java @@ -39,8 +39,11 @@ public class PostgreSqlPreparedStatementCreateInterceptor1 extends SpanEventSimp @Override public void doInBeforeTrace(SpanEventRecorder recorder, Object target, Object[] args) { - DatabaseInfo databaseInfo = (target instanceof DatabaseInfoAccessor) ? ((DatabaseInfoAccessor)target)._$PINPOINT$_getDatabaseInfo() : null; - + DatabaseInfo databaseInfo = null; + if (target instanceof DatabaseInfoAccessor) { + databaseInfo = ((DatabaseInfoAccessor)target)._$PINPOINT$_getDatabaseInfo(); + } + if (databaseInfo == null) { databaseInfo = UnKnownDatabaseInfo.INSTANCE; } @@ -56,7 +59,7 @@ public class PostgreSqlPreparedStatementCreateInterceptor1 extends SpanEventSimp if (success) { if (target instanceof DatabaseInfoAccessor) { // set databaseInfo to PreparedStatement only when preparedStatement is generated successfully. - DatabaseInfo databaseInfo = ((DatabaseInfoAccessor)target)._$PINPOINT$_getDatabaseInfo(); + final DatabaseInfo databaseInfo = ((DatabaseInfoAccessor)target)._$PINPOINT$_getDatabaseInfo(); if (databaseInfo != null) { if (result instanceof DatabaseInfoAccessor) { ((DatabaseInfoAccessor)result)._$PINPOINT$_setDatabaseInfo(databaseInfo); @@ -67,7 +70,7 @@ public class PostgreSqlPreparedStatementCreateInterceptor1 extends SpanEventSimp // 1. Don't check traceContext. preparedStatement can be created in other thread. // 2. While sampling is active, the thread which creates preparedStatement could not be a sampling target. So record sql anyway. String sql = (String) args[0]; - ParsingResult parsingResult = traceContext.parseSql(sql); + final ParsingResult parsingResult = traceContext.parseSql(sql); if (parsingResult != null) { ((ParsingResultAccessor)result)._$PINPOINT$_setParsingResult(parsingResult); } else { diff --git a/plugins/postgresql-jdbc/src/main/java/com/navercorp/pinpoint/plugin/jdbc/postgresql/interceptor/PostgreSqlPreparedStatementCreateInterceptor2.java b/plugins/postgresql-jdbc/src/main/java/com/navercorp/pinpoint/plugin/jdbc/postgresql/interceptor/PostgreSqlPreparedStatementCreateInterceptor2.java index adf5e6f95..2225174fc 100644 --- a/plugins/postgresql-jdbc/src/main/java/com/navercorp/pinpoint/plugin/jdbc/postgresql/interceptor/PostgreSqlPreparedStatementCreateInterceptor2.java +++ b/plugins/postgresql-jdbc/src/main/java/com/navercorp/pinpoint/plugin/jdbc/postgresql/interceptor/PostgreSqlPreparedStatementCreateInterceptor2.java @@ -42,8 +42,11 @@ public class PostgreSqlPreparedStatementCreateInterceptor2 extends SpanEventSimp @Override public void doInBeforeTrace(SpanEventRecorder recorder, Object target, Object[] args) { - DatabaseInfo databaseInfo = (target instanceof DatabaseInfoAccessor) ? ((DatabaseInfoAccessor)target)._$PINPOINT$_getDatabaseInfo() : null; - + DatabaseInfo databaseInfo = null; + if (target instanceof DatabaseInfoAccessor) { + databaseInfo = ((DatabaseInfoAccessor)target)._$PINPOINT$_getDatabaseInfo(); + } + if (databaseInfo == null) { databaseInfo = UnKnownDatabaseInfo.INSTANCE; } diff --git a/plugins/postgresql-jdbc/src/main/java/com/navercorp/pinpoint/plugin/jdbc/postgresql/interceptor/PostgreSqlPreparedStatementCreateInterceptor3.java b/plugins/postgresql-jdbc/src/main/java/com/navercorp/pinpoint/plugin/jdbc/postgresql/interceptor/PostgreSqlPreparedStatementCreateInterceptor3.java index 71dd596d0..e862fd1aa 100644 --- a/plugins/postgresql-jdbc/src/main/java/com/navercorp/pinpoint/plugin/jdbc/postgresql/interceptor/PostgreSqlPreparedStatementCreateInterceptor3.java +++ b/plugins/postgresql-jdbc/src/main/java/com/navercorp/pinpoint/plugin/jdbc/postgresql/interceptor/PostgreSqlPreparedStatementCreateInterceptor3.java @@ -39,8 +39,11 @@ public class PostgreSqlPreparedStatementCreateInterceptor3 extends SpanEventSimp @Override public void doInBeforeTrace(SpanEventRecorder recorder, Object target, Object[] args) { - DatabaseInfo databaseInfo = (target instanceof DatabaseInfoAccessor) ? ((DatabaseInfoAccessor)target)._$PINPOINT$_getDatabaseInfo() : null; - + DatabaseInfo databaseInfo = null; + if (target instanceof DatabaseInfoAccessor) { + databaseInfo = ((DatabaseInfoAccessor)target)._$PINPOINT$_getDatabaseInfo(); + } + if (databaseInfo == null) { databaseInfo = UnKnownDatabaseInfo.INSTANCE; } diff --git a/plugins/thrift/src/main/java/com/navercorp/pinpoint/plugin/thrift/interceptor/server/ProcessFunctionProcessInterceptor.java b/plugins/thrift/src/main/java/com/navercorp/pinpoint/plugin/thrift/interceptor/server/ProcessFunctionProcessInterceptor.java index d5860e786..102a3b0d1 100644 --- a/plugins/thrift/src/main/java/com/navercorp/pinpoint/plugin/thrift/interceptor/server/ProcessFunctionProcessInterceptor.java +++ b/plugins/thrift/src/main/java/com/navercorp/pinpoint/plugin/thrift/interceptor/server/ProcessFunctionProcessInterceptor.java @@ -93,9 +93,11 @@ public class ProcessFunctionProcessInterceptor implements AroundInterceptor { logger.afterInterceptor(target, args, result, throwable); } // Unset server marker - Object iprot = args[1]; - if (validateInputProtocol(iprot)) { - ((ServerMarkerFlagFieldAccessor)iprot)._$PINPOINT$_setServerMarkerFlag(false); + if (args.length != 4) { + Object iprot = args[1]; + if (validateInputProtocol(iprot)) { + ((ServerMarkerFlagFieldAccessor) iprot)._$PINPOINT$_setServerMarkerFlag(false); + } } } diff --git a/plugins/thrift/src/main/java/com/navercorp/pinpoint/plugin/thrift/interceptor/server/nonblocking/FrameBufferTransportInjectInterceptor.java b/plugins/thrift/src/main/java/com/navercorp/pinpoint/plugin/thrift/interceptor/server/nonblocking/FrameBufferTransportInjectInterceptor.java index b48248d78..b2d2e334c 100644 --- a/plugins/thrift/src/main/java/com/navercorp/pinpoint/plugin/thrift/interceptor/server/nonblocking/FrameBufferTransportInjectInterceptor.java +++ b/plugins/thrift/src/main/java/com/navercorp/pinpoint/plugin/thrift/interceptor/server/nonblocking/FrameBufferTransportInjectInterceptor.java @@ -74,13 +74,15 @@ public abstract class FrameBufferTransportInjectInterceptor implements AroundInt // Retrieve the socket information from the trans_ field of the given instance. protected final Socket getRootSocket(Object target) { - TNonblockingTransport inTrans = ((TNonblockingTransportFieldGetter)target)._$PINPOINT$_getTNonblockingTransport(); - if (inTrans != null) { - if (inTrans instanceof SocketFieldAccessor) { - return ((SocketFieldAccessor)inTrans)._$PINPOINT$_getSocket(); - } else { - if (isDebug) { - logger.debug("Invalid target object. Need field accessor({}).", SocketFieldAccessor.class.getName()); + if (target instanceof TNonblockingTransportFieldGetter) { + TNonblockingTransport inTrans = ((TNonblockingTransportFieldGetter) target)._$PINPOINT$_getTNonblockingTransport(); + if (inTrans != null) { + if (inTrans instanceof SocketFieldAccessor) { + return ((SocketFieldAccessor) inTrans)._$PINPOINT$_getSocket(); + } else { + if (isDebug) { + logger.debug("Invalid target object. Need field accessor({}).", SocketFieldAccessor.class.getName()); + } } } } diff --git a/plugins/tomcat/src/main/java/com/navercorp/pinpoint/plugin/tomcat/interceptor/ConnectorInitializeInterceptor.java b/plugins/tomcat/src/main/java/com/navercorp/pinpoint/plugin/tomcat/interceptor/ConnectorInitializeInterceptor.java index 3d955d71f..9e961e25e 100644 --- a/plugins/tomcat/src/main/java/com/navercorp/pinpoint/plugin/tomcat/interceptor/ConnectorInitializeInterceptor.java +++ b/plugins/tomcat/src/main/java/com/navercorp/pinpoint/plugin/tomcat/interceptor/ConnectorInitializeInterceptor.java @@ -47,8 +47,9 @@ public class ConnectorInitializeInterceptor implements AroundInterceptor { if (isDebug) { logger.afterInterceptor(target, args, result, throwable); } - - Connector connector = (Connector)target; - this.traceContext.getServerMetaDataHolder().addConnector(connector.getProtocol(), connector.getPort()); + if (target instanceof Connector) { + final Connector connector = (Connector) target; + this.traceContext.getServerMetaDataHolder().addConnector(connector.getProtocol(), connector.getPort()); + } } } diff --git a/plugins/tomcat/src/main/java/com/navercorp/pinpoint/plugin/tomcat/interceptor/RequestStartAsyncInterceptor.java b/plugins/tomcat/src/main/java/com/navercorp/pinpoint/plugin/tomcat/interceptor/RequestStartAsyncInterceptor.java index 5fe881f2a..07f66596b 100644 --- a/plugins/tomcat/src/main/java/com/navercorp/pinpoint/plugin/tomcat/interceptor/RequestStartAsyncInterceptor.java +++ b/plugins/tomcat/src/main/java/com/navercorp/pinpoint/plugin/tomcat/interceptor/RequestStartAsyncInterceptor.java @@ -77,6 +77,7 @@ public class RequestStartAsyncInterceptor implements AroundInterceptor { final AsyncTraceId asyncTraceId = trace.getAsyncTraceId(); recorder.recordNextAsyncId(asyncTraceId.getAsyncId()); // result is BasicFuture + // type check validate() ((AsyncTraceIdAccessor)result)._$PINPOINT$_setAsyncTraceId(asyncTraceId); if (isDebug) { logger.debug("Set asyncTraceId metadata {}", asyncTraceId); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/sender/StandbySpanStreamDataSendWorker.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/sender/StandbySpanStreamDataSendWorker.java index 2bed133be..bbdd2ad33 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/sender/StandbySpanStreamDataSendWorker.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/sender/StandbySpanStreamDataSendWorker.java @@ -16,13 +16,12 @@ package com.navercorp.pinpoint.profiler.sender; -import java.util.List; -import java.util.concurrent.ThreadFactory; - +import com.navercorp.pinpoint.common.util.PinpointThreadFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.navercorp.pinpoint.common.util.PinpointThreadFactory; +import java.util.List; +import java.util.concurrent.ThreadFactory; /** * @author Taejin Koo @@ -37,8 +36,8 @@ public class StandbySpanStreamDataSendWorker implements Runnable { private final StandbySpanStreamDataStorage standbySpanStreamDataStorage; private final long blockTime; - private final Thread workerThread; private final Object lock = new Object(); + private Thread workerThread; private boolean isStarted = false; @@ -50,34 +49,34 @@ public class StandbySpanStreamDataSendWorker implements Runnable { this.flushHandler = flushHandler; this.standbySpanStreamDataStorage = dataStorage; this.blockTime = blockTime; - - final ThreadFactory threadFactory = new PinpointThreadFactory(this.getClass().getSimpleName(), true); - this.workerThread = threadFactory.newThread(this); } public void start() { - logger.info("{} initialization started.", this.getClass().getSimpleName()); + final ThreadFactory threadFactory = new PinpointThreadFactory(this.getClass().getSimpleName(), true); + this.workerThread = threadFactory.newThread(this); + + logger.info("start() started."); if (!workerThread.isAlive()) { this.isStarted = true; this.workerThread.start(); - logger.info("{} initialization completed.", this.getClass().getSimpleName()); + logger.info("start() completed."); } else { - logger.info("{} already started.", this.getClass().getSimpleName()); + logger.info("start() failed. caused:already started.", this.getClass().getSimpleName()); } } public void stop() { - logger.info("{} destroying started.", this.getClass().getSimpleName()); + logger.info("stop() started."); this.isStarted = false; long startTimeMillis = System.currentTimeMillis(); long maxWaitTimeMillis = 3000; - while (this.workerThread.isAlive()) { - this.workerThread.interrupt(); + while (workerThread != null && workerThread.isAlive()) { + workerThread.interrupt(); try { - this.workerThread.join(100L); + workerThread.join(100L); if (System.currentTimeMillis() - startTimeMillis > maxWaitTimeMillis) { break; @@ -86,7 +85,7 @@ public class StandbySpanStreamDataSendWorker implements Runnable { } } - logger.info("{} destroying completed.", this.getClass().getSimpleName()); + logger.info("stop() completed."); } boolean addStandbySpanStreamData(SpanStreamSendData standbySpanStreamData) { diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/sender/StandbySpanStreamDataStorage.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/sender/StandbySpanStreamDataStorage.java index 3ea516c31..42be7d47c 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/sender/StandbySpanStreamDataStorage.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/sender/StandbySpanStreamDataStorage.java @@ -53,7 +53,7 @@ public class StandbySpanStreamDataStorage { return false; } - if (standbySpanStreamData.getAvailableBufferCapacity() > 0 && standbySpanStreamData.getAvailableBufferCapacity() > 0) { + if (standbySpanStreamData.getAvailableBufferCapacity() > 0 && standbySpanStreamData.getAvailableGatheringComponentsCount() > 0) { if (priorityQueue.size() >= capacity) { return false; } diff --git a/profiler/src/test/java/com/navercorp/pinpoint/profiler/AgentInfoSenderTest.java b/profiler/src/test/java/com/navercorp/pinpoint/profiler/AgentInfoSenderTest.java index 453b7cb17..d91ced2eb 100644 --- a/profiler/src/test/java/com/navercorp/pinpoint/profiler/AgentInfoSenderTest.java +++ b/profiler/src/test/java/com/navercorp/pinpoint/profiler/AgentInfoSenderTest.java @@ -76,7 +76,9 @@ public class AgentInfoSenderTest { try { agentInfoSender.start(); - Thread.sleep(1000L); + while (requestCount.get() < 1) { + Thread.sleep(1000L); + } } finally { closeAll(serverAcceptor, agentInfoSender, pinpointClient, clientFactory); } @@ -103,7 +105,9 @@ public class AgentInfoSenderTest { try { agentInfoSender.start(); - Thread.sleep(agentInfoSendRetryIntervalMs * expectedTriesUntilSuccess); + while (requestCount.get() < expectedTriesUntilSuccess) { + Thread.sleep(1000L); + } } finally { closeAll(serverAcceptor, agentInfoSender, pinpointClient, socketFactory); } @@ -116,7 +120,7 @@ public class AgentInfoSenderTest { final AtomicInteger requestCount = new AtomicInteger(); final AtomicInteger successCount = new AtomicInteger(); final long agentInfoSendRetryIntervalMs = 100L; - final int expectedTriesUntilSuccess = 15; + final int expectedTriesUntilSuccess = AgentInfoSender.DEFAULT_MAX_TRY_COUNT_PER_ATTEMPT * 5; ResponseServerMessageListener serverListener = new ResponseServerMessageListener(requestCount, successCount, expectedTriesUntilSuccess); @@ -130,7 +134,9 @@ public class AgentInfoSenderTest { try { agentInfoSender.start(); - Thread.sleep(agentInfoSendRetryIntervalMs * expectedTriesUntilSuccess); + while (requestCount.get() < expectedTriesUntilSuccess) { + Thread.sleep(1000L); + } } finally { closeAll(serverAcceptor, agentInfoSender, pinpointClient, socketFactory); } @@ -140,15 +146,17 @@ public class AgentInfoSenderTest { @Test public void agentInfoShouldRetryUntilAttemptsAreExhaustedWhenRefreshing() throws InterruptedException { - final AtomicInteger requestCount = new AtomicInteger(); + final AtomicInteger successServerRequestCount = new AtomicInteger(); + final AtomicInteger failServerRequestCount = new AtomicInteger(); final AtomicInteger successCount = new AtomicInteger(); final long agentInfoSendRetryIntervalMs = 100L; final long agentInfoSendRefreshIntervalMs = 1000L; - final int expectedTries = AgentInfoSender.DEFAULT_MAX_TRY_COUNT_PER_ATTEMPT + 1; + final int expectedSuccessServerTries = 1; + final int expectedFailServerTries = AgentInfoSender.DEFAULT_MAX_TRY_COUNT_PER_ATTEMPT; final CountDownLatch agentReconnectLatch = new CountDownLatch(1); - ResponseServerMessageListener successServerListener = new ResponseServerMessageListener(requestCount, successCount); - ResponseServerMessageListener failServerListener = new ResponseServerMessageListener(requestCount, successCount, Integer.MAX_VALUE); + ResponseServerMessageListener successServerListener = new ResponseServerMessageListener(successServerRequestCount, successCount); + ResponseServerMessageListener failServerListener = new ResponseServerMessageListener(failServerRequestCount, successCount, Integer.MAX_VALUE); PinpointServerAcceptor successServerAcceptor = createServerAcceptor(successServerListener); PinpointServerAcceptor failServerAcceptor = null; @@ -169,48 +177,83 @@ public class AgentInfoSenderTest { .build(); try { agentInfoSender.start(); - Thread.sleep(agentInfoSendRetryIntervalMs); + while (successServerRequestCount.get() < expectedSuccessServerTries) { + Thread.sleep(agentInfoSendRetryIntervalMs); + } successServerAcceptor.close(); - // wait till agent reconnects failServerAcceptor = createServerAcceptor(failServerListener); + // wait till agent reconnects agentReconnectLatch.await(); - Thread.sleep(agentInfoSendRefreshIntervalMs); + while (failServerRequestCount.get() < expectedFailServerTries) { + Thread.sleep(agentInfoSendRefreshIntervalMs); + } + failServerAcceptor.close(); } finally { - closeAll(failServerAcceptor, agentInfoSender, pinpointClient, socketFactory); + closeAll(null, agentInfoSender, pinpointClient, socketFactory); } assertEquals(1, successCount.get()); - assertEquals(expectedTries, requestCount.get()); + assertEquals(expectedSuccessServerTries, successServerRequestCount.get()); + assertEquals(expectedFailServerTries, failServerRequestCount.get()); } @Test - public void agentInfoShouldBeSentOnlyOnceEvenAfterReconnect() throws InterruptedException { + public void agentInfoShouldBeSentOnlyOnceEvenAfterReconnect() throws Exception { final AtomicInteger requestCount = new AtomicInteger(); final AtomicInteger successCount = new AtomicInteger(); + final AtomicInteger reconnectCount = new AtomicInteger(); + final int expectedReconnectCount = 3; final long agentInfoSendRetryIntervalMs = 100L; final int maxTryCountPerAttempt = Integer.MAX_VALUE; + final CyclicBarrier reconnectEventBarrier = new CyclicBarrier(2); + ResponseServerMessageListener serverListener = new ResponseServerMessageListener(requestCount, successCount); + PinpointServerAcceptor serverAcceptor = createServerAcceptor(serverListener); + PinpointClientFactory clientFactory = createPinpointClientFactory(); PinpointClient pinpointClient = ClientFactoryUtils.createPinpointClient(HOST, PORT, clientFactory); TcpDataSender dataSender = new TcpDataSender(pinpointClient); + dataSender.addReconnectEventListener(new PinpointClientReconnectEventListener() { + @Override + public void reconnectPerformed(PinpointClient client) { + reconnectCount.incrementAndGet(); + try { + reconnectEventBarrier.await(); + } catch (Exception e) { + // just fail + throw new RuntimeException(e); + } + } + }); AgentInfoSender agentInfoSender = new AgentInfoSender.Builder(dataSender, getAgentInfo()) .sendInterval(agentInfoSendRetryIntervalMs) .maxTryPerAttempt(maxTryCountPerAttempt) .build(); try { + // initial connect agentInfoSender.start(); - createAndDeleteServer(serverListener, 1000L); - Thread.sleep(500L); - createAndDeleteServer(serverListener, 1000L); - Thread.sleep(500L); - createAndDeleteServer(serverListener, 1000L); + while (requestCount.get() < 1) { + Thread.sleep(1000L); + } + serverAcceptor.close(); + // reconnect + for (int i = 0; i < expectedReconnectCount; ++i) { + PinpointServerAcceptor reconnectServerAcceptor = createServerAcceptor(serverListener); + // wait for agent to reconnect + reconnectEventBarrier.await(); + // wait to see if AgentInfo is sent again (it shouldn't) + Thread.sleep(1000L); + reconnectServerAcceptor.close(); + reconnectEventBarrier.reset(); + } } finally { closeAll(null, agentInfoSender, pinpointClient, clientFactory); } assertEquals(1, successCount.get()); + assertEquals(expectedReconnectCount, reconnectCount.get()); } @Test @@ -218,7 +261,7 @@ public class AgentInfoSenderTest { final AtomicInteger requestCount = new AtomicInteger(); final AtomicInteger successCount = new AtomicInteger(); final long agentInfoSendRetryIntervalMs = 100L; - final long agentInfoSendRefreshIntervalMs = 1000L; + final long agentInfoSendRefreshIntervalMs = 100L; final int expectedRefreshCount = 5; ResponseServerMessageListener serverListener = new ResponseServerMessageListener(requestCount, successCount); @@ -236,7 +279,9 @@ public class AgentInfoSenderTest { try { agentInfoSender.start(); - Thread.sleep(agentInfoSendRefreshIntervalMs * expectedRefreshCount); + while (requestCount.get() < expectedRefreshCount) { + Thread.sleep(1000L); + } } finally { closeAll(serverAcceptor, agentInfoSender, pinpointClient, socketFactory); } diff --git a/rpc/src/main/java/com/navercorp/pinpoint/rpc/client/DefaultPinpointClientHandler.java b/rpc/src/main/java/com/navercorp/pinpoint/rpc/client/DefaultPinpointClientHandler.java index d7433fd8a..db258e805 100644 --- a/rpc/src/main/java/com/navercorp/pinpoint/rpc/client/DefaultPinpointClientHandler.java +++ b/rpc/src/main/java/com/navercorp/pinpoint/rpc/client/DefaultPinpointClientHandler.java @@ -65,7 +65,6 @@ public class DefaultPinpointClientHandler extends SimpleChannelHandler implement private long timeoutMillis = DEFAULT_TIMEOUTMILLIS; private long pingDelay = DEFAULT_PING_DELAY; - private long handshakeRetryInterval = DEFAULT_ENABLE_WORKER_PACKET_DELAY; private int maxHandshakeCount = DEFAULT_ENABLE_WORKER_PACKET_RETRY_COUNT; private final Timer channelTimer; diff --git a/rpc/src/main/java/com/navercorp/pinpoint/rpc/client/PinpointClientHandshaker.java b/rpc/src/main/java/com/navercorp/pinpoint/rpc/client/PinpointClientHandshaker.java index 8af4db71b..543ad22a7 100644 --- a/rpc/src/main/java/com/navercorp/pinpoint/rpc/client/PinpointClientHandshaker.java +++ b/rpc/src/main/java/com/navercorp/pinpoint/rpc/client/PinpointClientHandshaker.java @@ -79,20 +79,20 @@ public class PinpointClientHandshaker { } public void handshakeStart(Channel channel, Map handshakeData) { - logger.info("{} handshakeStart method started. channel:{}", simpleClassNameAndHashCodeString(), channel); + logger.info("{} handshakeStart() started. channel:{}", simpleClassNameAndHashCodeString(), channel); if (channel == null) { - logger.warn("{} handshakeStart method failed. caused:channel may not be null.", simpleClassNameAndHashCodeString()); + logger.warn("{} handshakeStart() failed. caused:channel may not be null.", simpleClassNameAndHashCodeString()); return; } if (!channel.isConnected()) { - logger.warn("{} handshakeStart method failed. caused:channel is not connected.", simpleClassNameAndHashCodeString()); + logger.warn("{} handshakeStart() failed. caused:channel is not connected.", simpleClassNameAndHashCodeString()); return; } if (!state.compareAndSet(STATE_INIT, STATE_STARTED)) { - logger.warn("{} handshakeStart method failed. caused:unexpected state.", simpleClassNameAndHashCodeString()); + logger.warn("{} handshakeStart() failed. caused:unexpected state.", simpleClassNameAndHashCodeString()); return; } @@ -104,14 +104,14 @@ public class PinpointClientHandshaker { } if (handshakeJob == null) { - logger.warn("{} handshakeStart method failed. caused:handshakeJob may not be null.", simpleClassNameAndHashCodeString()); + logger.warn("{} handshakeStart() failed. caused:handshakeJob may not be null.", simpleClassNameAndHashCodeString()); handshakeAbort(); return; } handshake(handshakeJob); reserveHandshake(handshakeJob); - logger.info("{} handshakeStart method completed. channel:{}, data:{}", simpleClassNameAndHashCodeString(), channel, handshakeData); + logger.info("{} handshakeStart() completed. channel:{}, data:{}", simpleClassNameAndHashCodeString(), channel, handshakeData); } private HandshakeJob createHandshakeJob(Channel channel, Map handshakeData) throws ProtocolException { @@ -136,22 +136,22 @@ public class PinpointClientHandshaker { private void reserveHandshake(HandshakeJob handshake) { if (handshakeCount.get() >= maxHandshakeCount) { - logger.warn("{} reserveHandshake method failed. caused:Retry count is over({}/{}).", simpleClassNameAndHashCodeString(), handshakeCount.get(), maxHandshakeCount); + logger.warn("{} reserveHandshake() failed. caused:Retry count is over({}/{}).", simpleClassNameAndHashCodeString(), handshakeCount.get(), maxHandshakeCount); handshakeAbort(); return; } - logger.debug("{} reserveHandshake method started.", simpleClassNameAndHashCodeString()); + logger.debug("{} reserveHandshake() started.", simpleClassNameAndHashCodeString()); this.handshakerTimer.newTimeout(handshake, retryInterval, TimeUnit.MILLISECONDS); } public boolean handshakeComplete(ControlHandshakeResponsePacket responsePacket) { - logger.info("{} handshakeComplete method started. responsePacket:{}", simpleClassNameAndHashCodeString(), responsePacket); + logger.info("{} handshakeComplete() started. responsePacket:{}", simpleClassNameAndHashCodeString(), responsePacket); synchronized (lock) { if (!this.state.compareAndSet(STATE_STARTED, STATE_FINISHED)) { // state can be 0 or 2. - logger.info("{} handshakeComplete method failed. caused:unexpected state.", simpleClassNameAndHashCodeString()); + logger.info("{} handshakeComplete() failed. caused:unexpected state.", simpleClassNameAndHashCodeString()); this.state.set(STATE_FINISHED); return false; } @@ -164,7 +164,7 @@ public class PinpointClientHandshaker { ClusterOption clusterOption = getClusterOption(handshakeResponse); this.clusterOption.compareAndSet(null, clusterOption); - logger.info("{} handshakeComplete method completed. handshake-response:{}.", simpleClassNameAndHashCodeString(), handshakeResponse); + logger.info("{} handshakeComplete() completed. handshake-response:{}.", simpleClassNameAndHashCodeString(), handshakeResponse); return true; } } @@ -235,7 +235,7 @@ public class PinpointClientHandshaker { } public void handshakeAbort() { - logger.info("{} handshakeAbort method started.", simpleClassNameAndHashCodeString()); + logger.info("{} handshakeAbort() started.", simpleClassNameAndHashCodeString()); if (!state.compareAndSet(STATE_STARTED, STATE_FINISHED)) { // state can be 0 or 2. @@ -243,7 +243,7 @@ public class PinpointClientHandshaker { this.state.set(STATE_FINISHED); return; } - logger.info("{} handshakeAbort method completed.", simpleClassNameAndHashCodeString()); + logger.info("{} handshakeAbort() completed.", simpleClassNameAndHashCodeString()); } public boolean isRun() { @@ -265,7 +265,7 @@ public class PinpointClientHandshaker { } private boolean isFinished(int currentState) { - return this.state.get() == STATE_FINISHED; + return currentState == STATE_FINISHED; } private int currentState() { diff --git a/rpc/src/main/java/com/navercorp/pinpoint/rpc/util/ClientFactoryUtils.java b/rpc/src/main/java/com/navercorp/pinpoint/rpc/util/ClientFactoryUtils.java index dfd0ad817..24ee04980 100644 --- a/rpc/src/main/java/com/navercorp/pinpoint/rpc/util/ClientFactoryUtils.java +++ b/rpc/src/main/java/com/navercorp/pinpoint/rpc/util/ClientFactoryUtils.java @@ -47,7 +47,7 @@ public final class ClientFactoryUtils { LOGGER.info("tcp connect success. remote:{}", connectAddress); return pinpointClient; } catch (PinpointSocketException e) { - LOGGER.warn("tcp connect fail. retmoe:{} try reconnect, retryCount:{}", connectAddress, i); + LOGGER.warn("tcp connect fail. remote:{} try reconnect, retryCount:{}", connectAddress, i); } } LOGGER.warn("change background tcp connect mode remote:{} ", connectAddress); diff --git a/thrift/findbugs-exclude.xml b/thrift/findbugs-exclude.xml index c1cefb588..c998ac466 100644 --- a/thrift/findbugs-exclude.xml +++ b/thrift/findbugs-exclude.xml @@ -1,3 +1,5 @@ - + + + \ No newline at end of file diff --git a/thrift/src/main/java/com/navercorp/pinpoint/thrift/io/ChunkHeaderTBaseDeserializer.java b/thrift/src/main/java/com/navercorp/pinpoint/thrift/io/ChunkHeaderTBaseDeserializer.java index fd4023675..f2adceef1 100644 --- a/thrift/src/main/java/com/navercorp/pinpoint/thrift/io/ChunkHeaderTBaseDeserializer.java +++ b/thrift/src/main/java/com/navercorp/pinpoint/thrift/io/ChunkHeaderTBaseDeserializer.java @@ -79,9 +79,6 @@ public class ChunkHeaderTBaseDeserializer { } final int validate = validate(header); - if (validate == HeaderUtils.PASS_L4) { - return new L4Packet(header); - } TBase base = locator.tBaseLookup(header.getType()); base.read(protocol); diff --git a/thrift/src/main/java/com/navercorp/pinpoint/thrift/io/HeaderTBaseDeserializer.java b/thrift/src/main/java/com/navercorp/pinpoint/thrift/io/HeaderTBaseDeserializer.java index 660a67af6..f206455f8 100644 --- a/thrift/src/main/java/com/navercorp/pinpoint/thrift/io/HeaderTBaseDeserializer.java +++ b/thrift/src/main/java/com/navercorp/pinpoint/thrift/io/HeaderTBaseDeserializer.java @@ -65,9 +65,6 @@ public class HeaderTBaseDeserializer { base.read(protocol); return base; } - if (validate == HeaderUtils.PASS_L4) { - return new L4Packet(header); - } throw new IllegalStateException("invalid validate " + validate); } finally { trans.clear(); @@ -87,8 +84,6 @@ public class HeaderTBaseDeserializer { TBase base = locator.tBaseLookup(header.getType()); base.read(protocol); tBaseList.add(base); - } else if (validate == HeaderUtils.PASS_L4) { - tBaseList.add(new L4Packet(header)); } else { throw new IllegalStateException("invalid validate " + validate); } diff --git a/thrift/src/main/java/com/navercorp/pinpoint/thrift/io/HeaderUtils.java b/thrift/src/main/java/com/navercorp/pinpoint/thrift/io/HeaderUtils.java index f69223dad..73d822b03 100644 --- a/thrift/src/main/java/com/navercorp/pinpoint/thrift/io/HeaderUtils.java +++ b/thrift/src/main/java/com/navercorp/pinpoint/thrift/io/HeaderUtils.java @@ -21,8 +21,6 @@ package com.navercorp.pinpoint.thrift.io; */ final class HeaderUtils { public static final int OK = Header.SIGNATURE; - // TODO Maybe PASS_L4 should be a modifiable variable - public static final int PASS_L4 = 85; // Udp public static final int FAIL = 0; private HeaderUtils() { @@ -31,9 +29,7 @@ final class HeaderUtils { public static int validateSignature(byte signature) { if (Header.SIGNATURE == signature) { return OK; - } else if (PASS_L4 == signature) { - return PASS_L4; - } + } return FAIL; } } diff --git a/thrift/src/main/java/com/navercorp/pinpoint/thrift/io/L4Packet.java b/thrift/src/main/java/com/navercorp/pinpoint/thrift/io/L4Packet.java deleted file mode 100644 index 08547b938..000000000 --- a/thrift/src/main/java/com/navercorp/pinpoint/thrift/io/L4Packet.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * 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 com.navercorp.pinpoint.thrift.io; - -import org.apache.thrift.TBase; -import org.apache.thrift.TException; -import org.apache.thrift.TFieldIdEnum; -import org.apache.thrift.protocol.TProtocol; - -/** - * @author emeroad - */ -public class L4Packet implements org.apache.thrift.TBase, java.io.Serializable, Cloneable, Comparable { - - private final transient Header header; - - public L4Packet(Header header) { - this.header = header; - } - - public Header getHeader() { - return header; - } - - @Override - public void read(TProtocol tProtocol) throws TException { - } - - @Override - public void write(TProtocol tProtocol) throws TException { - } - - @Override - public TFieldIdEnum fieldForId(int i) { - return null; - } - - @Override - public boolean isSet(TFieldIdEnum tFieldIdEnum) { - return false; - } - - @Override - public Object getFieldValue(TFieldIdEnum tFieldIdEnum) { - return null; - } - - @Override - public void setFieldValue(TFieldIdEnum tFieldIdEnum, Object o) { - } - - @Override - public TBase deepCopy() { - return null; - } - - @Override - public void clear() { - } - - @Override - public int compareTo(L4Packet o) { - return 0; - } -} diff --git a/web/src/main/java/com/navercorp/pinpoint/web/controller/UserGroupController.java b/web/src/main/java/com/navercorp/pinpoint/web/controller/UserGroupController.java index 61e4afc5d..db42f09e4 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/controller/UserGroupController.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/controller/UserGroupController.java @@ -127,7 +127,7 @@ public class UserGroupController { @RequestMapping(value = "/member", method = RequestMethod.POST) @ResponseBody public Map insertUserGroupMember(@RequestBody UserGroupMember userGroupMember) { - if (StringUtils.isEmpty(userGroupMember.getMemberId()) || StringUtils.isEmpty(userGroupMember.getMemberId())) { + if (StringUtils.isEmpty(userGroupMember.getMemberId()) || StringUtils.isEmpty(userGroupMember.getUserGroupId())) { Map result = new HashMap<>(); result.put("errorCode", "500"); result.put("errorMessage", "there is not userGroupId or memberId in params to insert user group member"); diff --git a/web/src/main/webapp/common/services/preference.service.js b/web/src/main/webapp/common/services/preference.service.js index fa052713c..87afc6ee0 100644 --- a/web/src/main/webapp/common/services/preference.service.js +++ b/web/src/main/webapp/common/services/preference.service.js @@ -27,7 +27,8 @@ cst: { periodTypes: ['5m', '20m', '1h', '3h', '6h', '12h', '1d', '2d'], depthList: [ 1, 2, 3, 4, 5, 6, 7, 8], - maxFavorite: 5000 + maxFavorite: 5000, + maxPeriod: 2 } }); @@ -63,6 +64,9 @@ this.getPeriodTypes = function() { return cfg.cst.periodTypes; }; + this.getMaxPeriod = function() { + return cfg.cst.maxPeriod; + } function loadPreference() { diff --git a/web/src/main/webapp/components/angular-motion/.bower.json b/web/src/main/webapp/components/angular-motion/.bower.json deleted file mode 100644 index 061110a83..000000000 --- a/web/src/main/webapp/components/angular-motion/.bower.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "angular-motion", - "description": "AngularMotion - Fancy CSS3 animations for AngularJS 1.2+", - "version": "0.3.2", - "keywords": [ - "angular", - "animation" - ], - "homepage": "https://github.com/mgcrea/angular-motion", - "bugs": "https://github.com/mgcrea/angular-motion/issues", - "author": { - "name": "Olivier Louvignes", - "email": "olivier@mg-crea.com", - "url": "https://github.com/mgcrea" - }, - "repository": { - "type": "git", - "url": "https://github.com/mgcrea/angular-motion.git" - }, - "licenses": [ - { - "type": "MIT" - } - ], - "main": [ - "dist/angular-motion.min.css" - ], - "dependencies": { - "angular": "~1.2.10", - "angular-animate": "~1.2.10" - }, - "devDependencies": { - "bootstrap": ">=3.0.0", - "angular-mocks": "~1.2.10", - "angular-strap": "~2.0.0", - "fastclick": "~0.6.11" - }, - "_release": "0.3.2", - "_resolution": { - "type": "version", - "tag": "v0.3.2", - "commit": "077d33b040bc060599aaee8f417594bb6c7e9a30" - }, - "_source": "git://github.com/mgcrea/angular-motion.git", - "_target": "~0.3.2", - "_originalSource": "angular-motion", - "_direct": true -} \ No newline at end of file diff --git a/web/src/main/webapp/components/angular-motion/.editorconfig b/web/src/main/webapp/components/angular-motion/.editorconfig deleted file mode 100644 index e717f5eb6..000000000 --- a/web/src/main/webapp/components/angular-motion/.editorconfig +++ /dev/null @@ -1,13 +0,0 @@ -# http://editorconfig.org -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.md] -trim_trailing_whitespace = false diff --git a/web/src/main/webapp/components/angular-motion/.gitignore b/web/src/main/webapp/components/angular-motion/.gitignore deleted file mode 100644 index 3699ce372..000000000 --- a/web/src/main/webapp/components/angular-motion/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -.dev/ -.tmp/ -.DS_Store -*.sublime-project -*.sublime-workspace -bower_components/ -node_modules/ -/pages/ -/docs/ -/test/coverage/ -!.gitignore diff --git a/web/src/main/webapp/components/angular-motion/.jshintrc b/web/src/main/webapp/components/angular-motion/.jshintrc deleted file mode 100644 index f6a8ad3f0..000000000 --- a/web/src/main/webapp/components/angular-motion/.jshintrc +++ /dev/null @@ -1,28 +0,0 @@ -{ - "node": true, - "browser": true, - "devel": false, - "esnext": true, - "bitwise": true, - "camelcase": true, - "curly": false, - "eqeqeq": true, - "immed": true, - "indent": 2, - "latedef": true, - "newcap": true, - "noarg": true, - "quotmark": "single", - "regexp": true, - "undef": true, - "unused": false, - "strict": true, - "trailing": true, - "smarttabs": true, - "boss": false, - "eqnull": false, - "expr": true, - "globals": { - "angular": false - } -} diff --git a/web/src/main/webapp/components/angular-motion/.travis.yml b/web/src/main/webapp/components/angular-motion/.travis.yml deleted file mode 100644 index bbf4e4d16..000000000 --- a/web/src/main/webapp/components/angular-motion/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -language: node_js -node_js: - - "0.10" - -before_script: - - export DISPLAY=:99.0 - - export PHANTOMJS_BIN=/usr/local/phantomjs/bin/phantomjs - - sh -e /etc/init.d/xvfb start - - sleep 3 # give xvfb some time to start - - npm install -gq grunt-cli bower coveralls - - bower install --dev - - date --rfc-2822 - -script: - - grunt jshint test build diff --git a/web/src/main/webapp/components/angular-motion/CONTRIBUTING.md b/web/src/main/webapp/components/angular-motion/CONTRIBUTING.md deleted file mode 100644 index f53d48a74..000000000 --- a/web/src/main/webapp/components/angular-motion/CONTRIBUTING.md +++ /dev/null @@ -1,28 +0,0 @@ -# Contributing - -## Important notes -Please don't edit files in the `dist` subdirectory as they are generated via Grunt. You'll find source code in the `src` subdirectory! - -### Code style -Regarding code style like indentation and whitespace, **follow the conventions you see used in the source already.** - -## Modifying the code -First, ensure that you have the latest [Node.js](http://nodejs.org/) and [npm](http://npmjs.org/) installed. - -Test that Grunt's CLI and Bower are installed by running `grunt --version` and `bower --version`. If the commands aren't found, run `npm install -g grunt-cli bower`. For more information about installing the tools, see the [getting started with Grunt guide](http://gruntjs.com/getting-started) or [bower.io](http://bower.io/) respectively. - -1. Fork and clone the repo. -1. Run `npm install` to install all build dependencies (including Grunt). -1. Run `bower install` to install the front-end dependencies. -1. Run `grunt` to grunt this project. - -Assuming that you don't see any red, you're ready to go. Just be sure to run `grunt` after making any changes, to ensure that nothing is broken. - -## Submitting pull requests - -1. Create a new branch, please don't work in your `master` branch directly. -1. Add failing tests for the change you want to make. Run `grunt` to see the tests fail. -1. Fix stuff. -1. Run `grunt` to see if the tests pass. Repeat steps 2-4 until done. -1. Update the documentation to reflect any changes. -1. Push to your fork and submit a pull request. diff --git a/web/src/main/webapp/components/angular-motion/Gruntfile.js b/web/src/main/webapp/components/angular-motion/Gruntfile.js deleted file mode 100644 index 8a68c1305..000000000 --- a/web/src/main/webapp/components/angular-motion/Gruntfile.js +++ /dev/null @@ -1,475 +0,0 @@ -'use strict'; - -// # Globbing -// for performance reasons we're only matching one level down: -// 'test/spec/{,*/}*.js' -// use this if you want to recursively match all subfolders: -// 'test/spec/**/*.js' - -module.exports = function (grunt) { - - // Load grunt tasks automatically - require('load-grunt-tasks')(grunt); - - // Time how long tasks take. Can help when optimizing build times - // require('time-grunt')(grunt); - - // Define the configuration for all the tasks - grunt.initConfig({ - - // Project settings - pkg: require('./package.json'), - bower: require('./bower.json'), - yo: { - src: 'src', - dist: 'dist', - docs: 'docs', - pages: 'pages' - }, - - // Project meta - meta: { - banner: '/**\n' + - ' * <%= pkg.name %>\n' + - ' * @version v<%= pkg.version %> - <%= grunt.template.today("yyyy-mm-dd") %>\n' + - ' * @link <%= pkg.homepage %>\n' + - ' * @author <%= pkg.author.name %> <<%= pkg.author.email %>>\n' + - ' * @license MIT License, http://www.opensource.org/licenses/MIT\n' + - ' */\n' - }, - - // Watches files for changes and runs tasks based on the changed files - watch: { - - styles: { - options: { - spawn: false - }, - files: ['src/{,*/}*.less', 'docs/styles/{,*/}*.less'], - tasks: ['less:dev', 'autoprefixer'] - }, - gruntfile: { - files: ['Gruntfile.js'] - }, - livereload: { - options: { - livereload: '<%= connect.options.livereload %>' - }, - files: [ - '{docs,.dev,.tmp,<%= yo.src %>}/{,*/}{,docs/}*.html', - '{docs,.dev,.tmp,<%= yo.src %>}/{,*/}*.css', - '{docs,.dev,.tmp,<%= yo.src %>}/{,*/}*.js', - '{docs,<%= yo.src %>}/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}' - ] - } - }, - - // The actual grunt server settings - connect: { - options: { - port: 9000, - hostname: '0.0.0.0', - livereload: 35729 - }, - livereload: { - options: { - open: true, - base: ['docs', '.dev', '.tmp', '<%= yo.src %>'] - } - }, - test: { - options: { - port: 9001, - base: ['.tmp', 'test', '<%= yo.src %>'] - } - }, - dist: { - options: { - base: '<%= yo.dist %>' - } - } - }, - - // Make sure code styles are up to par and there are no obvious mistakes - jshint: { - options: { - jshintrc: '.jshintrc', - reporter: require('jshint-stylish') - }, - all: [ - 'Gruntfile.js', - '<%= yo.src %>/scripts/{,*/}*.js' - ], - test: { - options: { - jshintrc: 'test/.jshintrc' - }, - src: ['test/spec/{,*/}*.js'] - } - }, - - // Empties folders to start fresh - clean: { - dist: { - files: [{ - dot: true, - src: [ - '.tmp', - '<%= yo.dist %>/*', - '!<%= yo.dist %>/.git*' - ] - }] - }, - docs: { - files: [{ - dot: true, - src: [ - '.tmp', - '<%= yo.pages %>/*', - '!<%= yo.pages %>/.git*' - ] - }] - }, - server: '.tmp' - }, - - // Compile less stylesheets - less: { - dev: { - options: { - // dumpLineNumbers: 'comments', - }, - files: [{ - expand: true, - flatten: true, - cwd: '<%= yo.src %>/', - src: '{,*/}*.less', - dest: '.tmp/styles/modules/', - ext: '.css' - }, { - src: '<%= yo.src %>/{,*/}*.less', - dest: '.tmp/styles/<%= bower.name %>.css', - }] - }, - dist: { - options: { - cleancss: true - }, - files: [{ - expand: true, - flatten: true, - cwd: '<%= yo.src %>/', - src: '{,*/}*.less', - dest: '.tmp/styles/modules/', - ext: '.min.css' - }, { - src: '<%= yo.src %>/{,*/}*.less', - dest: '.tmp/styles/<%= bower.name %>.min.css', - }] - }, - docs: { - options: { - cleancss: false - }, - files: [{ - expand: true, - cwd: '<%= yo.docs %>/styles/', - src: '*.less', - dest: '.tmp/styles/', - ext: '.css' - }] - } - }, - - // Add vendor prefixed styles - autoprefixer: { - options: { - browsers: ['last 2 versions'] - }, - all: { - files: [{ - expand: true, - cwd: '.tmp/styles/', - src: '{,*/}*.css', - dest: '.tmp/styles/' - }] - } - }, - - // Reads HTML for usemin blocks to enable smart builds that automatically - // concat, minify and revision files. Creates configurations in memory so - // additional tasks can operate on them - useminPrepare: { - html: '<%= yo.docs %>/index.html', - options: { - dest: '<%= yo.pages %>' - } - }, - - // Performs rewrites based on rev and the useminPrepare configuration - usemin: { - html: '<%= yo.pages %>/index.html', - css: ['<%= yo.pages %>/styles/{,*/}*.css'], - options: { - assetsDirs: ['<%= yo.pages %>', '<%= yo.pages %>/images'] - } - }, - - // Embed static ngincludes - nginclude: { - docs: { - files: [{ - src: '<%= yo.docs %>/index.html', - dest: '<%= yo.pages %>/index.html' - }], - options: { - assetsDirs: ['<%= yo.src %>', '<%= yo.docs %>'] - } - } - }, - - // Minify html files - htmlmin: { - options: { - collapseWhitespace: true, - removeComments: false - }, - docs: { - files: [{ - expand: true, - cwd: '<%= yo.pages %>', - src: ['*.html'],//, 'views/{,*/}*.html'], - dest: '<%= yo.pages %>' - }] - } - }, - - // Copies remaining files to places other tasks can use - copy: { - dist: { - files: [{ - expand: true, - cwd: '.tmp/styles/', - dest: '<%= yo.dist %>', - src: '{,*/}*.css' - }] - }, - docs: { - files: [{ - expand: true, - cwd: '<%= yo.docs %>/', - dest: '<%= yo.pages %>', - src: [ - 'images/*', - '1.0/**/*' - ] - }] - } - }, - - // Run some tasks in parallel to speed up the build process - concurrent: { - docs: [ - 'less:docs', - 'uglify:generated', - 'cssmin:generated' - ], - server: [ - 'less:dev' - ], - test: [ - 'less:dev' - ], - dist: [ - 'less:dist', - 'imagemin', - 'svgmin', - 'htmlmin' - ] - }, - - concat: { - // generated: { - // options: { - // banner: '(function(window, document, $, undefined) {\n\'use strict\';\n', - // footer: '\n})(window, document, window.jQuery);\n' - // } - // }, - dist: { - options: { - // Replace all 'use strict' statements in the code with a single one at the top - banner: '(function(window, document, undefined) {\n\'use strict\';\n', - footer: '\n})(window, document);\n', - process: function(src, filepath) { - return '// Source: ' + filepath + '\n' + - src.replace(/(^|\n)[ \t]*('use strict'|"use strict");?\s*/g, '$1'); - } - }, - files: [{ - src: ['<%= yo.src %>/module.js', '<%= yo.src %>/{,*/}*.js'], - dest: '<%= yo.dist %>/<%= pkg.name %>.js' - }, { - src: ['<%= yo.dist %>/modules/{,*/}*.tpl.js'], - dest: '<%= yo.dist %>/<%= pkg.name %>.tpl.js' - }] - }, - banner: { - options: { - banner: '<%= meta.banner %>', - }, - files: [{ - expand: true, - cwd: '<%= yo.dist %>', - src: '{,*/}*.{js,css}', - dest: '<%= yo.dist %>' - }] - }, - docs: { - options: { - banner: '<%= meta.banner %>', - }, - files: [{ - expand: true, - cwd: '<%= yo.pages %>', - src: ['scripts/{demo,docs,angular-strap}*', 'styles/{main}*'], - dest: '<%= yo.pages %>' - }] - } - }, - - // Allow the use of non-minsafe AngularJS files. Automatically makes it - // minsafe compatible so Uglify does not destroy the ng references - ngmin: { - dist: { - files: [{ - src: '<%= yo.dist %>/<%= pkg.name %>.js', - dest: '<%= yo.dist %>/<%= pkg.name %>.js' - }] - }, - modules: { - files: [{ - expand: true, - flatten: true, - cwd: '<%= yo.src %>', - src: '{,*/}*.js', - dest: '<%= yo.dist %>/modules' - }] - }, - docs: { - files: [{ - expand: true, - cwd: '.tmp/concat/scripts', - src: '*.js', - dest: '.tmp/concat/scripts' - }] - } - }, - - ngtemplates: { - docs: { - options: { - module: 'mgcrea.ngMotionDocs', - usemin: 'scripts/docs.tpl.min.js' - }, - files: [{ - cwd: '<%= yo.src %>', - src: '{,*/}docs/*.html', - dest: '.tmp/ngtemplates/src-docs.tpl.js' - }, - { - cwd: '<%= yo.docs %>', - src: 'views/sidebar.html', - dest: '.tmp/ngtemplates/docs-views.tpl.js' - }, - { - cwd: '<%= yo.docs %>', - src: 'views/partials/{,*/}*.html', - dest: '.tmp/ngtemplates/docs-partials.tpl.js' - }] - } - }, - - // Test settings - karma: { - options: { - configFile: 'test/karma.conf.js', - browsers: ['PhantomJS'] - }, - unit: { - singleRun: true, - options: { - reporters: ['dots'] - } - }, - server: { - autoWatch: true - } - }, - - uglify: { - generated: { - options: { - compress: false, - mangle: false, - beautify: true - } - } - } - - }); - - - grunt.registerTask('serve', function (target) { - if (target === 'dist') { - return grunt.task.run(['build', 'connect:dist:keepalive']); - } - - grunt.task.run([ - 'clean:server', - 'concurrent:server', - 'autoprefixer', - 'connect:livereload', - 'watch' - ]); - }); - - grunt.registerTask('test', [ - 'clean:server', - 'connect:test', - 'karma:unit' - ]); - - grunt.registerTask('build', [ - 'clean:dist', - 'less:dev', - 'less:dist', - 'autoprefixer', - 'copy:dist', - 'concat:banner' - ]); - - grunt.registerTask('docs', [ - 'clean:docs', - 'useminPrepare', - 'less:dev', - 'less:docs', - 'autoprefixer', - 'nginclude:docs', - 'ngtemplates:docs', - 'concat:generated', - 'ngmin:docs', - 'copy:docs', - 'cssmin:generated', - 'uglify:generated', - 'concat:docs', - 'usemin', - // 'htmlmin:docs' // breaks code preview - ]); - - grunt.registerTask('default', [ - 'newer:jshint', - 'test', - 'build' - ]); - -}; diff --git a/web/src/main/webapp/components/angular-motion/LICENSE.md b/web/src/main/webapp/components/angular-motion/LICENSE.md deleted file mode 100644 index 6615f14a9..000000000 --- a/web/src/main/webapp/components/angular-motion/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License - -Copyright (c) 2014 Olivier Louvignes http://olouv.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/web/src/main/webapp/components/angular-motion/README.md b/web/src/main/webapp/components/angular-motion/README.md deleted file mode 100644 index b942d1f86..000000000 --- a/web/src/main/webapp/components/angular-motion/README.md +++ /dev/null @@ -1,95 +0,0 @@ -# [AngularMotion](http://mgcrea.github.io/angular-motion) [![Build Status](https://secure.travis-ci.org/mgcrea/angular-motion.png?branch=master)](http://travis-ci.org/#!/mgcrea/angular-motion) [![Dependency Status](https://gemnasium.com/mgcrea/angular-motion.png)](https://gemnasium.com/mgcrea/angular-motion) [![Analytics](https://ga-beacon.appspot.com/UA-1813303-10/angular-motion/readme?pixel)](https://github.com/igrigorik/ga-beacon) - -[![Banner](http://mgcrea.github.io/angular-motion/images/snippet.png)](http://mgcrea.github.io/angular-motion) - -AngularMotion is an animation starter-kit built for [AngularJS 1.2.0+](https://github.com/angular/angular.js). - -It's a spin off from [AngularStrap](http://mgcrea.github.io/angular-strap) v2 release work. - - -## Documentation and examples - -+ Check the [documentation](http://mgcrea.github.io/angular-motion) and [changelog](https://github.com/mgcrea/angular-motion/releases). - - - -## Quick start - -+ Include the required libraries (cdn/local) - -> -``` html - - - -``` - -+ Inject the `ngAnimate` module into your app - -> -``` javascript -angular.module('myApp', ['ngAnimate']); -``` - - -## Developers - -Clone the repo, `git clone git://github.com/mgcrea/angular-motion.git`, [download the latest release](https://github.com/mgcrea/angular-motion/zipball/master) or install with bower `bower install angular-motion --save`. - -AngularMotion is tested with `karma` against the latest stable release of AngularJS. - -> - $ npm install grunt-cli --global - $ npm install --dev - $ grunt test - -You can build the latest version using `grunt`. - -> - $ grunt build - -You can quickly hack around (the docs) with: - -> - $ grunt serve - - - -## Contributing - -Please submit all pull requests the against master branch. If your unit test contains JavaScript patches or features, you should include relevant unit tests. Thanks! - - - -## Authors - -**Olivier Louvignes** - -+ http://olouv.com -+ http://github.com/mgcrea - - - -## Copyright and license - - The MIT License - - Copyright (c) 2012 Olivier Louvignes - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. diff --git a/web/src/main/webapp/components/angular-motion/bower.json b/web/src/main/webapp/components/angular-motion/bower.json deleted file mode 100644 index 398b82ba1..000000000 --- a/web/src/main/webapp/components/angular-motion/bower.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "angular-motion", - "description": "AngularMotion - Fancy CSS3 animations for AngularJS 1.2+", - "version": "0.3.2", - "keywords": [ - "angular", - "animation" - ], - "homepage": "https://github.com/mgcrea/angular-motion", - "bugs": "https://github.com/mgcrea/angular-motion/issues", - "author": { - "name": "Olivier Louvignes", - "email": "olivier@mg-crea.com", - "url": "https://github.com/mgcrea" - }, - "repository": { - "type": "git", - "url": "https://github.com/mgcrea/angular-motion.git" - }, - "licenses": [ - { - "type": "MIT" - } - ], - "main": [ - "dist/angular-motion.min.css" - ], - "dependencies": { - "angular": "~1.2.10", - "angular-animate": "~1.2.10" - }, - "devDependencies": { - "bootstrap": ">=3.0.0", - "angular-mocks": "~1.2.10", - "angular-strap": "~2.0.0", - "fastclick": "~0.6.11" - } -} diff --git a/web/src/main/webapp/components/angular-motion/dist/angular-motion.css b/web/src/main/webapp/components/angular-motion/dist/angular-motion.css deleted file mode 100644 index d339084cb..000000000 --- a/web/src/main/webapp/components/angular-motion/dist/angular-motion.css +++ /dev/null @@ -1,810 +0,0 @@ -/** - * angular-motion - * @version v0.3.2 - 2014-02-11 - * @link https://github.com/mgcrea/angular-motion - * @author Olivier Louvignes - * @license MIT License, http://www.opensource.org/licenses/MIT - */ -.am-fade-and-scale { - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; -} -.am-fade-and-scale.ng-enter, -.am-fade-and-scale.am-fade-and-scale-add, -.am-fade-and-scale.ng-hide-remove, -.am-fade-and-scale.ng-move { - -webkit-animation-name: fadeAndScaleIn; - animation-name: fadeAndScaleIn; -} -.am-fade-and-scale.ng-leave, -.am-fade-and-scale.am-fade-and-scale-remove, -.am-fade-and-scale.ng-hide { - -webkit-animation-name: fadeAndScaleOut; - animation-name: fadeAndScaleOut; -} -.am-fade-and-scale.ng-enter { - visibility: hidden; - -webkit-animation-name: fadeAndScaleIn; - animation-name: fadeAndScaleIn; -} -.am-fade-and-scale.ng-enter.ng-enter-active { - visibility: visible; -} -.am-fade-and-scale.ng-leave { - -webkit-animation-name: fadeAndScaleOut; - animation-name: fadeAndScaleOut; -} -@-webkit-keyframes fadeAndScaleIn { - from { - opacity: 0; - -webkit-transform: scale(0.7); - transform: scale(0.7); - } - to { - opacity: 1; - } -} -@keyframes fadeAndScaleIn { - from { - opacity: 0; - -webkit-transform: scale(0.7); - transform: scale(0.7); - } - to { - opacity: 1; - } -} -@-webkit-keyframes fadeAndScaleOut { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: scale(0.7); - transform: scale(0.7); - } -} -@keyframes fadeAndScaleOut { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: scale(0.7); - transform: scale(0.7); - } -} - -.am-fade-and-slide-top { - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; -} -.am-fade-and-slide-top.am-fade-and-slide-top-add, -.am-fade-and-slide-top.ng-hide-remove, -.am-fade-and-slide-top.ng-move { - -webkit-animation-name: fadeAndSlideFromTop; - animation-name: fadeAndSlideFromTop; -} -.am-fade-and-slide-top.am-fade-and-slide-top-remove, -.am-fade-and-slide-top.ng-hide { - -webkit-animation-name: fadeAndSlideToTop; - animation-name: fadeAndSlideToTop; -} -.am-fade-and-slide-top.ng-enter { - visibility: hidden; - -webkit-animation-name: fadeAndSlideFromTop; - animation-name: fadeAndSlideFromTop; -} -.am-fade-and-slide-top.ng-enter.ng-enter-active { - visibility: visible; -} -.am-fade-and-slide-top.ng-leave { - -webkit-animation-name: fadeAndSlideToTop; - animation-name: fadeAndSlideToTop; -} -.am-fade-and-slide-right { - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; -} -.am-fade-and-slide-right.am-fade-and-slide-right-add, -.am-fade-and-slide-right.ng-hide-remove, -.am-fade-and-slide-right.ng-move { - -webkit-animation-name: fadeAndSlideFromRight; - animation-name: fadeAndSlideFromRight; -} -.am-fade-and-slide-right.am-fade-and-slide-right-remove, -.am-fade-and-slide-right.ng-hide { - -webkit-animation-name: fadeAndSlideToRight; - animation-name: fadeAndSlideToRight; -} -.am-fade-and-slide-right.ng-enter { - visibility: hidden; - -webkit-animation-name: fadeAndSlideFromRight; - animation-name: fadeAndSlideFromRight; -} -.am-fade-and-slide-right.ng-enter.ng-enter-active { - visibility: visible; -} -.am-fade-and-slide-right.ng-leave { - -webkit-animation-name: fadeAndSlideToRight; - animation-name: fadeAndSlideToRight; -} -.am-fade-and-slide-bottom { - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; -} -.am-fade-and-slide-bottom.am-fade-and-slide-bottom-add, -.am-fade-and-slide-bottom.ng-hide-remove, -.am-fade-and-slide-bottom.ng-move { - -webkit-animation-name: fadeAndSlideFromBottom; - animation-name: fadeAndSlideFromBottom; -} -.am-fade-and-slide-bottom.am-fade-and-slide-bottom-remove, -.am-fade-and-slide-bottom.ng-hide { - -webkit-animation-name: fadeAndSlideToBottom; - animation-name: fadeAndSlideToBottom; -} -.am-fade-and-slide-bottom.ng-enter { - visibility: hidden; - -webkit-animation-name: fadeAndSlideFromBottom; - animation-name: fadeAndSlideFromBottom; -} -.am-fade-and-slide-bottom.ng-enter.ng-enter-active { - visibility: visible; -} -.am-fade-and-slide-bottom.ng-leave { - -webkit-animation-name: fadeAndSlideToBottom; - animation-name: fadeAndSlideToBottom; -} -.am-fade-and-slide-left { - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; -} -.am-fade-and-slide-left.am-fade-and-slide-left-add, -.am-fade-and-slide-left.ng-hide-remove, -.am-fade-and-slide-left.ng-move { - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; - -webkit-animation-name: fadeAndSlideFromLeft; - animation-name: fadeAndSlideFromLeft; -} -.am-fade-and-slide-left.am-fade-and-slide-left-remove, -.am-fade-and-slide-left.ng-hide { - -webkit-animation-name: fadeAndSlideToLeft; - animation-name: fadeAndSlideToLeft; -} -.am-fade-and-slide-left.ng-enter { - visibility: hidden; - -webkit-animation-name: fadeAndSlideFromLeft; - animation-name: fadeAndSlideFromLeft; -} -.am-fade-and-slide-left.ng-enter.ng-enter-active { - visibility: visible; -} -.am-fade-and-slide-left.ng-leave { - -webkit-animation-name: fadeAndSlideToLeft; - animation-name: fadeAndSlideToLeft; -} -@-webkit-keyframes fadeAndSlideFromTop { - from { - opacity: 0; - -webkit-transform: translateY(-20%); - transform: translateY(-20%); - } - to { - opacity: 1; - } -} -@keyframes fadeAndSlideFromTop { - from { - opacity: 0; - -webkit-transform: translateY(-20%); - transform: translateY(-20%); - } - to { - opacity: 1; - } -} -@-webkit-keyframes fadeAndSlideToTop { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translateY(-20%); - transform: translateY(-20%); - } -} -@keyframes fadeAndSlideToTop { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translateY(-20%); - transform: translateY(-20%); - } -} -@-webkit-keyframes fadeAndSlideFromRight { - from { - opacity: 0; - -webkit-transform: translateX(20%); - transform: translateX(20%); - } - to { - opacity: 1; - } -} -@keyframes fadeAndSlideFromRight { - from { - opacity: 0; - -webkit-transform: translateX(20%); - transform: translateX(20%); - } - to { - opacity: 1; - } -} -@-webkit-keyframes fadeAndSlideToRight { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translateX(20%); - transform: translateX(20%); - } -} -@keyframes fadeAndSlideToRight { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translateX(20%); - transform: translateX(20%); - } -} -@-webkit-keyframes fadeAndSlideFromBottom { - from { - opacity: 0; - -webkit-transform: translateY(20%); - transform: translateY(20%); - } - to { - opacity: 1; - } -} -@keyframes fadeAndSlideFromBottom { - from { - opacity: 0; - -webkit-transform: translateY(20%); - transform: translateY(20%); - } - to { - opacity: 1; - } -} -@-webkit-keyframes fadeAndSlideToBottom { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translateY(20%); - transform: translateY(20%); - } -} -@keyframes fadeAndSlideToBottom { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translateY(20%); - transform: translateY(20%); - } -} -@-webkit-keyframes fadeAndSlideFromLeft { - from { - opacity: 0; - -webkit-transform: translateX(-20%); - transform: translateX(-20%); - } - to { - opacity: 1; - } -} -@keyframes fadeAndSlideFromLeft { - from { - opacity: 0; - -webkit-transform: translateX(-20%); - transform: translateX(-20%); - } - to { - opacity: 1; - } -} -@-webkit-keyframes fadeAndSlideToLeft { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translateX(-20%); - transform: translateX(-20%); - } -} -@keyframes fadeAndSlideToLeft { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translateX(-20%); - transform: translateX(-20%); - } -} - -.am-fade { - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-timing-function: linear; - animation-timing-function: linear; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; - opacity: 1; -} -.am-fade.am-fade-add, -.am-fade.ng-hide-remove, -.am-fade.ng-move { - -webkit-animation-name: fadeIn; - animation-name: fadeIn; -} -.am-fade.am-fade-remove, -.am-fade.ng-hide { - -webkit-animation-name: fadeOut; - animation-name: fadeOut; -} -.am-fade.ng-enter { - visibility: hidden; - -webkit-animation-name: fadeIn; - animation-name: fadeIn; -} -.am-fade.ng-enter.ng-enter-active { - visibility: visible; -} -.am-fade.ng-leave { - -webkit-animation-name: fadeOut; - animation-name: fadeOut; -} -@-webkit-keyframes fadeIn { - from { - opacity: 0; - } - to { - opacity: 1; - } -} -@keyframes fadeIn { - from { - opacity: 0; - } - to { - opacity: 1; - } -} -@-webkit-keyframes fadeOut { - from { - opacity: 1; - } - to { - opacity: 0; - } -} -@keyframes fadeOut { - from { - opacity: 1; - } - to { - opacity: 0; - } -} -.modal-backdrop.am-fade, -.aside-backdrop.am-fade { - background: rgba(0, 0, 0, 0.5); - -webkit-animation-duration: 0.15s; - animation-duration: 0.15s; -} - -.am-flip-x { - -webkit-animation-duration: 0.4s; - animation-duration: 0.4s; - -webkit-animation-timing-function: ease; - animation-timing-function: ease; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; -} -.am-flip-x.am-flip-x-add, -.am-flip-x.ng-hide-remove, -.am-flip-x.ng-move { - -webkit-animation-name: flipInXBounce; - animation-name: flipInXBounce; -} -.am-flip-x.am-flip-x-remove, -.am-flip-x.ng-hide { - -webkit-animation-name: flipOutX; - animation-name: flipOutX; -} -.am-flip-x.ng-enter { - visibility: hidden; - -webkit-animation-name: flipInXBounce; - animation-name: flipInXBounce; -} -.am-flip-x.ng-enter.ng-enter-active { - visibility: visible; -} -.am-flip-x.ng-leave { - -webkit-animation-name: flipOutX; - animation-name: flipOutX; -} -.am-flip-x-linear { - -webkit-animation-duration: 0.4s; - animation-duration: 0.4s; - -webkit-animation-timing-function: ease; - animation-timing-function: ease; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; -} -.am-flip-x-linear.am-flip-x-add, -.am-flip-x-linear.ng-hide-remove, -.am-flip-x-linear.ng-move { - -webkit-animation-name: flipInX; - animation-name: flipInX; -} -.am-flip-x-linear.am-flip-x-remove, -.am-flip-x-linear.ng-hide { - -webkit-animation-name: flipOutX; - animation-name: flipOutX; -} -.am-flip-x-linear.ng-enter { - visibility: hidden; - -webkit-animation-name: flipInX; - animation-name: flipInX; -} -.am-flip-x-linear.ng-enter.ng-enter-active { - visibility: visible; -} -.am-flip-x-linear.ng-leave { - -webkit-animation-name: flipOutX; - animation-name: flipOutX; -} -@-webkit-keyframes flipInX { - from { - opacity: 0; - -webkit-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - } - to { - opacity: 1; - -webkit-transform: perspective(400px) rotateX(0deg); - transform: perspective(400px) rotateX(0deg); - } -} -@keyframes flipInX { - from { - opacity: 0; - -webkit-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - } - to { - opacity: 1; - -webkit-transform: perspective(400px) rotateX(0deg); - transform: perspective(400px) rotateX(0deg); - } -} -@-webkit-keyframes flipInXBounce { - from { - opacity: 0; - -webkit-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - } - 40% { - -webkit-transform: perspective(400px) rotateX(-10deg); - transform: perspective(400px) rotateX(-10deg); - } - 70% { - -webkit-transform: perspective(400px) rotateX(10deg); - transform: perspective(400px) rotateX(10deg); - } - to { - opacity: 1; - -webkit-transform: perspective(400px) rotateX(0deg); - transform: perspective(400px) rotateX(0deg); - } -} -@keyframes flipInXBounce { - from { - opacity: 0; - -webkit-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - } - 40% { - -webkit-transform: perspective(400px) rotateX(-10deg); - transform: perspective(400px) rotateX(-10deg); - } - 70% { - -webkit-transform: perspective(400px) rotateX(10deg); - transform: perspective(400px) rotateX(10deg); - } - to { - opacity: 1; - -webkit-transform: perspective(400px) rotateX(0deg); - transform: perspective(400px) rotateX(0deg); - } -} -@-webkit-keyframes flipOutX { - from { - opacity: 1; - -webkit-transform: perspective(400px) rotateX(0deg); - transform: perspective(400px) rotateX(0deg); - } - to { - opacity: 0; - -webkit-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - } -} -@keyframes flipOutX { - from { - opacity: 1; - -webkit-transform: perspective(400px) rotateX(0deg); - transform: perspective(400px) rotateX(0deg); - } - to { - opacity: 0; - -webkit-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - } -} - -.am-slide-top { - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; -} -.am-slide-top.am-fade-and-slide-top-add, -.am-slide-top.ng-hide-remove, -.am-slide-top.ng-move { - -webkit-animation-name: slideFromTop; - animation-name: slideFromTop; -} -.am-slide-top.am-fade-and-slide-top-remove, -.am-slide-top.ng-hide { - -webkit-animation-name: slideToTop; - animation-name: slideToTop; -} -.am-slide-top.ng-enter { - visibility: hidden; - -webkit-animation-name: slideFromTop; - animation-name: slideFromTop; -} -.am-slide-top.ng-enter.ng-enter-active { - visibility: visible; -} -.am-slide-top.ng-leave { - -webkit-animation-name: slideToTop; - animation-name: slideToTop; -} -.am-slide-right { - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; -} -.am-slide-right.am-fade-and-slide-right-add, -.am-slide-right.ng-hide-remove, -.am-slide-right.ng-move { - -webkit-animation-name: slideFromRight; - animation-name: slideFromRight; -} -.am-slide-right.am-fade-and-slide-right-remove, -.am-slide-right.ng-hide { - -webkit-animation-name: slideToRight; - animation-name: slideToRight; -} -.am-slide-right.ng-enter { - visibility: hidden; - -webkit-animation-name: slideFromRight; - animation-name: slideFromRight; -} -.am-slide-right.ng-enter.ng-enter-active { - visibility: visible; -} -.am-slide-right.ng-leave { - -webkit-animation-name: slideToRight; - animation-name: slideToRight; -} -.am-slide-bottom { - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; -} -.am-slide-bottom.am-fade-and-slide-bottom-add, -.am-slide-bottom.ng-hide-remove, -.am-slide-bottom.ng-move { - -webkit-animation-name: slideFromBottom; - animation-name: slideFromBottom; -} -.am-slide-bottom.am-fade-and-slide-bottom-remove, -.am-slide-bottom.ng-hide { - -webkit-animation-name: slideToBottom; - animation-name: slideToBottom; -} -.am-slide-bottom.ng-enter { - visibility: hidden; - -webkit-animation-name: slideFromBottom; - animation-name: slideFromBottom; -} -.am-slide-bottom.ng-enter.ng-enter-active { - visibility: visible; -} -.am-slide-bottom.ng-leave { - -webkit-animation-name: slideToBottom; - animation-name: slideToBottom; -} -.am-slide-left { - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; -} -.am-slide-left.am-fade-and-slide-left-add, -.am-slide-left.ng-hide-remove, -.am-slide-left.ng-move { - -webkit-animation-name: slideFromLeft; - animation-name: slideFromLeft; -} -.am-slide-left.am-fade-and-slide-left-remove, -.am-slide-left.ng-hide { - -webkit-animation-name: slideToLeft; - animation-name: slideToLeft; -} -.am-slide-left.ng-enter { - visibility: hidden; - -webkit-animation-name: slideFromLeft; - animation-name: slideFromLeft; -} -.am-slide-left.ng-enter.ng-enter-active { - visibility: visible; -} -.am-slide-left.ng-leave { - -webkit-animation-name: slideToLeft; - animation-name: slideToLeft; -} -@-webkit-keyframes slideFromTop { - from { - -webkit-transform: translateY(-100%); - transform: translateY(-100%); - } -} -@keyframes slideFromTop { - from { - -webkit-transform: translateY(-100%); - transform: translateY(-100%); - } -} -@-webkit-keyframes slideToTop { - to { - -webkit-transform: translateY(-100%); - transform: translateY(-100%); - } -} -@keyframes slideToTop { - to { - -webkit-transform: translateY(-100%); - transform: translateY(-100%); - } -} -@-webkit-keyframes slideFromRight { - from { - -webkit-transform: translateX(100%); - transform: translateX(100%); - } -} -@keyframes slideFromRight { - from { - -webkit-transform: translateX(100%); - transform: translateX(100%); - } -} -@-webkit-keyframes slideToRight { - to { - -webkit-transform: translateX(100%); - transform: translateX(100%); - } -} -@keyframes slideToRight { - to { - -webkit-transform: translateX(100%); - transform: translateX(100%); - } -} -@-webkit-keyframes slideFromBottom { - from { - -webkit-transform: translateY(100%); - transform: translateY(100%); - } -} -@keyframes slideFromBottom { - from { - -webkit-transform: translateY(100%); - transform: translateY(100%); - } -} -@-webkit-keyframes slideToBottom { - to { - -webkit-transform: translateY(100%); - transform: translateY(100%); - } -} -@keyframes slideToBottom { - to { - -webkit-transform: translateY(100%); - transform: translateY(100%); - } -} -@-webkit-keyframes slideFromLeft { - from { - -webkit-transform: translateX(-100%); - transform: translateX(-100%); - } -} -@keyframes slideFromLeft { - from { - -webkit-transform: translateX(-100%); - transform: translateX(-100%); - } -} -@-webkit-keyframes slideToLeft { - to { - -webkit-transform: translateX(-100%); - transform: translateX(-100%); - } -} -@keyframes slideToLeft { - to { - -webkit-transform: translateX(-100%); - transform: translateX(-100%); - } -} diff --git a/web/src/main/webapp/components/angular-motion/dist/angular-motion.min.css b/web/src/main/webapp/components/angular-motion/dist/angular-motion.min.css deleted file mode 100644 index ed4b8444d..000000000 --- a/web/src/main/webapp/components/angular-motion/dist/angular-motion.min.css +++ /dev/null @@ -1,8 +0,0 @@ -/** - * angular-motion - * @version v0.3.2 - 2014-02-11 - * @link https://github.com/mgcrea/angular-motion - * @author Olivier Louvignes - * @license MIT License, http://www.opensource.org/licenses/MIT - */ -.am-fade-and-scale{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-fade-and-scale.ng-enter,.am-fade-and-scale.am-fade-and-scale-add,.am-fade-and-scale.ng-hide-remove,.am-fade-and-scale.ng-move{-webkit-animation-name:fadeAndScaleIn;animation-name:fadeAndScaleIn}.am-fade-and-scale.ng-leave,.am-fade-and-scale.am-fade-and-scale-remove,.am-fade-and-scale.ng-hide{-webkit-animation-name:fadeAndScaleOut;animation-name:fadeAndScaleOut}.am-fade-and-scale.ng-enter{visibility:hidden;-webkit-animation-name:fadeAndScaleIn;animation-name:fadeAndScaleIn}.am-fade-and-scale.ng-enter.ng-enter-active{visibility:visible}.am-fade-and-scale.ng-leave{-webkit-animation-name:fadeAndScaleOut;animation-name:fadeAndScaleOut}@-webkit-keyframes fadeAndScaleIn{from{opacity:0;-webkit-transform:scale(0.7);transform:scale(0.7)}to{opacity:1}}@keyframes fadeAndScaleIn{from{opacity:0;-webkit-transform:scale(0.7);transform:scale(0.7)}to{opacity:1}}@-webkit-keyframes fadeAndScaleOut{from{opacity:1}to{opacity:0;-webkit-transform:scale(0.7);transform:scale(0.7)}}@keyframes fadeAndScaleOut{from{opacity:1}to{opacity:0;-webkit-transform:scale(0.7);transform:scale(0.7)}}.am-fade-and-slide-top{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-fade-and-slide-top.am-fade-and-slide-top-add,.am-fade-and-slide-top.ng-hide-remove,.am-fade-and-slide-top.ng-move{-webkit-animation-name:fadeAndSlideFromTop;animation-name:fadeAndSlideFromTop}.am-fade-and-slide-top.am-fade-and-slide-top-remove,.am-fade-and-slide-top.ng-hide{-webkit-animation-name:fadeAndSlideToTop;animation-name:fadeAndSlideToTop}.am-fade-and-slide-top.ng-enter{visibility:hidden;-webkit-animation-name:fadeAndSlideFromTop;animation-name:fadeAndSlideFromTop}.am-fade-and-slide-top.ng-enter.ng-enter-active{visibility:visible}.am-fade-and-slide-top.ng-leave{-webkit-animation-name:fadeAndSlideToTop;animation-name:fadeAndSlideToTop}.am-fade-and-slide-right{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-fade-and-slide-right.am-fade-and-slide-right-add,.am-fade-and-slide-right.ng-hide-remove,.am-fade-and-slide-right.ng-move{-webkit-animation-name:fadeAndSlideFromRight;animation-name:fadeAndSlideFromRight}.am-fade-and-slide-right.am-fade-and-slide-right-remove,.am-fade-and-slide-right.ng-hide{-webkit-animation-name:fadeAndSlideToRight;animation-name:fadeAndSlideToRight}.am-fade-and-slide-right.ng-enter{visibility:hidden;-webkit-animation-name:fadeAndSlideFromRight;animation-name:fadeAndSlideFromRight}.am-fade-and-slide-right.ng-enter.ng-enter-active{visibility:visible}.am-fade-and-slide-right.ng-leave{-webkit-animation-name:fadeAndSlideToRight;animation-name:fadeAndSlideToRight}.am-fade-and-slide-bottom{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-fade-and-slide-bottom.am-fade-and-slide-bottom-add,.am-fade-and-slide-bottom.ng-hide-remove,.am-fade-and-slide-bottom.ng-move{-webkit-animation-name:fadeAndSlideFromBottom;animation-name:fadeAndSlideFromBottom}.am-fade-and-slide-bottom.am-fade-and-slide-bottom-remove,.am-fade-and-slide-bottom.ng-hide{-webkit-animation-name:fadeAndSlideToBottom;animation-name:fadeAndSlideToBottom}.am-fade-and-slide-bottom.ng-enter{visibility:hidden;-webkit-animation-name:fadeAndSlideFromBottom;animation-name:fadeAndSlideFromBottom}.am-fade-and-slide-bottom.ng-enter.ng-enter-active{visibility:visible}.am-fade-and-slide-bottom.ng-leave{-webkit-animation-name:fadeAndSlideToBottom;animation-name:fadeAndSlideToBottom}.am-fade-and-slide-left{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-fade-and-slide-left.am-fade-and-slide-left-add,.am-fade-and-slide-left.ng-hide-remove,.am-fade-and-slide-left.ng-move{-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards;-webkit-animation-name:fadeAndSlideFromLeft;animation-name:fadeAndSlideFromLeft}.am-fade-and-slide-left.am-fade-and-slide-left-remove,.am-fade-and-slide-left.ng-hide{-webkit-animation-name:fadeAndSlideToLeft;animation-name:fadeAndSlideToLeft}.am-fade-and-slide-left.ng-enter{visibility:hidden;-webkit-animation-name:fadeAndSlideFromLeft;animation-name:fadeAndSlideFromLeft}.am-fade-and-slide-left.ng-enter.ng-enter-active{visibility:visible}.am-fade-and-slide-left.ng-leave{-webkit-animation-name:fadeAndSlideToLeft;animation-name:fadeAndSlideToLeft}@-webkit-keyframes fadeAndSlideFromTop{from{opacity:0;-webkit-transform:translateY(-20%);transform:translateY(-20%)}to{opacity:1}}@keyframes fadeAndSlideFromTop{from{opacity:0;-webkit-transform:translateY(-20%);transform:translateY(-20%)}to{opacity:1}}@-webkit-keyframes fadeAndSlideToTop{from{opacity:1}to{opacity:0;-webkit-transform:translateY(-20%);transform:translateY(-20%)}}@keyframes fadeAndSlideToTop{from{opacity:1}to{opacity:0;-webkit-transform:translateY(-20%);transform:translateY(-20%)}}@-webkit-keyframes fadeAndSlideFromRight{from{opacity:0;-webkit-transform:translateX(20%);transform:translateX(20%)}to{opacity:1}}@keyframes fadeAndSlideFromRight{from{opacity:0;-webkit-transform:translateX(20%);transform:translateX(20%)}to{opacity:1}}@-webkit-keyframes fadeAndSlideToRight{from{opacity:1}to{opacity:0;-webkit-transform:translateX(20%);transform:translateX(20%)}}@keyframes fadeAndSlideToRight{from{opacity:1}to{opacity:0;-webkit-transform:translateX(20%);transform:translateX(20%)}}@-webkit-keyframes fadeAndSlideFromBottom{from{opacity:0;-webkit-transform:translateY(20%);transform:translateY(20%)}to{opacity:1}}@keyframes fadeAndSlideFromBottom{from{opacity:0;-webkit-transform:translateY(20%);transform:translateY(20%)}to{opacity:1}}@-webkit-keyframes fadeAndSlideToBottom{from{opacity:1}to{opacity:0;-webkit-transform:translateY(20%);transform:translateY(20%)}}@keyframes fadeAndSlideToBottom{from{opacity:1}to{opacity:0;-webkit-transform:translateY(20%);transform:translateY(20%)}}@-webkit-keyframes fadeAndSlideFromLeft{from{opacity:0;-webkit-transform:translateX(-20%);transform:translateX(-20%)}to{opacity:1}}@keyframes fadeAndSlideFromLeft{from{opacity:0;-webkit-transform:translateX(-20%);transform:translateX(-20%)}to{opacity:1}}@-webkit-keyframes fadeAndSlideToLeft{from{opacity:1}to{opacity:0;-webkit-transform:translateX(-20%);transform:translateX(-20%)}}@keyframes fadeAndSlideToLeft{from{opacity:1}to{opacity:0;-webkit-transform:translateX(-20%);transform:translateX(-20%)}}.am-fade{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards;opacity:1}.am-fade.am-fade-add,.am-fade.ng-hide-remove,.am-fade.ng-move{-webkit-animation-name:fadeIn;animation-name:fadeIn}.am-fade.am-fade-remove,.am-fade.ng-hide{-webkit-animation-name:fadeOut;animation-name:fadeOut}.am-fade.ng-enter{visibility:hidden;-webkit-animation-name:fadeIn;animation-name:fadeIn}.am-fade.ng-enter.ng-enter-active{visibility:visible}.am-fade.ng-leave{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes fadeIn{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadeOut{from{opacity:1}to{opacity:0}}@keyframes fadeOut{from{opacity:1}to{opacity:0}}.modal-backdrop.am-fade,.aside-backdrop.am-fade{background:rgba(0,0,0,.5);-webkit-animation-duration:.15s;animation-duration:.15s}.am-flip-x{-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-timing-function:ease;animation-timing-function:ease;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-flip-x.am-flip-x-add,.am-flip-x.ng-hide-remove,.am-flip-x.ng-move{-webkit-animation-name:flipInXBounce;animation-name:flipInXBounce}.am-flip-x.am-flip-x-remove,.am-flip-x.ng-hide{-webkit-animation-name:flipOutX;animation-name:flipOutX}.am-flip-x.ng-enter{visibility:hidden;-webkit-animation-name:flipInXBounce;animation-name:flipInXBounce}.am-flip-x.ng-enter.ng-enter-active{visibility:visible}.am-flip-x.ng-leave{-webkit-animation-name:flipOutX;animation-name:flipOutX}.am-flip-x-linear{-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-timing-function:ease;animation-timing-function:ease;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-flip-x-linear.am-flip-x-add,.am-flip-x-linear.ng-hide-remove,.am-flip-x-linear.ng-move{-webkit-animation-name:flipInX;animation-name:flipInX}.am-flip-x-linear.am-flip-x-remove,.am-flip-x-linear.ng-hide{-webkit-animation-name:flipOutX;animation-name:flipOutX}.am-flip-x-linear.ng-enter{visibility:hidden;-webkit-animation-name:flipInX;animation-name:flipInX}.am-flip-x-linear.ng-enter.ng-enter-active{visibility:visible}.am-flip-x-linear.ng-leave{-webkit-animation-name:flipOutX;animation-name:flipOutX}@-webkit-keyframes flipInX{from{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}to{opacity:1;-webkit-transform:perspective(400px) rotateX(0deg);transform:perspective(400px) rotateX(0deg)}}@keyframes flipInX{from{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}to{opacity:1;-webkit-transform:perspective(400px) rotateX(0deg);transform:perspective(400px) rotateX(0deg)}}@-webkit-keyframes flipInXBounce{from{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}40%{-webkit-transform:perspective(400px) rotateX(-10deg);transform:perspective(400px) rotateX(-10deg)}70%{-webkit-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg)}to{opacity:1;-webkit-transform:perspective(400px) rotateX(0deg);transform:perspective(400px) rotateX(0deg)}}@keyframes flipInXBounce{from{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}40%{-webkit-transform:perspective(400px) rotateX(-10deg);transform:perspective(400px) rotateX(-10deg)}70%{-webkit-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg)}to{opacity:1;-webkit-transform:perspective(400px) rotateX(0deg);transform:perspective(400px) rotateX(0deg)}}@-webkit-keyframes flipOutX{from{opacity:1;-webkit-transform:perspective(400px) rotateX(0deg);transform:perspective(400px) rotateX(0deg)}to{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}}@keyframes flipOutX{from{opacity:1;-webkit-transform:perspective(400px) rotateX(0deg);transform:perspective(400px) rotateX(0deg)}to{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}}.am-slide-top{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-slide-top.am-fade-and-slide-top-add,.am-slide-top.ng-hide-remove,.am-slide-top.ng-move{-webkit-animation-name:slideFromTop;animation-name:slideFromTop}.am-slide-top.am-fade-and-slide-top-remove,.am-slide-top.ng-hide{-webkit-animation-name:slideToTop;animation-name:slideToTop}.am-slide-top.ng-enter{visibility:hidden;-webkit-animation-name:slideFromTop;animation-name:slideFromTop}.am-slide-top.ng-enter.ng-enter-active{visibility:visible}.am-slide-top.ng-leave{-webkit-animation-name:slideToTop;animation-name:slideToTop}.am-slide-right{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-slide-right.am-fade-and-slide-right-add,.am-slide-right.ng-hide-remove,.am-slide-right.ng-move{-webkit-animation-name:slideFromRight;animation-name:slideFromRight}.am-slide-right.am-fade-and-slide-right-remove,.am-slide-right.ng-hide{-webkit-animation-name:slideToRight;animation-name:slideToRight}.am-slide-right.ng-enter{visibility:hidden;-webkit-animation-name:slideFromRight;animation-name:slideFromRight}.am-slide-right.ng-enter.ng-enter-active{visibility:visible}.am-slide-right.ng-leave{-webkit-animation-name:slideToRight;animation-name:slideToRight}.am-slide-bottom{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-slide-bottom.am-fade-and-slide-bottom-add,.am-slide-bottom.ng-hide-remove,.am-slide-bottom.ng-move{-webkit-animation-name:slideFromBottom;animation-name:slideFromBottom}.am-slide-bottom.am-fade-and-slide-bottom-remove,.am-slide-bottom.ng-hide{-webkit-animation-name:slideToBottom;animation-name:slideToBottom}.am-slide-bottom.ng-enter{visibility:hidden;-webkit-animation-name:slideFromBottom;animation-name:slideFromBottom}.am-slide-bottom.ng-enter.ng-enter-active{visibility:visible}.am-slide-bottom.ng-leave{-webkit-animation-name:slideToBottom;animation-name:slideToBottom}.am-slide-left{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-slide-left.am-fade-and-slide-left-add,.am-slide-left.ng-hide-remove,.am-slide-left.ng-move{-webkit-animation-name:slideFromLeft;animation-name:slideFromLeft}.am-slide-left.am-fade-and-slide-left-remove,.am-slide-left.ng-hide{-webkit-animation-name:slideToLeft;animation-name:slideToLeft}.am-slide-left.ng-enter{visibility:hidden;-webkit-animation-name:slideFromLeft;animation-name:slideFromLeft}.am-slide-left.ng-enter.ng-enter-active{visibility:visible}.am-slide-left.ng-leave{-webkit-animation-name:slideToLeft;animation-name:slideToLeft}@-webkit-keyframes slideFromTop{from{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes slideFromTop{from{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes slideToTop{to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes slideToTop{to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes slideFromRight{from{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes slideFromRight{from{-webkit-transform:translateX(100%);transform:translateX(100%)}}@-webkit-keyframes slideToRight{to{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes slideToRight{to{-webkit-transform:translateX(100%);transform:translateX(100%)}}@-webkit-keyframes slideFromBottom{from{-webkit-transform:translateY(100%);transform:translateY(100%)}}@keyframes slideFromBottom{from{-webkit-transform:translateY(100%);transform:translateY(100%)}}@-webkit-keyframes slideToBottom{to{-webkit-transform:translateY(100%);transform:translateY(100%)}}@keyframes slideToBottom{to{-webkit-transform:translateY(100%);transform:translateY(100%)}}@-webkit-keyframes slideFromLeft{from{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes slideFromLeft{from{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@-webkit-keyframes slideToLeft{to{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes slideToLeft{to{-webkit-transform:translateX(-100%);transform:translateX(-100%)}} \ No newline at end of file diff --git a/web/src/main/webapp/components/angular-motion/dist/modules/fade-and-scale.css b/web/src/main/webapp/components/angular-motion/dist/modules/fade-and-scale.css deleted file mode 100644 index 3aefd0a44..000000000 --- a/web/src/main/webapp/components/angular-motion/dist/modules/fade-and-scale.css +++ /dev/null @@ -1,80 +0,0 @@ -/** - * angular-motion - * @version v0.3.2 - 2014-02-11 - * @link https://github.com/mgcrea/angular-motion - * @author Olivier Louvignes - * @license MIT License, http://www.opensource.org/licenses/MIT - */ -.am-fade-and-scale { - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; -} -.am-fade-and-scale.ng-enter, -.am-fade-and-scale.am-fade-and-scale-add, -.am-fade-and-scale.ng-hide-remove, -.am-fade-and-scale.ng-move { - -webkit-animation-name: fadeAndScaleIn; - animation-name: fadeAndScaleIn; -} -.am-fade-and-scale.ng-leave, -.am-fade-and-scale.am-fade-and-scale-remove, -.am-fade-and-scale.ng-hide { - -webkit-animation-name: fadeAndScaleOut; - animation-name: fadeAndScaleOut; -} -.am-fade-and-scale.ng-enter { - visibility: hidden; - -webkit-animation-name: fadeAndScaleIn; - animation-name: fadeAndScaleIn; -} -.am-fade-and-scale.ng-enter.ng-enter-active { - visibility: visible; -} -.am-fade-and-scale.ng-leave { - -webkit-animation-name: fadeAndScaleOut; - animation-name: fadeAndScaleOut; -} -@-webkit-keyframes fadeAndScaleIn { - from { - opacity: 0; - -webkit-transform: scale(0.7); - transform: scale(0.7); - } - to { - opacity: 1; - } -} -@keyframes fadeAndScaleIn { - from { - opacity: 0; - -webkit-transform: scale(0.7); - transform: scale(0.7); - } - to { - opacity: 1; - } -} -@-webkit-keyframes fadeAndScaleOut { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: scale(0.7); - transform: scale(0.7); - } -} -@keyframes fadeAndScaleOut { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: scale(0.7); - transform: scale(0.7); - } -} diff --git a/web/src/main/webapp/components/angular-motion/dist/modules/fade-and-scale.min.css b/web/src/main/webapp/components/angular-motion/dist/modules/fade-and-scale.min.css deleted file mode 100644 index c6fc6dae2..000000000 --- a/web/src/main/webapp/components/angular-motion/dist/modules/fade-and-scale.min.css +++ /dev/null @@ -1,8 +0,0 @@ -/** - * angular-motion - * @version v0.3.2 - 2014-02-11 - * @link https://github.com/mgcrea/angular-motion - * @author Olivier Louvignes - * @license MIT License, http://www.opensource.org/licenses/MIT - */ -.am-fade-and-scale{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-fade-and-scale.ng-enter,.am-fade-and-scale.am-fade-and-scale-add,.am-fade-and-scale.ng-hide-remove,.am-fade-and-scale.ng-move{-webkit-animation-name:fadeAndScaleIn;animation-name:fadeAndScaleIn}.am-fade-and-scale.ng-leave,.am-fade-and-scale.am-fade-and-scale-remove,.am-fade-and-scale.ng-hide{-webkit-animation-name:fadeAndScaleOut;animation-name:fadeAndScaleOut}.am-fade-and-scale.ng-enter{visibility:hidden;-webkit-animation-name:fadeAndScaleIn;animation-name:fadeAndScaleIn}.am-fade-and-scale.ng-enter.ng-enter-active{visibility:visible}.am-fade-and-scale.ng-leave{-webkit-animation-name:fadeAndScaleOut;animation-name:fadeAndScaleOut}@-webkit-keyframes fadeAndScaleIn{from{opacity:0;-webkit-transform:scale(0.7);transform:scale(0.7)}to{opacity:1}}@keyframes fadeAndScaleIn{from{opacity:0;-webkit-transform:scale(0.7);transform:scale(0.7)}to{opacity:1}}@-webkit-keyframes fadeAndScaleOut{from{opacity:1}to{opacity:0;-webkit-transform:scale(0.7);transform:scale(0.7)}}@keyframes fadeAndScaleOut{from{opacity:1}to{opacity:0;-webkit-transform:scale(0.7);transform:scale(0.7)}} \ No newline at end of file diff --git a/web/src/main/webapp/components/angular-motion/dist/modules/fade-and-slide.css b/web/src/main/webapp/components/angular-motion/dist/modules/fade-and-slide.css deleted file mode 100644 index f72d8e4c5..000000000 --- a/web/src/main/webapp/components/angular-motion/dist/modules/fade-and-slide.css +++ /dev/null @@ -1,293 +0,0 @@ -/** - * angular-motion - * @version v0.3.2 - 2014-02-11 - * @link https://github.com/mgcrea/angular-motion - * @author Olivier Louvignes - * @license MIT License, http://www.opensource.org/licenses/MIT - */ -.am-fade-and-slide-top { - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; -} -.am-fade-and-slide-top.am-fade-and-slide-top-add, -.am-fade-and-slide-top.ng-hide-remove, -.am-fade-and-slide-top.ng-move { - -webkit-animation-name: fadeAndSlideFromTop; - animation-name: fadeAndSlideFromTop; -} -.am-fade-and-slide-top.am-fade-and-slide-top-remove, -.am-fade-and-slide-top.ng-hide { - -webkit-animation-name: fadeAndSlideToTop; - animation-name: fadeAndSlideToTop; -} -.am-fade-and-slide-top.ng-enter { - visibility: hidden; - -webkit-animation-name: fadeAndSlideFromTop; - animation-name: fadeAndSlideFromTop; -} -.am-fade-and-slide-top.ng-enter.ng-enter-active { - visibility: visible; -} -.am-fade-and-slide-top.ng-leave { - -webkit-animation-name: fadeAndSlideToTop; - animation-name: fadeAndSlideToTop; -} -.am-fade-and-slide-right { - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; -} -.am-fade-and-slide-right.am-fade-and-slide-right-add, -.am-fade-and-slide-right.ng-hide-remove, -.am-fade-and-slide-right.ng-move { - -webkit-animation-name: fadeAndSlideFromRight; - animation-name: fadeAndSlideFromRight; -} -.am-fade-and-slide-right.am-fade-and-slide-right-remove, -.am-fade-and-slide-right.ng-hide { - -webkit-animation-name: fadeAndSlideToRight; - animation-name: fadeAndSlideToRight; -} -.am-fade-and-slide-right.ng-enter { - visibility: hidden; - -webkit-animation-name: fadeAndSlideFromRight; - animation-name: fadeAndSlideFromRight; -} -.am-fade-and-slide-right.ng-enter.ng-enter-active { - visibility: visible; -} -.am-fade-and-slide-right.ng-leave { - -webkit-animation-name: fadeAndSlideToRight; - animation-name: fadeAndSlideToRight; -} -.am-fade-and-slide-bottom { - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; -} -.am-fade-and-slide-bottom.am-fade-and-slide-bottom-add, -.am-fade-and-slide-bottom.ng-hide-remove, -.am-fade-and-slide-bottom.ng-move { - -webkit-animation-name: fadeAndSlideFromBottom; - animation-name: fadeAndSlideFromBottom; -} -.am-fade-and-slide-bottom.am-fade-and-slide-bottom-remove, -.am-fade-and-slide-bottom.ng-hide { - -webkit-animation-name: fadeAndSlideToBottom; - animation-name: fadeAndSlideToBottom; -} -.am-fade-and-slide-bottom.ng-enter { - visibility: hidden; - -webkit-animation-name: fadeAndSlideFromBottom; - animation-name: fadeAndSlideFromBottom; -} -.am-fade-and-slide-bottom.ng-enter.ng-enter-active { - visibility: visible; -} -.am-fade-and-slide-bottom.ng-leave { - -webkit-animation-name: fadeAndSlideToBottom; - animation-name: fadeAndSlideToBottom; -} -.am-fade-and-slide-left { - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; -} -.am-fade-and-slide-left.am-fade-and-slide-left-add, -.am-fade-and-slide-left.ng-hide-remove, -.am-fade-and-slide-left.ng-move { - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; - -webkit-animation-name: fadeAndSlideFromLeft; - animation-name: fadeAndSlideFromLeft; -} -.am-fade-and-slide-left.am-fade-and-slide-left-remove, -.am-fade-and-slide-left.ng-hide { - -webkit-animation-name: fadeAndSlideToLeft; - animation-name: fadeAndSlideToLeft; -} -.am-fade-and-slide-left.ng-enter { - visibility: hidden; - -webkit-animation-name: fadeAndSlideFromLeft; - animation-name: fadeAndSlideFromLeft; -} -.am-fade-and-slide-left.ng-enter.ng-enter-active { - visibility: visible; -} -.am-fade-and-slide-left.ng-leave { - -webkit-animation-name: fadeAndSlideToLeft; - animation-name: fadeAndSlideToLeft; -} -@-webkit-keyframes fadeAndSlideFromTop { - from { - opacity: 0; - -webkit-transform: translateY(-20%); - transform: translateY(-20%); - } - to { - opacity: 1; - } -} -@keyframes fadeAndSlideFromTop { - from { - opacity: 0; - -webkit-transform: translateY(-20%); - transform: translateY(-20%); - } - to { - opacity: 1; - } -} -@-webkit-keyframes fadeAndSlideToTop { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translateY(-20%); - transform: translateY(-20%); - } -} -@keyframes fadeAndSlideToTop { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translateY(-20%); - transform: translateY(-20%); - } -} -@-webkit-keyframes fadeAndSlideFromRight { - from { - opacity: 0; - -webkit-transform: translateX(20%); - transform: translateX(20%); - } - to { - opacity: 1; - } -} -@keyframes fadeAndSlideFromRight { - from { - opacity: 0; - -webkit-transform: translateX(20%); - transform: translateX(20%); - } - to { - opacity: 1; - } -} -@-webkit-keyframes fadeAndSlideToRight { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translateX(20%); - transform: translateX(20%); - } -} -@keyframes fadeAndSlideToRight { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translateX(20%); - transform: translateX(20%); - } -} -@-webkit-keyframes fadeAndSlideFromBottom { - from { - opacity: 0; - -webkit-transform: translateY(20%); - transform: translateY(20%); - } - to { - opacity: 1; - } -} -@keyframes fadeAndSlideFromBottom { - from { - opacity: 0; - -webkit-transform: translateY(20%); - transform: translateY(20%); - } - to { - opacity: 1; - } -} -@-webkit-keyframes fadeAndSlideToBottom { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translateY(20%); - transform: translateY(20%); - } -} -@keyframes fadeAndSlideToBottom { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translateY(20%); - transform: translateY(20%); - } -} -@-webkit-keyframes fadeAndSlideFromLeft { - from { - opacity: 0; - -webkit-transform: translateX(-20%); - transform: translateX(-20%); - } - to { - opacity: 1; - } -} -@keyframes fadeAndSlideFromLeft { - from { - opacity: 0; - -webkit-transform: translateX(-20%); - transform: translateX(-20%); - } - to { - opacity: 1; - } -} -@-webkit-keyframes fadeAndSlideToLeft { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translateX(-20%); - transform: translateX(-20%); - } -} -@keyframes fadeAndSlideToLeft { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translateX(-20%); - transform: translateX(-20%); - } -} diff --git a/web/src/main/webapp/components/angular-motion/dist/modules/fade-and-slide.min.css b/web/src/main/webapp/components/angular-motion/dist/modules/fade-and-slide.min.css deleted file mode 100644 index b6fd9b480..000000000 --- a/web/src/main/webapp/components/angular-motion/dist/modules/fade-and-slide.min.css +++ /dev/null @@ -1,8 +0,0 @@ -/** - * angular-motion - * @version v0.3.2 - 2014-02-11 - * @link https://github.com/mgcrea/angular-motion - * @author Olivier Louvignes - * @license MIT License, http://www.opensource.org/licenses/MIT - */ -.am-fade-and-slide-top{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-fade-and-slide-top.am-fade-and-slide-top-add,.am-fade-and-slide-top.ng-hide-remove,.am-fade-and-slide-top.ng-move{-webkit-animation-name:fadeAndSlideFromTop;animation-name:fadeAndSlideFromTop}.am-fade-and-slide-top.am-fade-and-slide-top-remove,.am-fade-and-slide-top.ng-hide{-webkit-animation-name:fadeAndSlideToTop;animation-name:fadeAndSlideToTop}.am-fade-and-slide-top.ng-enter{visibility:hidden;-webkit-animation-name:fadeAndSlideFromTop;animation-name:fadeAndSlideFromTop}.am-fade-and-slide-top.ng-enter.ng-enter-active{visibility:visible}.am-fade-and-slide-top.ng-leave{-webkit-animation-name:fadeAndSlideToTop;animation-name:fadeAndSlideToTop}.am-fade-and-slide-right{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-fade-and-slide-right.am-fade-and-slide-right-add,.am-fade-and-slide-right.ng-hide-remove,.am-fade-and-slide-right.ng-move{-webkit-animation-name:fadeAndSlideFromRight;animation-name:fadeAndSlideFromRight}.am-fade-and-slide-right.am-fade-and-slide-right-remove,.am-fade-and-slide-right.ng-hide{-webkit-animation-name:fadeAndSlideToRight;animation-name:fadeAndSlideToRight}.am-fade-and-slide-right.ng-enter{visibility:hidden;-webkit-animation-name:fadeAndSlideFromRight;animation-name:fadeAndSlideFromRight}.am-fade-and-slide-right.ng-enter.ng-enter-active{visibility:visible}.am-fade-and-slide-right.ng-leave{-webkit-animation-name:fadeAndSlideToRight;animation-name:fadeAndSlideToRight}.am-fade-and-slide-bottom{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-fade-and-slide-bottom.am-fade-and-slide-bottom-add,.am-fade-and-slide-bottom.ng-hide-remove,.am-fade-and-slide-bottom.ng-move{-webkit-animation-name:fadeAndSlideFromBottom;animation-name:fadeAndSlideFromBottom}.am-fade-and-slide-bottom.am-fade-and-slide-bottom-remove,.am-fade-and-slide-bottom.ng-hide{-webkit-animation-name:fadeAndSlideToBottom;animation-name:fadeAndSlideToBottom}.am-fade-and-slide-bottom.ng-enter{visibility:hidden;-webkit-animation-name:fadeAndSlideFromBottom;animation-name:fadeAndSlideFromBottom}.am-fade-and-slide-bottom.ng-enter.ng-enter-active{visibility:visible}.am-fade-and-slide-bottom.ng-leave{-webkit-animation-name:fadeAndSlideToBottom;animation-name:fadeAndSlideToBottom}.am-fade-and-slide-left{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-fade-and-slide-left.am-fade-and-slide-left-add,.am-fade-and-slide-left.ng-hide-remove,.am-fade-and-slide-left.ng-move{-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards;-webkit-animation-name:fadeAndSlideFromLeft;animation-name:fadeAndSlideFromLeft}.am-fade-and-slide-left.am-fade-and-slide-left-remove,.am-fade-and-slide-left.ng-hide{-webkit-animation-name:fadeAndSlideToLeft;animation-name:fadeAndSlideToLeft}.am-fade-and-slide-left.ng-enter{visibility:hidden;-webkit-animation-name:fadeAndSlideFromLeft;animation-name:fadeAndSlideFromLeft}.am-fade-and-slide-left.ng-enter.ng-enter-active{visibility:visible}.am-fade-and-slide-left.ng-leave{-webkit-animation-name:fadeAndSlideToLeft;animation-name:fadeAndSlideToLeft}@-webkit-keyframes fadeAndSlideFromTop{from{opacity:0;-webkit-transform:translateY(-20%);transform:translateY(-20%)}to{opacity:1}}@keyframes fadeAndSlideFromTop{from{opacity:0;-webkit-transform:translateY(-20%);transform:translateY(-20%)}to{opacity:1}}@-webkit-keyframes fadeAndSlideToTop{from{opacity:1}to{opacity:0;-webkit-transform:translateY(-20%);transform:translateY(-20%)}}@keyframes fadeAndSlideToTop{from{opacity:1}to{opacity:0;-webkit-transform:translateY(-20%);transform:translateY(-20%)}}@-webkit-keyframes fadeAndSlideFromRight{from{opacity:0;-webkit-transform:translateX(20%);transform:translateX(20%)}to{opacity:1}}@keyframes fadeAndSlideFromRight{from{opacity:0;-webkit-transform:translateX(20%);transform:translateX(20%)}to{opacity:1}}@-webkit-keyframes fadeAndSlideToRight{from{opacity:1}to{opacity:0;-webkit-transform:translateX(20%);transform:translateX(20%)}}@keyframes fadeAndSlideToRight{from{opacity:1}to{opacity:0;-webkit-transform:translateX(20%);transform:translateX(20%)}}@-webkit-keyframes fadeAndSlideFromBottom{from{opacity:0;-webkit-transform:translateY(20%);transform:translateY(20%)}to{opacity:1}}@keyframes fadeAndSlideFromBottom{from{opacity:0;-webkit-transform:translateY(20%);transform:translateY(20%)}to{opacity:1}}@-webkit-keyframes fadeAndSlideToBottom{from{opacity:1}to{opacity:0;-webkit-transform:translateY(20%);transform:translateY(20%)}}@keyframes fadeAndSlideToBottom{from{opacity:1}to{opacity:0;-webkit-transform:translateY(20%);transform:translateY(20%)}}@-webkit-keyframes fadeAndSlideFromLeft{from{opacity:0;-webkit-transform:translateX(-20%);transform:translateX(-20%)}to{opacity:1}}@keyframes fadeAndSlideFromLeft{from{opacity:0;-webkit-transform:translateX(-20%);transform:translateX(-20%)}to{opacity:1}}@-webkit-keyframes fadeAndSlideToLeft{from{opacity:1}to{opacity:0;-webkit-transform:translateX(-20%);transform:translateX(-20%)}}@keyframes fadeAndSlideToLeft{from{opacity:1}to{opacity:0;-webkit-transform:translateX(-20%);transform:translateX(-20%)}} \ No newline at end of file diff --git a/web/src/main/webapp/components/angular-motion/dist/modules/fade.css b/web/src/main/webapp/components/angular-motion/dist/modules/fade.css deleted file mode 100644 index 462266e12..000000000 --- a/web/src/main/webapp/components/angular-motion/dist/modules/fade.css +++ /dev/null @@ -1,77 +0,0 @@ -/** - * angular-motion - * @version v0.3.2 - 2014-02-11 - * @link https://github.com/mgcrea/angular-motion - * @author Olivier Louvignes - * @license MIT License, http://www.opensource.org/licenses/MIT - */ -.am-fade { - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-timing-function: linear; - animation-timing-function: linear; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; - opacity: 1; -} -.am-fade.am-fade-add, -.am-fade.ng-hide-remove, -.am-fade.ng-move { - -webkit-animation-name: fadeIn; - animation-name: fadeIn; -} -.am-fade.am-fade-remove, -.am-fade.ng-hide { - -webkit-animation-name: fadeOut; - animation-name: fadeOut; -} -.am-fade.ng-enter { - visibility: hidden; - -webkit-animation-name: fadeIn; - animation-name: fadeIn; -} -.am-fade.ng-enter.ng-enter-active { - visibility: visible; -} -.am-fade.ng-leave { - -webkit-animation-name: fadeOut; - animation-name: fadeOut; -} -@-webkit-keyframes fadeIn { - from { - opacity: 0; - } - to { - opacity: 1; - } -} -@keyframes fadeIn { - from { - opacity: 0; - } - to { - opacity: 1; - } -} -@-webkit-keyframes fadeOut { - from { - opacity: 1; - } - to { - opacity: 0; - } -} -@keyframes fadeOut { - from { - opacity: 1; - } - to { - opacity: 0; - } -} -.modal-backdrop.am-fade, -.aside-backdrop.am-fade { - background: rgba(0, 0, 0, 0.5); - -webkit-animation-duration: 0.15s; - animation-duration: 0.15s; -} diff --git a/web/src/main/webapp/components/angular-motion/dist/modules/fade.min.css b/web/src/main/webapp/components/angular-motion/dist/modules/fade.min.css deleted file mode 100644 index 1543ced36..000000000 --- a/web/src/main/webapp/components/angular-motion/dist/modules/fade.min.css +++ /dev/null @@ -1,8 +0,0 @@ -/** - * angular-motion - * @version v0.3.2 - 2014-02-11 - * @link https://github.com/mgcrea/angular-motion - * @author Olivier Louvignes - * @license MIT License, http://www.opensource.org/licenses/MIT - */ -.am-fade{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards;opacity:1}.am-fade.am-fade-add,.am-fade.ng-hide-remove,.am-fade.ng-move{-webkit-animation-name:fadeIn;animation-name:fadeIn}.am-fade.am-fade-remove,.am-fade.ng-hide{-webkit-animation-name:fadeOut;animation-name:fadeOut}.am-fade.ng-enter{visibility:hidden;-webkit-animation-name:fadeIn;animation-name:fadeIn}.am-fade.ng-enter.ng-enter-active{visibility:visible}.am-fade.ng-leave{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes fadeIn{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadeOut{from{opacity:1}to{opacity:0}}@keyframes fadeOut{from{opacity:1}to{opacity:0}}.modal-backdrop.am-fade,.aside-backdrop.am-fade{background:rgba(0,0,0,.5);-webkit-animation-duration:.15s;animation-duration:.15s} \ No newline at end of file diff --git a/web/src/main/webapp/components/angular-motion/dist/modules/flip.css b/web/src/main/webapp/components/angular-motion/dist/modules/flip.css deleted file mode 100644 index 2bd86fef7..000000000 --- a/web/src/main/webapp/components/angular-motion/dist/modules/flip.css +++ /dev/null @@ -1,157 +0,0 @@ -/** - * angular-motion - * @version v0.3.2 - 2014-02-11 - * @link https://github.com/mgcrea/angular-motion - * @author Olivier Louvignes - * @license MIT License, http://www.opensource.org/licenses/MIT - */ -.am-flip-x { - -webkit-animation-duration: 0.4s; - animation-duration: 0.4s; - -webkit-animation-timing-function: ease; - animation-timing-function: ease; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; -} -.am-flip-x.am-flip-x-add, -.am-flip-x.ng-hide-remove, -.am-flip-x.ng-move { - -webkit-animation-name: flipInXBounce; - animation-name: flipInXBounce; -} -.am-flip-x.am-flip-x-remove, -.am-flip-x.ng-hide { - -webkit-animation-name: flipOutX; - animation-name: flipOutX; -} -.am-flip-x.ng-enter { - visibility: hidden; - -webkit-animation-name: flipInXBounce; - animation-name: flipInXBounce; -} -.am-flip-x.ng-enter.ng-enter-active { - visibility: visible; -} -.am-flip-x.ng-leave { - -webkit-animation-name: flipOutX; - animation-name: flipOutX; -} -.am-flip-x-linear { - -webkit-animation-duration: 0.4s; - animation-duration: 0.4s; - -webkit-animation-timing-function: ease; - animation-timing-function: ease; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; -} -.am-flip-x-linear.am-flip-x-add, -.am-flip-x-linear.ng-hide-remove, -.am-flip-x-linear.ng-move { - -webkit-animation-name: flipInX; - animation-name: flipInX; -} -.am-flip-x-linear.am-flip-x-remove, -.am-flip-x-linear.ng-hide { - -webkit-animation-name: flipOutX; - animation-name: flipOutX; -} -.am-flip-x-linear.ng-enter { - visibility: hidden; - -webkit-animation-name: flipInX; - animation-name: flipInX; -} -.am-flip-x-linear.ng-enter.ng-enter-active { - visibility: visible; -} -.am-flip-x-linear.ng-leave { - -webkit-animation-name: flipOutX; - animation-name: flipOutX; -} -@-webkit-keyframes flipInX { - from { - opacity: 0; - -webkit-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - } - to { - opacity: 1; - -webkit-transform: perspective(400px) rotateX(0deg); - transform: perspective(400px) rotateX(0deg); - } -} -@keyframes flipInX { - from { - opacity: 0; - -webkit-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - } - to { - opacity: 1; - -webkit-transform: perspective(400px) rotateX(0deg); - transform: perspective(400px) rotateX(0deg); - } -} -@-webkit-keyframes flipInXBounce { - from { - opacity: 0; - -webkit-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - } - 40% { - -webkit-transform: perspective(400px) rotateX(-10deg); - transform: perspective(400px) rotateX(-10deg); - } - 70% { - -webkit-transform: perspective(400px) rotateX(10deg); - transform: perspective(400px) rotateX(10deg); - } - to { - opacity: 1; - -webkit-transform: perspective(400px) rotateX(0deg); - transform: perspective(400px) rotateX(0deg); - } -} -@keyframes flipInXBounce { - from { - opacity: 0; - -webkit-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - } - 40% { - -webkit-transform: perspective(400px) rotateX(-10deg); - transform: perspective(400px) rotateX(-10deg); - } - 70% { - -webkit-transform: perspective(400px) rotateX(10deg); - transform: perspective(400px) rotateX(10deg); - } - to { - opacity: 1; - -webkit-transform: perspective(400px) rotateX(0deg); - transform: perspective(400px) rotateX(0deg); - } -} -@-webkit-keyframes flipOutX { - from { - opacity: 1; - -webkit-transform: perspective(400px) rotateX(0deg); - transform: perspective(400px) rotateX(0deg); - } - to { - opacity: 0; - -webkit-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - } -} -@keyframes flipOutX { - from { - opacity: 1; - -webkit-transform: perspective(400px) rotateX(0deg); - transform: perspective(400px) rotateX(0deg); - } - to { - opacity: 0; - -webkit-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - } -} diff --git a/web/src/main/webapp/components/angular-motion/dist/modules/flip.min.css b/web/src/main/webapp/components/angular-motion/dist/modules/flip.min.css deleted file mode 100644 index 9b54897c3..000000000 --- a/web/src/main/webapp/components/angular-motion/dist/modules/flip.min.css +++ /dev/null @@ -1,8 +0,0 @@ -/** - * angular-motion - * @version v0.3.2 - 2014-02-11 - * @link https://github.com/mgcrea/angular-motion - * @author Olivier Louvignes - * @license MIT License, http://www.opensource.org/licenses/MIT - */ -.am-flip-x{-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-timing-function:ease;animation-timing-function:ease;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-flip-x.am-flip-x-add,.am-flip-x.ng-hide-remove,.am-flip-x.ng-move{-webkit-animation-name:flipInXBounce;animation-name:flipInXBounce}.am-flip-x.am-flip-x-remove,.am-flip-x.ng-hide{-webkit-animation-name:flipOutX;animation-name:flipOutX}.am-flip-x.ng-enter{visibility:hidden;-webkit-animation-name:flipInXBounce;animation-name:flipInXBounce}.am-flip-x.ng-enter.ng-enter-active{visibility:visible}.am-flip-x.ng-leave{-webkit-animation-name:flipOutX;animation-name:flipOutX}.am-flip-x-linear{-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-timing-function:ease;animation-timing-function:ease;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-flip-x-linear.am-flip-x-add,.am-flip-x-linear.ng-hide-remove,.am-flip-x-linear.ng-move{-webkit-animation-name:flipInX;animation-name:flipInX}.am-flip-x-linear.am-flip-x-remove,.am-flip-x-linear.ng-hide{-webkit-animation-name:flipOutX;animation-name:flipOutX}.am-flip-x-linear.ng-enter{visibility:hidden;-webkit-animation-name:flipInX;animation-name:flipInX}.am-flip-x-linear.ng-enter.ng-enter-active{visibility:visible}.am-flip-x-linear.ng-leave{-webkit-animation-name:flipOutX;animation-name:flipOutX}@-webkit-keyframes flipInX{from{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}to{opacity:1;-webkit-transform:perspective(400px) rotateX(0deg);transform:perspective(400px) rotateX(0deg)}}@keyframes flipInX{from{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}to{opacity:1;-webkit-transform:perspective(400px) rotateX(0deg);transform:perspective(400px) rotateX(0deg)}}@-webkit-keyframes flipInXBounce{from{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}40%{-webkit-transform:perspective(400px) rotateX(-10deg);transform:perspective(400px) rotateX(-10deg)}70%{-webkit-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg)}to{opacity:1;-webkit-transform:perspective(400px) rotateX(0deg);transform:perspective(400px) rotateX(0deg)}}@keyframes flipInXBounce{from{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}40%{-webkit-transform:perspective(400px) rotateX(-10deg);transform:perspective(400px) rotateX(-10deg)}70%{-webkit-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg)}to{opacity:1;-webkit-transform:perspective(400px) rotateX(0deg);transform:perspective(400px) rotateX(0deg)}}@-webkit-keyframes flipOutX{from{opacity:1;-webkit-transform:perspective(400px) rotateX(0deg);transform:perspective(400px) rotateX(0deg)}to{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}}@keyframes flipOutX{from{opacity:1;-webkit-transform:perspective(400px) rotateX(0deg);transform:perspective(400px) rotateX(0deg)}to{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}} \ No newline at end of file diff --git a/web/src/main/webapp/components/angular-motion/dist/modules/slide.css b/web/src/main/webapp/components/angular-motion/dist/modules/slide.css deleted file mode 100644 index 83fac604f..000000000 --- a/web/src/main/webapp/components/angular-motion/dist/modules/slide.css +++ /dev/null @@ -1,227 +0,0 @@ -/** - * angular-motion - * @version v0.3.2 - 2014-02-11 - * @link https://github.com/mgcrea/angular-motion - * @author Olivier Louvignes - * @license MIT License, http://www.opensource.org/licenses/MIT - */ -.am-slide-top { - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; -} -.am-slide-top.am-fade-and-slide-top-add, -.am-slide-top.ng-hide-remove, -.am-slide-top.ng-move { - -webkit-animation-name: slideFromTop; - animation-name: slideFromTop; -} -.am-slide-top.am-fade-and-slide-top-remove, -.am-slide-top.ng-hide { - -webkit-animation-name: slideToTop; - animation-name: slideToTop; -} -.am-slide-top.ng-enter { - visibility: hidden; - -webkit-animation-name: slideFromTop; - animation-name: slideFromTop; -} -.am-slide-top.ng-enter.ng-enter-active { - visibility: visible; -} -.am-slide-top.ng-leave { - -webkit-animation-name: slideToTop; - animation-name: slideToTop; -} -.am-slide-right { - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; -} -.am-slide-right.am-fade-and-slide-right-add, -.am-slide-right.ng-hide-remove, -.am-slide-right.ng-move { - -webkit-animation-name: slideFromRight; - animation-name: slideFromRight; -} -.am-slide-right.am-fade-and-slide-right-remove, -.am-slide-right.ng-hide { - -webkit-animation-name: slideToRight; - animation-name: slideToRight; -} -.am-slide-right.ng-enter { - visibility: hidden; - -webkit-animation-name: slideFromRight; - animation-name: slideFromRight; -} -.am-slide-right.ng-enter.ng-enter-active { - visibility: visible; -} -.am-slide-right.ng-leave { - -webkit-animation-name: slideToRight; - animation-name: slideToRight; -} -.am-slide-bottom { - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; -} -.am-slide-bottom.am-fade-and-slide-bottom-add, -.am-slide-bottom.ng-hide-remove, -.am-slide-bottom.ng-move { - -webkit-animation-name: slideFromBottom; - animation-name: slideFromBottom; -} -.am-slide-bottom.am-fade-and-slide-bottom-remove, -.am-slide-bottom.ng-hide { - -webkit-animation-name: slideToBottom; - animation-name: slideToBottom; -} -.am-slide-bottom.ng-enter { - visibility: hidden; - -webkit-animation-name: slideFromBottom; - animation-name: slideFromBottom; -} -.am-slide-bottom.ng-enter.ng-enter-active { - visibility: visible; -} -.am-slide-bottom.ng-leave { - -webkit-animation-name: slideToBottom; - animation-name: slideToBottom; -} -.am-slide-left { - -webkit-animation-duration: 0.3s; - animation-duration: 0.3s; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - -webkit-animation-fill-mode: backwards; - animation-fill-mode: backwards; -} -.am-slide-left.am-fade-and-slide-left-add, -.am-slide-left.ng-hide-remove, -.am-slide-left.ng-move { - -webkit-animation-name: slideFromLeft; - animation-name: slideFromLeft; -} -.am-slide-left.am-fade-and-slide-left-remove, -.am-slide-left.ng-hide { - -webkit-animation-name: slideToLeft; - animation-name: slideToLeft; -} -.am-slide-left.ng-enter { - visibility: hidden; - -webkit-animation-name: slideFromLeft; - animation-name: slideFromLeft; -} -.am-slide-left.ng-enter.ng-enter-active { - visibility: visible; -} -.am-slide-left.ng-leave { - -webkit-animation-name: slideToLeft; - animation-name: slideToLeft; -} -@-webkit-keyframes slideFromTop { - from { - -webkit-transform: translateY(-100%); - transform: translateY(-100%); - } -} -@keyframes slideFromTop { - from { - -webkit-transform: translateY(-100%); - transform: translateY(-100%); - } -} -@-webkit-keyframes slideToTop { - to { - -webkit-transform: translateY(-100%); - transform: translateY(-100%); - } -} -@keyframes slideToTop { - to { - -webkit-transform: translateY(-100%); - transform: translateY(-100%); - } -} -@-webkit-keyframes slideFromRight { - from { - -webkit-transform: translateX(100%); - transform: translateX(100%); - } -} -@keyframes slideFromRight { - from { - -webkit-transform: translateX(100%); - transform: translateX(100%); - } -} -@-webkit-keyframes slideToRight { - to { - -webkit-transform: translateX(100%); - transform: translateX(100%); - } -} -@keyframes slideToRight { - to { - -webkit-transform: translateX(100%); - transform: translateX(100%); - } -} -@-webkit-keyframes slideFromBottom { - from { - -webkit-transform: translateY(100%); - transform: translateY(100%); - } -} -@keyframes slideFromBottom { - from { - -webkit-transform: translateY(100%); - transform: translateY(100%); - } -} -@-webkit-keyframes slideToBottom { - to { - -webkit-transform: translateY(100%); - transform: translateY(100%); - } -} -@keyframes slideToBottom { - to { - -webkit-transform: translateY(100%); - transform: translateY(100%); - } -} -@-webkit-keyframes slideFromLeft { - from { - -webkit-transform: translateX(-100%); - transform: translateX(-100%); - } -} -@keyframes slideFromLeft { - from { - -webkit-transform: translateX(-100%); - transform: translateX(-100%); - } -} -@-webkit-keyframes slideToLeft { - to { - -webkit-transform: translateX(-100%); - transform: translateX(-100%); - } -} -@keyframes slideToLeft { - to { - -webkit-transform: translateX(-100%); - transform: translateX(-100%); - } -} diff --git a/web/src/main/webapp/components/angular-motion/dist/modules/slide.min.css b/web/src/main/webapp/components/angular-motion/dist/modules/slide.min.css deleted file mode 100644 index c9beb0069..000000000 --- a/web/src/main/webapp/components/angular-motion/dist/modules/slide.min.css +++ /dev/null @@ -1,8 +0,0 @@ -/** - * angular-motion - * @version v0.3.2 - 2014-02-11 - * @link https://github.com/mgcrea/angular-motion - * @author Olivier Louvignes - * @license MIT License, http://www.opensource.org/licenses/MIT - */ -.am-slide-top{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-slide-top.am-fade-and-slide-top-add,.am-slide-top.ng-hide-remove,.am-slide-top.ng-move{-webkit-animation-name:slideFromTop;animation-name:slideFromTop}.am-slide-top.am-fade-and-slide-top-remove,.am-slide-top.ng-hide{-webkit-animation-name:slideToTop;animation-name:slideToTop}.am-slide-top.ng-enter{visibility:hidden;-webkit-animation-name:slideFromTop;animation-name:slideFromTop}.am-slide-top.ng-enter.ng-enter-active{visibility:visible}.am-slide-top.ng-leave{-webkit-animation-name:slideToTop;animation-name:slideToTop}.am-slide-right{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-slide-right.am-fade-and-slide-right-add,.am-slide-right.ng-hide-remove,.am-slide-right.ng-move{-webkit-animation-name:slideFromRight;animation-name:slideFromRight}.am-slide-right.am-fade-and-slide-right-remove,.am-slide-right.ng-hide{-webkit-animation-name:slideToRight;animation-name:slideToRight}.am-slide-right.ng-enter{visibility:hidden;-webkit-animation-name:slideFromRight;animation-name:slideFromRight}.am-slide-right.ng-enter.ng-enter-active{visibility:visible}.am-slide-right.ng-leave{-webkit-animation-name:slideToRight;animation-name:slideToRight}.am-slide-bottom{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-slide-bottom.am-fade-and-slide-bottom-add,.am-slide-bottom.ng-hide-remove,.am-slide-bottom.ng-move{-webkit-animation-name:slideFromBottom;animation-name:slideFromBottom}.am-slide-bottom.am-fade-and-slide-bottom-remove,.am-slide-bottom.ng-hide{-webkit-animation-name:slideToBottom;animation-name:slideToBottom}.am-slide-bottom.ng-enter{visibility:hidden;-webkit-animation-name:slideFromBottom;animation-name:slideFromBottom}.am-slide-bottom.ng-enter.ng-enter-active{visibility:visible}.am-slide-bottom.ng-leave{-webkit-animation-name:slideToBottom;animation-name:slideToBottom}.am-slide-left{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.am-slide-left.am-fade-and-slide-left-add,.am-slide-left.ng-hide-remove,.am-slide-left.ng-move{-webkit-animation-name:slideFromLeft;animation-name:slideFromLeft}.am-slide-left.am-fade-and-slide-left-remove,.am-slide-left.ng-hide{-webkit-animation-name:slideToLeft;animation-name:slideToLeft}.am-slide-left.ng-enter{visibility:hidden;-webkit-animation-name:slideFromLeft;animation-name:slideFromLeft}.am-slide-left.ng-enter.ng-enter-active{visibility:visible}.am-slide-left.ng-leave{-webkit-animation-name:slideToLeft;animation-name:slideToLeft}@-webkit-keyframes slideFromTop{from{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes slideFromTop{from{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes slideToTop{to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes slideToTop{to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes slideFromRight{from{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes slideFromRight{from{-webkit-transform:translateX(100%);transform:translateX(100%)}}@-webkit-keyframes slideToRight{to{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes slideToRight{to{-webkit-transform:translateX(100%);transform:translateX(100%)}}@-webkit-keyframes slideFromBottom{from{-webkit-transform:translateY(100%);transform:translateY(100%)}}@keyframes slideFromBottom{from{-webkit-transform:translateY(100%);transform:translateY(100%)}}@-webkit-keyframes slideToBottom{to{-webkit-transform:translateY(100%);transform:translateY(100%)}}@keyframes slideToBottom{to{-webkit-transform:translateY(100%);transform:translateY(100%)}}@-webkit-keyframes slideFromLeft{from{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes slideFromLeft{from{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@-webkit-keyframes slideToLeft{to{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes slideToLeft{to{-webkit-transform:translateX(-100%);transform:translateX(-100%)}} \ No newline at end of file diff --git a/web/src/main/webapp/components/angular-motion/package.json b/web/src/main/webapp/components/angular-motion/package.json deleted file mode 100644 index 409e5e2cf..000000000 --- a/web/src/main/webapp/components/angular-motion/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "name": "angular-motion", - "description": "AngularMotion - Fancy CSS3 animations for AngularJS 1.2+", - "version": "0.3.2", - "keywords": [ - "angular", - "animation" - ], - "homepage": "https://github.com/mgcrea/angular-motion", - "bugs": "https://github.com/mgcrea/angular-motion/issues", - "author": { - "name": "Olivier Louvignes", - "email": "olivier@mg-crea.com", - "url": "https://github.com/mgcrea" - }, - "repository": { - "type": "git", - "url": "https://github.com/mgcrea/angular-motion.git" - }, - "licenses": [ - { - "type": "MIT" - } - ], - "dependencies": {}, - "devDependencies": { - "grunt": "~0.4.2", - "grunt-angular-templates": "~0.5.1", - "grunt-autoprefixer": "~0.6.5", - "grunt-concurrent": "~0.4.3", - "grunt-contrib-clean": "~0.5.0", - "grunt-contrib-concat": "~0.3.0", - "grunt-contrib-connect": "~0.6.0", - "grunt-contrib-copy": "~0.5.0", - "grunt-contrib-cssmin": "~0.7.0", - "grunt-contrib-htmlmin": "~0.2.0", - "grunt-contrib-jshint": "~0.8.0", - "grunt-contrib-less": "~0.9.0", - "grunt-contrib-uglify": "~0.3.2", - "grunt-contrib-watch": "~0.5.3", - "grunt-karma": "~0.6.2", - "grunt-newer": "~0.6.1", - "grunt-nginclude": "~0.3.1", - "grunt-ngmin": "0.0.3", - "grunt-rev": "~0.1.0", - "grunt-usemin": "~2.0.2", - "jshint-stylish": "~0.1.5", - "karma-coverage": "~0.1.5", - "load-grunt-tasks": "~0.3.0" - }, - "engines": { - "node": ">=0.8.0" - }, - "scripts": { - "test": "grunt test" - } -} diff --git a/web/src/main/webapp/components/angular-motion/src/fade-and-scale/docs/fade-and-scale.demo.html b/web/src/main/webapp/components/angular-motion/src/fade-and-scale/docs/fade-and-scale.demo.html deleted file mode 100644 index 4051aecc4..000000000 --- a/web/src/main/webapp/components/angular-motion/src/fade-and-scale/docs/fade-and-scale.demo.html +++ /dev/null @@ -1,29 +0,0 @@ -
- - - -

Fancy scale animation that leverages CSS3 keyframes, see browser support.

-

This animation works with scale, opacity animating respectively from .7 to 1, 0 to 1.

- -

Live demo

- -
- -
fade-and-scale
- - - -
- - -

Usage

-

Append one of theses classes am-fade-and-scale to enable theses transitions.

-
-

AngularStrap integration

-

You should use the data-animation attribute with AngularStrap.

-
- -
diff --git a/web/src/main/webapp/components/angular-motion/src/fade-and-scale/fade-and-scale.less b/web/src/main/webapp/components/angular-motion/src/fade-and-scale/fade-and-scale.less deleted file mode 100644 index e4f9de0ce..000000000 --- a/web/src/main/webapp/components/angular-motion/src/fade-and-scale/fade-and-scale.less +++ /dev/null @@ -1,56 +0,0 @@ - -// Fade & Slide -// - -@fade-and-scale-duration: .3s; -@fade-and-scale-timing-function: ease-in-out; - -.am-fade-and-scale { - - animation-duration: @fade-and-scale-duration; - animation-timing-function: @fade-and-scale-timing-function; - animation-fill-mode: backwards; - - &.ng-enter, &.am-fade-and-scale-add, &.ng-hide-remove, &.ng-move { - animation-name: fadeAndScaleIn; - } - &.ng-leave, &.am-fade-and-scale-remove, &.ng-hide { - animation-name: fadeAndScaleOut; - } - - &.ng-enter { - visibility: hidden; - animation-name: fadeAndScaleIn; - &.ng-enter-active { - visibility: visible; - } - } - &.ng-leave { - animation-name: fadeAndScaleOut; - } - -} - - -// Keyframes -// - -@keyframes fadeAndScaleIn { - from { - opacity: 0; - transform: scale(0.7); - } - to { - opacity: 1; - } -} - -@keyframes fadeAndScaleOut { - from { - opacity: 1; - } - to { - opacity: 0; - transform: scale(0.7); - } -} diff --git a/web/src/main/webapp/components/angular-motion/src/fade-and-slide/docs/fade-and-slide.demo.html b/web/src/main/webapp/components/angular-motion/src/fade-and-slide/docs/fade-and-slide.demo.html deleted file mode 100644 index b769d1420..000000000 --- a/web/src/main/webapp/components/angular-motion/src/fade-and-slide/docs/fade-and-slide.demo.html +++ /dev/null @@ -1,35 +0,0 @@ -
- - - -

Fancy slide animation that leverages CSS3 keyframes, see browser support.

-

This animation works with translateX/Y, opacity animating respectively from 0% to 20%, 0 to 1.

- -

Live demo

- -
- -
fade-and-slide
- - - -

- - - - - -
- - -

Usage

-

Append one of theses classes am-fade-and-slide-top, am-fade-and-slide-right, am-fade-and-slide-bottom, am-fade-and-slide-left to enable theses transitions.

-
-

AngularStrap integration

-

You should use the data-animation attribute with AngularStrap.

-
- -
diff --git a/web/src/main/webapp/components/angular-motion/src/fade-and-slide/fade-and-slide.less b/web/src/main/webapp/components/angular-motion/src/fade-and-slide/fade-and-slide.less deleted file mode 100644 index 9fc9ac2c5..000000000 --- a/web/src/main/webapp/components/angular-motion/src/fade-and-slide/fade-and-slide.less +++ /dev/null @@ -1,194 +0,0 @@ - -// Fade & Slide -// - -@fade-and-slide-duration: .3s; -@fade-and-slide-timing-function: ease-in-out; - -.am-fade-and-slide-top { - - animation-duration: @fade-and-slide-duration; - animation-timing-function: @fade-and-slide-timing-function; - animation-fill-mode: backwards; - - &.am-fade-and-slide-top-add, &.ng-hide-remove, &.ng-move { - animation-name: fadeAndSlideFromTop; - } - &.am-fade-and-slide-top-remove, &.ng-hide { - animation-name: fadeAndSlideToTop; - } - - &.ng-enter { - visibility: hidden; - animation-name: fadeAndSlideFromTop; - &.ng-enter-active { - visibility: visible; - } - } - &.ng-leave { - animation-name: fadeAndSlideToTop; - } - -} - -.am-fade-and-slide-right { - - animation-duration: @fade-and-slide-duration; - animation-timing-function: @fade-and-slide-timing-function; - animation-fill-mode: backwards; - - &.am-fade-and-slide-right-add, &.ng-hide-remove, &.ng-move { - animation-name: fadeAndSlideFromRight; - } - &.am-fade-and-slide-right-remove, &.ng-hide { - animation-name: fadeAndSlideToRight; - } - - &.ng-enter { - visibility: hidden; - animation-name: fadeAndSlideFromRight; - &.ng-enter-active { - visibility: visible; - } - } - &.ng-leave { - animation-name: fadeAndSlideToRight; - } - -} - -.am-fade-and-slide-bottom { - - animation-duration: @fade-and-slide-duration; - animation-timing-function: @fade-and-slide-timing-function; - animation-fill-mode: backwards; - - &.am-fade-and-slide-bottom-add, &.ng-hide-remove, &.ng-move { - animation-name: fadeAndSlideFromBottom; - } - &.am-fade-and-slide-bottom-remove, &.ng-hide { - animation-name: fadeAndSlideToBottom; - } - - &.ng-enter { - visibility: hidden; - animation-name: fadeAndSlideFromBottom; - &.ng-enter-active { - visibility: visible; - } - } - &.ng-leave { - animation-name: fadeAndSlideToBottom; - } - -} - -.am-fade-and-slide-left { - - animation-duration: @fade-and-slide-duration; - animation-timing-function: @fade-and-slide-timing-function; - animation-fill-mode: backwards; - - &.am-fade-and-slide-left-add, &.ng-hide-remove, &.ng-move { - animation-fill-mode: backwards; - animation-name: fadeAndSlideFromLeft; - } - &.am-fade-and-slide-left-remove, &.ng-hide { - animation-name: fadeAndSlideToLeft; - } - - &.ng-enter { - visibility: hidden; - animation-name: fadeAndSlideFromLeft; - &.ng-enter-active { - visibility: visible; - } - } - &.ng-leave { - animation-name: fadeAndSlideToLeft; - } - -} - - -// Keyframes -// - -@keyframes fadeAndSlideFromTop { - from { - opacity: 0; - transform: translateY(-20%); - } - to { - opacity: 1; - } -} - -@keyframes fadeAndSlideToTop { - from { - opacity: 1; - } - to { - opacity: 0; - transform: translateY(-20%); - } -} - -@keyframes fadeAndSlideFromRight { - from { - opacity: 0; - transform: translateX(20%); - } - to { - opacity: 1; - } -} -@keyframes fadeAndSlideToRight { - from { - opacity: 1; - } - to { - opacity: 0; - transform: translateX(20%); - } -} - -@keyframes fadeAndSlideFromBottom { - from { - opacity: 0; - transform: translateY(20%); - } - to { - opacity: 1; - } -} - -@keyframes fadeAndSlideToBottom { - from { - opacity: 1; - } - to { - opacity: 0; - transform: translateY(20%); - } -} - -@keyframes fadeAndSlideFromLeft { - from { - opacity: 0; - transform: translateX(-20%); - } - to { - opacity: 1; - } -} - -@keyframes fadeAndSlideToLeft { - from { - opacity: 1; - } - to { - opacity: 0; - transform: translateX(-20%); - } -} diff --git a/web/src/main/webapp/components/angular-motion/src/fade/docs/fade.demo.html b/web/src/main/webapp/components/angular-motion/src/fade/docs/fade.demo.html deleted file mode 100644 index b6621b7c6..000000000 --- a/web/src/main/webapp/components/angular-motion/src/fade/docs/fade.demo.html +++ /dev/null @@ -1,35 +0,0 @@ -
- - - -

Basic fade animation that leverages CSS3 keyframes, see browser support.

-

This animation works with opacity animating respectively from 0 to 1.

- -

Live demo

- -
- -
fade
- - - -

- - - - - -
- - -

Usage

-

Append one of theses classes am-fade to enable theses transitions.

-
-

AngularStrap integration

-

You should use the data-animation attribute with AngularStrap.

-
- -
diff --git a/web/src/main/webapp/components/angular-motion/src/fade/fade.less b/web/src/main/webapp/components/angular-motion/src/fade/fade.less deleted file mode 100644 index 01866735a..000000000 --- a/web/src/main/webapp/components/angular-motion/src/fade/fade.less +++ /dev/null @@ -1,69 +0,0 @@ - -// Fade -// - -@fade-duration: .3s; -@fade-timing-function: linear; - -.am-fade { - - animation-duration: @fade-duration; - animation-timing-function: @fade-timing-function; - animation-fill-mode: backwards; - opacity: 1; - - &.am-fade-add, &.ng-hide-remove, &.ng-move { - animation-name: fadeIn; - } - &.am-fade-remove, &.ng-hide { - animation-name: fadeOut; - } - - &.ng-enter { - visibility: hidden; - animation-name: fadeIn; - &.ng-enter-active { - visibility: visible; - } - } - &.ng-leave { - animation-name: fadeOut; - } - -} - - -// Keyframes -// - -@keyframes fadeIn { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -@keyframes fadeOut { - from { - opacity: 1; - } - to { - opacity: 0; - } -} - -// Bootstrap 3 -// - -.modal-backdrop, .aside-backdrop { - - &.am-fade { - - background: rgba(0, 0, 0, .5); - animation-duration: @fade-duration / 2; - - } - -} diff --git a/web/src/main/webapp/components/angular-motion/src/flip/docs/flip.demo.html b/web/src/main/webapp/components/angular-motion/src/flip/docs/flip.demo.html deleted file mode 100644 index 64d6c940a..000000000 --- a/web/src/main/webapp/components/angular-motion/src/flip/docs/flip.demo.html +++ /dev/null @@ -1,31 +0,0 @@ -
- - - -

Fancy flip animation that leverages CSS3 keyframes, see browser support.

-

This animation works with perspective, rotate animating respectively from to 400px, 90 to 0.

- -

Live demo

- -
- -
flip
- - - - - -
- - -

Usage

-

Append one of theses classes am-flip-x to enable theses transitions.

-
-

AngularStrap integration

-

You should use the data-animation attribute with AngularStrap.

-
- -
diff --git a/web/src/main/webapp/components/angular-motion/src/flip/flip.less b/web/src/main/webapp/components/angular-motion/src/flip/flip.less deleted file mode 100644 index 9f3d4f1ce..000000000 --- a/web/src/main/webapp/components/angular-motion/src/flip/flip.less +++ /dev/null @@ -1,101 +0,0 @@ - - -// Fade -// - -@flip-duration: .4s; -@flip-timing-function: ease; - -.am-flip-x { - - animation-duration: @flip-duration; - animation-timing-function: @flip-timing-function; - animation-fill-mode: backwards; - - &.am-flip-x-add, &.ng-hide-remove, &.ng-move { - animation-name: flipInXBounce; - } - &.am-flip-x-remove, &.ng-hide { - animation-name: flipOutX; - } - - &.ng-enter { - visibility: hidden; - animation-name: flipInXBounce; - &.ng-enter-active { - visibility: visible; - } - } - &.ng-leave { - animation-name: flipOutX; - } - -} - -.am-flip-x-linear { - - animation-duration: @flip-duration; - animation-timing-function: @flip-timing-function; - animation-fill-mode: backwards; - - &.am-flip-x-add, &.ng-hide-remove, &.ng-move { - animation-name: flipInX; - } - &.am-flip-x-remove, &.ng-hide { - animation-name: flipOutX; - } - - &.ng-enter { - visibility: hidden; - animation-name: flipInX; - &.ng-enter-active { - visibility: visible; - } - } - &.ng-leave { - animation-name: flipOutX; - } - -} - -// Keyframes -// - -@keyframes flipInX { - from { - opacity: 0; - transform: perspective(400px) rotateX(90deg); - } - to { - opacity: 1; - transform: perspective(400px) rotateX(0deg); - } -} - -@keyframes flipInXBounce { - from { - opacity: 0; - transform: perspective(400px) rotateX(90deg); - } - 40% { - transform: perspective(400px) rotateX(-10deg); - } - 70% { - transform: perspective(400px) rotateX(10deg); - } - to { - opacity: 1; - transform: perspective(400px) rotateX(0deg); - } -} - -@keyframes flipOutX { - from { - opacity: 1; - transform: perspective(400px) rotateX(0deg); - } - to { - opacity: 0; - transform: perspective(400px) rotateX(90deg); - } -} diff --git a/web/src/main/webapp/components/angular-motion/src/slide/docs/slide.demo.html b/web/src/main/webapp/components/angular-motion/src/slide/docs/slide.demo.html deleted file mode 100644 index 4decebe3c..000000000 --- a/web/src/main/webapp/components/angular-motion/src/slide/docs/slide.demo.html +++ /dev/null @@ -1,36 +0,0 @@ -
- - - -

Basic slide animation that leverages CSS3 keyframes, see browser support.

-

This animation works with translateX/Y animating from 0% to 100%.

- -

Live demo

- -
- -
slide
- - - - - - - - - -
- - -

Usage

-

Append one of theses classes am-slide-top, am-slide-right, am-slide-bottom, am-slide-left to enable theses transitions,

-
-

AngularStrap integration

-

You should use the data-animation attribute with AngularStrap.

-
- -
diff --git a/web/src/main/webapp/components/angular-motion/src/slide/docs/slide.demo.js b/web/src/main/webapp/components/angular-motion/src/slide/docs/slide.demo.js deleted file mode 100644 index 90c397e82..000000000 --- a/web/src/main/webapp/components/angular-motion/src/slide/docs/slide.demo.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict'; - -angular.module('mgcrea.ngStrapDocs') - -.config(function($asideProvider, $modalProvider) { - angular.extend($modalProvider.defaults, { - container: 'body', - html: true - }); - angular.extend($asideProvider.defaults, { - container: 'body', - html: true - }); -}) - -.controller('SlideDemoCtrl', function($scope) { - $scope.aside = {title: 'Title', content: 'Hello Aside
This is a multiline message!'}; - $scope.modal = {title: 'Title', content: 'Hello Modal
This is a multiline message!'}; -}); diff --git a/web/src/main/webapp/components/angular-motion/src/slide/slide.less b/web/src/main/webapp/components/angular-motion/src/slide/slide.less deleted file mode 100644 index fcda5f8ab..000000000 --- a/web/src/main/webapp/components/angular-motion/src/slide/slide.less +++ /dev/null @@ -1,160 +0,0 @@ - -// Slide -// - -@slide-duration: .3s; -@slide-timing-function: ease-in-out; - -.am-slide-top { - - animation-duration: @slide-duration; - animation-timing-function: @slide-timing-function; - animation-fill-mode: backwards; - - &.am-fade-and-slide-top-add, &.ng-hide-remove, &.ng-move { - animation-name: slideFromTop; - } - &.am-fade-and-slide-top-remove, &.ng-hide { - animation-name: slideToTop; - } - - &.ng-enter { - visibility: hidden; - animation-name: slideFromTop; - &.ng-enter-active { - visibility: visible; - } - } - &.ng-leave, { - animation-name: slideToTop; - } - -} - -.am-slide-right { - - animation-duration: @slide-duration; - animation-timing-function: @slide-timing-function; - animation-fill-mode: backwards; - - &.am-fade-and-slide-right-add, &.ng-hide-remove, &.ng-move { - animation-name: slideFromRight; - } - &.am-fade-and-slide-right-remove, &.ng-hide { - animation-name: slideToRight; - } - - &.ng-enter { - visibility: hidden; - animation-name: slideFromRight; - &.ng-enter-active { - visibility: visible; - } - } - &.ng-leave, { - animation-name: slideToRight; - } - -} - -.am-slide-bottom { - - animation-duration: @slide-duration; - animation-timing-function: @slide-timing-function; - animation-fill-mode: backwards; - - &.am-fade-and-slide-bottom-add, &.ng-hide-remove, &.ng-move { - animation-name: slideFromBottom; - } - &.am-fade-and-slide-bottom-remove, &.ng-hide { - animation-name: slideToBottom; - } - - &.ng-enter { - visibility: hidden; - animation-name: slideFromBottom; - &.ng-enter-active { - visibility: visible; - } - } - &.ng-leave, { - animation-name: slideToBottom; - } - -} - -.am-slide-left { - - animation-duration: @slide-duration; - animation-timing-function: @slide-timing-function; - animation-fill-mode: backwards; - - &.am-fade-and-slide-left-add, &.ng-hide-remove, &.ng-move { - animation-name: slideFromLeft; - } - &.am-fade-and-slide-left-remove, &.ng-hide { - animation-name: slideToLeft; - } - - &.ng-enter { - visibility: hidden; - animation-name: slideFromLeft; - &.ng-enter-active { - visibility: visible; - } - } - &.ng-leave, { - animation-name: slideToLeft; - } - -} - - -// Keyframes -// - -@keyframes slideFromTop { - from { - transform: translateY(-100%); - } -} - -@keyframes slideToTop { - to { - transform: translateY(-100%); - } -} - -@keyframes slideFromRight { - from { - transform: translateX(100%); - } -} -@keyframes slideToRight { - to { - transform: translateX(100%); - } -} - -@keyframes slideFromBottom { - from { - transform: translateY(100%); - } -} - -@keyframes slideToBottom { - to { - transform: translateY(100%); - } -} - -@keyframes slideFromLeft { - from { - transform: translateX(-100%); - } -} -@keyframes slideToLeft { - to { - transform: translateX(-100%); - } -} diff --git a/web/src/main/webapp/components/angular-motion/test/.jshintrc b/web/src/main/webapp/components/angular-motion/test/.jshintrc deleted file mode 100644 index 91f082c12..000000000 --- a/web/src/main/webapp/components/angular-motion/test/.jshintrc +++ /dev/null @@ -1,32 +0,0 @@ -{ - "node": true, - "browser": true, - "esnext": true, - "bitwise": true, - "camelcase": false, - "curly": false, - "eqeqeq": true, - "immed": true, - "indent": 2, - "latedef": true, - "newcap": true, - "noarg": true, - "quotmark": "single", - "regexp": true, - "undef": true, - "unused": false, - "strict": true, - "globalstrict": true, - "trailing": true, - "smarttabs": true, - "predef": [ - "$", - "angular", - "describe", - "beforeEach", - "afterEach", - "inject", - "it", - "expect" - ] -} diff --git a/web/src/main/webapp/components/angular-motion/test/karma.conf.js b/web/src/main/webapp/components/angular-motion/test/karma.conf.js deleted file mode 100644 index 7df101b74..000000000 --- a/web/src/main/webapp/components/angular-motion/test/karma.conf.js +++ /dev/null @@ -1,63 +0,0 @@ -// Karma configuration -'use strict'; - -module.exports = function(config) { - - config.set({ - - // base path, that will be used to resolve files and exclude - basePath: './..', - - // frameworks to use - frameworks: ['jasmine'], - - // list of files / patterns to load in the browser - files: [ - 'bower_components/angular/angular.js', - 'bower_components/angular-mocks/angular-mocks.js', - 'bower_components/angular-animate/angular-animate.js', - 'src/{,*/}*.js', - 'bower_components/jquery/jquery.js', - 'test/spec/*.js' - ], - - // list of files / patterns to exclude - exclude: [ - ], - - // test results reporter to use - // possible values: 'dots', 'progress', 'junit', 'growl', 'coverage' - reporters: ['progress'], - - // web server port - port: 9876, - - // enable / disable colors in the output (reporters and logs) - colors: true, - - // level of logging - // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG - logLevel: config.LOG_INFO, - - // enable / disable watching file and executing tests whenever any file changes - autoWatch: false, - - // Start these browsers, currently available: - // - Chrome - // - ChromeCanary - // - Firefox - // - Opera (has to be installed with `npm install karma-opera-launcher`) - // - Safari (only Mac; has to be installed with `npm install karma-safari-launcher`) - // - PhantomJS - // - IE (only Windows; has to be installed with `npm install karma-ie-launcher`) - browsers: ['PhantomJS'], - - // If browser does not capture in given timeout [ms], kill it - captureTimeout: 60000, - - // Continuous Integration mode - // if true, it capture browsers, run tests and exit - singleRun: false - - }); -}; diff --git a/web/src/main/webapp/components/angular-motion/test/spec/main.js b/web/src/main/webapp/components/angular-motion/test/spec/main.js deleted file mode 100644 index de4af7022..000000000 --- a/web/src/main/webapp/components/angular-motion/test/spec/main.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict'; - -describe('Animations', function() { - - beforeEach(module('ngAnimate')); - - var scope, $animate; - - // Load ngAnimate and a mock scope - beforeEach(inject(function($rootScope, _$animate_) { - scope = $rootScope.$new(); - $animate = _$animate_; - })); - - it('the animate service should be properly defined', function() { - expect($animate).toBeDefined(); - }); - -}); diff --git a/web/src/main/webapp/components/angular-scenario/.bower.json b/web/src/main/webapp/components/angular-scenario/.bower.json deleted file mode 100644 index 1ce905020..000000000 --- a/web/src/main/webapp/components/angular-scenario/.bower.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "angular-scenario", - "version": "1.2.18", - "main": "./angular-scenario.js", - "dependencies": { - "angular": "1.2.18" - }, - "homepage": "https://github.com/angular/bower-angular-scenario", - "_release": "1.2.18", - "_resolution": { - "type": "version", - "tag": "v1.2.18", - "commit": "ced796ccc54bd2d9942216aecd499a672cec6e2c" - }, - "_source": "git://github.com/angular/bower-angular-scenario.git", - "_target": "1.2.18", - "_originalSource": "angular-scenario" -} \ No newline at end of file diff --git a/web/src/main/webapp/components/angular-scenario/README.md b/web/src/main/webapp/components/angular-scenario/README.md deleted file mode 100644 index 7f80a8c55..000000000 --- a/web/src/main/webapp/components/angular-scenario/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# bower-angular-scenario - -This repo is for distribution on `bower`. The source for this module is in the -[main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngScenario). -Please file issues and pull requests against that repo. - -## Install - -Install with `bower`: - -```shell -bower install angular-scenario -``` - -## Documentation - -Documentation is available on the -[AngularJS docs site](http://docs.angularjs.org/). - -## License - -The MIT License - -Copyright (c) 2010-2012 Google, Inc. http://angularjs.org - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/web/src/main/webapp/components/angular-scenario/angular-scenario.js b/web/src/main/webapp/components/angular-scenario/angular-scenario.js deleted file mode 100644 index d17a2edec..000000000 --- a/web/src/main/webapp/components/angular-scenario/angular-scenario.js +++ /dev/null @@ -1,33718 +0,0 @@ -/*! - * jQuery JavaScript Library v1.10.2 - * http://jquery.com/ - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * - * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2013-07-03T13:48Z - */ -(function( window, undefined ) {'use strict'; - -// Can't do this because several apps including ASP.NET trace -// the stack via arguments.caller.callee and Firefox dies if -// you try to trace through "use strict" call chains. (#13335) -// Support: Firefox 18+ -// - -var - // The deferred used on DOM ready - readyList, - - // A central reference to the root jQuery(document) - rootjQuery, - - // Support: IE<10 - // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined` - core_strundefined = typeof undefined, - - // Use the correct document accordingly with window argument (sandbox) - location = window.location, - document = window.document, - docElem = document.documentElement, - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$, - - // [[Class]] -> type pairs - class2type = {}, - - // List of deleted data cache ids, so we can reuse them - core_deletedIds = [], - - core_version = "1.10.2", - - // Save a reference to some core methods - core_concat = core_deletedIds.concat, - core_push = core_deletedIds.push, - core_slice = core_deletedIds.slice, - core_indexOf = core_deletedIds.indexOf, - core_toString = class2type.toString, - core_hasOwn = class2type.hasOwnProperty, - core_trim = core_version.trim, - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context, rootjQuery ); - }, - - // Used for matching numbers - core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, - - // Used for splitting on whitespace - core_rnotwhite = /\S+/g, - - // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE) - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, - - // Match a standalone tag - rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, - - // JSON RegExp - rvalidchars = /^[\],:{}\s]*$/, - rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, - rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g, - rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([\da-z])/gi, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }, - - // The ready event handler - completed = function( event ) { - - // readyState === "complete" is good enough for us to call the dom ready in oldIE - if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) { - detach(); - jQuery.ready(); - } - }, - // Clean-up method for dom ready events - detach = function() { - if ( document.addEventListener ) { - document.removeEventListener( "DOMContentLoaded", completed, false ); - window.removeEventListener( "load", completed, false ); - - } else { - document.detachEvent( "onreadystatechange", completed ); - window.detachEvent( "onload", completed ); - } - }; - -jQuery.fn = jQuery.prototype = { - // The current version of jQuery being used - jquery: core_version, - - constructor: jQuery, - init: function( selector, context, rootjQuery ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - - // scripts is true for back-compat - jQuery.merge( this, jQuery.parseHTML( - match[1], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[2] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id !== match[2] ) { - return rootjQuery.find( selector ); - } - - // Otherwise, we inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || rootjQuery ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return rootjQuery.ready( selector ); - } - - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }, - - // Start with an empty selector - selector: "", - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return core_slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num == null ? - - // Return a 'clean' array - this.toArray() : - - // Return just the object - ( num < 0 ? this[ this.length + num ] : this[ num ] ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - ret.context = this.context; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - ready: function( fn ) { - // Add the callback - jQuery.ready.promise().done( fn ); - - return this; - }, - - slice: function() { - return this.pushStack( core_slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { - return callback.call( elem, i, elem ); - })); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: core_push, - sort: [].sort, - splice: [].splice -}; - -// Give the init function the jQuery prototype for later instantiation -jQuery.fn.init.prototype = jQuery.fn; - -jQuery.extend = jQuery.fn.extend = function() { - var src, copyIsArray, copy, name, options, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if ( length === i ) { - target = this; - --i; - } - - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend({ - // Unique for each copy of jQuery on the page - // Non-digits removed to match rinlinejQuery - expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ), - - noConflict: function( deep ) { - if ( window.$ === jQuery ) { - window.$ = _$; - } - - if ( deep && window.jQuery === jQuery ) { - window.jQuery = _jQuery; - } - - return jQuery; - }, - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( !document.body ) { - return setTimeout( jQuery.ready ); - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.trigger ) { - jQuery( document ).trigger("ready").off("ready"); - } - }, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray || function( obj ) { - return jQuery.type(obj) === "array"; - }, - - isWindow: function( obj ) { - /* jshint eqeqeq: false */ - return obj != null && obj == obj.window; - }, - - isNumeric: function( obj ) { - return !isNaN( parseFloat(obj) ) && isFinite( obj ); - }, - - type: function( obj ) { - if ( obj == null ) { - return String( obj ); - } - return typeof obj === "object" || typeof obj === "function" ? - class2type[ core_toString.call(obj) ] || "object" : - typeof obj; - }, - - isPlainObject: function( obj ) { - var key; - - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - try { - // Not own constructor property must be Object - if ( obj.constructor && - !core_hasOwn.call(obj, "constructor") && - !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { - return false; - } - } catch ( e ) { - // IE8,9 Will throw exceptions on certain host objects #9897 - return false; - } - - // Support: IE<9 - // Handle iteration over inherited properties before own properties. - if ( jQuery.support.ownLast ) { - for ( key in obj ) { - return core_hasOwn.call( obj, key ); - } - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - for ( key in obj ) {} - - return key === undefined || core_hasOwn.call( obj, key ); - }, - - isEmptyObject: function( obj ) { - var name; - for ( name in obj ) { - return false; - } - return true; - }, - - error: function( msg ) { - throw new Error( msg ); - }, - - // data: string of html - // context (optional): If specified, the fragment will be created in this context, defaults to document - // keepScripts (optional): If true, will include scripts passed in the html string - parseHTML: function( data, context, keepScripts ) { - if ( !data || typeof data !== "string" ) { - return null; - } - if ( typeof context === "boolean" ) { - keepScripts = context; - context = false; - } - context = context || document; - - var parsed = rsingleTag.exec( data ), - scripts = !keepScripts && []; - - // Single tag - if ( parsed ) { - return [ context.createElement( parsed[1] ) ]; - } - - parsed = jQuery.buildFragment( [ data ], context, scripts ); - if ( scripts ) { - jQuery( scripts ).remove(); - } - return jQuery.merge( [], parsed.childNodes ); - }, - - parseJSON: function( data ) { - // Attempt to parse using the native JSON parser first - if ( window.JSON && window.JSON.parse ) { - return window.JSON.parse( data ); - } - - if ( data === null ) { - return data; - } - - if ( typeof data === "string" ) { - - // Make sure leading/trailing whitespace is removed (IE can't handle it) - data = jQuery.trim( data ); - - if ( data ) { - // Make sure the incoming data is actual JSON - // Logic borrowed from http://json.org/json2.js - if ( rvalidchars.test( data.replace( rvalidescape, "@" ) - .replace( rvalidtokens, "]" ) - .replace( rvalidbraces, "")) ) { - - return ( new Function( "return " + data ) )(); - } - } - } - - jQuery.error( "Invalid JSON: " + data ); - }, - - // Cross-browser xml parsing - parseXML: function( data ) { - var xml, tmp; - if ( !data || typeof data !== "string" ) { - return null; - } - try { - if ( window.DOMParser ) { // Standard - tmp = new DOMParser(); - xml = tmp.parseFromString( data , "text/xml" ); - } else { // IE - xml = new ActiveXObject( "Microsoft.XMLDOM" ); - xml.async = "false"; - xml.loadXML( data ); - } - } catch( e ) { - xml = undefined; - } - if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; - }, - - noop: function() {}, - - // Evaluates a script in a global context - // Workarounds based on findings by Jim Driscoll - // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context - globalEval: function( data ) { - if ( data && jQuery.trim( data ) ) { - // We use execScript on Internet Explorer - // We use an anonymous function so that context is window - // rather than jQuery in Firefox - ( window.execScript || function( data ) { - window[ "eval" ].call( window, data ); - } )( data ); - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - // args is for internal usage only - each: function( obj, callback, args ) { - var value, - i = 0, - length = obj.length, - isArray = isArraylike( obj ); - - if ( args ) { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } - } - - return obj; - }, - - // Use native String.trim function wherever possible - trim: core_trim && !core_trim.call("\uFEFF\xA0") ? - function( text ) { - return text == null ? - "" : - core_trim.call( text ); - } : - - // Otherwise use our own trimming functionality - function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArraylike( Object(arr) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - core_push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - var len; - - if ( arr ) { - if ( core_indexOf ) { - return core_indexOf.call( arr, elem, i ); - } - - len = arr.length; - i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; - - for ( ; i < len; i++ ) { - // Skip accessing in sparse arrays - if ( i in arr && arr[ i ] === elem ) { - return i; - } - } - } - - return -1; - }, - - merge: function( first, second ) { - var l = second.length, - i = first.length, - j = 0; - - if ( typeof l === "number" ) { - for ( ; j < l; j++ ) { - first[ i++ ] = second[ j ]; - } - } else { - while ( second[j] !== undefined ) { - first[ i++ ] = second[ j++ ]; - } - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, inv ) { - var retVal, - ret = [], - i = 0, - length = elems.length; - inv = !!inv; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - retVal = !!callback( elems[ i ], i ); - if ( inv !== retVal ) { - ret.push( elems[ i ] ); - } - } - - return ret; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var value, - i = 0, - length = elems.length, - isArray = isArraylike( elems ), - ret = []; - - // Go through the array, translating each of the items to their - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - } - - // Flatten any nested arrays - return core_concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var args, proxy, tmp; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = core_slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - // Multifunctional method to get and set values of a collection - // The value/s can optionally be executed if it's a function - access: function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - length = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < length; i++ ) { - fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); - } - } - } - - return chainable ? - elems : - - // Gets - bulk ? - fn.call( elems ) : - length ? fn( elems[0], key ) : emptyGet; - }, - - now: function() { - return ( new Date() ).getTime(); - }, - - // A method for quickly swapping in/out CSS properties to get correct calculations. - // Note: this method belongs to the css module but it's needed here for the support module. - // If support gets modularized, this method should be moved back to the css module. - swap: function( elem, options, callback, args ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.apply( elem, args || [] ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; - } -}); - -jQuery.ready.promise = function( obj ) { - if ( !readyList ) { - - readyList = jQuery.Deferred(); - - // Catch cases where $(document).ready() is called after the browser event has already occurred. - // we once tried to use readyState "interactive" here, but it caused issues like the one - // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - setTimeout( jQuery.ready ); - - // Standards-based browsers support DOMContentLoaded - } else if ( document.addEventListener ) { - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed, false ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed, false ); - - // If IE event model is used - } else { - // Ensure firing before onload, maybe late but safe also for iframes - document.attachEvent( "onreadystatechange", completed ); - - // A fallback to window.onload, that will always work - window.attachEvent( "onload", completed ); - - // If IE and not a frame - // continually check to see if the document is ready - var top = false; - - try { - top = window.frameElement == null && document.documentElement; - } catch(e) {} - - if ( top && top.doScroll ) { - (function doScrollCheck() { - if ( !jQuery.isReady ) { - - try { - // Use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - top.doScroll("left"); - } catch(e) { - return setTimeout( doScrollCheck, 50 ); - } - - // detach all dom ready events - detach(); - - // and execute any waiting functions - jQuery.ready(); - } - })(); - } - } - } - return readyList.promise( obj ); -}; - -// Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); - -function isArraylike( obj ) { - var length = obj.length, - type = jQuery.type( obj ); - - if ( jQuery.isWindow( obj ) ) { - return false; - } - - if ( obj.nodeType === 1 && length ) { - return true; - } - - return type === "array" || type !== "function" && - ( length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj ); -} - -// All jQuery objects should point back to these -rootjQuery = jQuery(document); -/*! - * Sizzle CSS Selector Engine v1.10.2 - * http://sizzlejs.com/ - * - * Copyright 2013 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2013-07-03 - */ -(function( window, undefined ) { - -var i, - support, - cachedruns, - Expr, - getText, - isXML, - compile, - outermostContext, - sortInput, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + -(new Date()), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - hasDuplicate = false, - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - return 0; - } - return 0; - }, - - // General-purpose constants - strundefined = typeof undefined, - MAX_NEGATIVE = 1 << 31, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf if we can't use a native one - indexOf = arr.indexOf || function( elem ) { - var i = 0, - len = this.length; - for ( ; i < len; i++ ) { - if ( this[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - // http://www.w3.org/TR/css3-syntax/#characters - characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", - - // Loosely modeled on CSS identifier characters - // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors - // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = characterEncoding.replace( "w", "w#" ), - - // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + - "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]", - - // Prefer arguments quoted, - // then not containing pseudos/brackets, - // then attribute selectors/non-parenthetical expressions, - // then anything else - // These preferences are here to reduce the number of selectors - // needing tokenize in the PSEUDO preFilter - pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rsibling = new RegExp( whitespace + "*[+~]" ), - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + characterEncoding + ")" ), - "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), - "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rescape = /'|\\/g, - - // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - // BMP codepoint - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }; - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var match, elem, m, nodeType, - // QSA vars - i, groups, old, nid, newContext, newSelector; - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - - context = context || document; - results = results || []; - - if ( !selector || typeof selector !== "string" ) { - return results; - } - - if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { - return []; - } - - if ( documentIsHTML && !seed ) { - - // Shortcuts - if ( (match = rquickExpr.exec( selector )) ) { - // Speed-up: Sizzle("#ID") - if ( (m = match[1]) ) { - if ( nodeType === 9 ) { - elem = context.getElementById( m ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE, Opera, and Webkit return items - // by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - } else { - // Context is not a document - if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && - contains( context, elem ) && elem.id === m ) { - results.push( elem ); - return results; - } - } - - // Speed-up: Sizzle("TAG") - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Speed-up: Sizzle(".CLASS") - } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // QSA path - if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - nid = old = expando; - newContext = context; - newSelector = nodeType === 9 && selector; - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - groups = tokenize( selector ); - - if ( (old = context.getAttribute("id")) ) { - nid = old.replace( rescape, "\\$&" ); - } else { - context.setAttribute( "id", nid ); - } - nid = "[id='" + nid + "'] "; - - i = groups.length; - while ( i-- ) { - groups[i] = nid + toSelector( groups[i] ); - } - newContext = rsibling.test( selector ) && context.parentNode || context; - newSelector = groups.join(","); - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch(qsaError) { - } finally { - if ( !old ) { - context.removeAttribute("id"); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {Function(string, Object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key += " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created div and expects a boolean result - */ -function assert( fn ) { - var div = document.createElement("div"); - - try { - return !!fn( div ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( div.parentNode ) { - div.parentNode.removeChild( div ); - } - // release memory in IE - div = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = attrs.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - ( ~b.sourceIndex || MAX_NEGATIVE ) - - ( ~a.sourceIndex || MAX_NEGATIVE ); - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Detect xml - * @param {Element|Object} elem An element or a document - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var doc = node ? node.ownerDocument || node : preferredDoc, - parent = doc.defaultView; - - // If no document and documentElement is available, return - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Set our document - document = doc; - docElem = doc.documentElement; - - // Support tests - documentIsHTML = !isXML( doc ); - - // Support: IE>8 - // If iframe document is assigned to "document" variable and if iframe has been reloaded, - // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 - // IE6-8 do not support the defaultView property so parent will be undefined - if ( parent && parent.attachEvent && parent !== parent.top ) { - parent.attachEvent( "onbeforeunload", function() { - setDocument(); - }); - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) - support.attributes = assert(function( div ) { - div.className = "i"; - return !div.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( div ) { - div.appendChild( doc.createComment("") ); - return !div.getElementsByTagName("*").length; - }); - - // Check if getElementsByClassName can be trusted - support.getElementsByClassName = assert(function( div ) { - div.innerHTML = "
"; - - // Support: Safari<4 - // Catch class over-caching - div.firstChild.className = "i"; - // Support: Opera<10 - // Catch gEBCN failure to find non-leading classes - return div.getElementsByClassName("i").length === 2; - }); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( div ) { - docElem.appendChild( div ).id = expando; - return !doc.getElementsByName || !doc.getElementsByName( expando ).length; - }); - - // ID find and filter - if ( support.getById ) { - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== strundefined && documentIsHTML ) { - var m = context.getElementById( id ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; - } - }; - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - } else { - // Support: IE6/7 - // getElementById is not reliable as a find shortcut - delete Expr.find["ID"]; - - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== strundefined ) { - return context.getElementsByTagName( tag ); - } - } : - function( tag, context ) { - var elem, - tmp = [], - i = 0, - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See http://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( div ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // http://bugs.jquery.com/ticket/12359 - div.innerHTML = ""; - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !div.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - }); - - assert(function( div ) { - - // Support: Opera 10-12/IE8 - // ^= $= *= and empty values - // Should not select anything - // Support: Windows 8 Native Apps - // The type attribute is restricted during .innerHTML assignment - var input = doc.createElement("input"); - input.setAttribute( "type", "hidden" ); - div.appendChild( input ).setAttribute( "t", "" ); - - if ( div.querySelectorAll("[t^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":enabled").length ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - div.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( div ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( div, "div" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( div, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - - // Element contains another - // Purposefully does not implement inclusive descendent - // As in, an element does not contain itself - contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = docElem.compareDocumentPosition ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b ); - - if ( compare ) { - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === doc || contains(preferredDoc, a) ) { - return -1; - } - if ( b === doc || contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } - - // Not directly comparable, sort on existence of method - return a.compareDocumentPosition ? -1 : 1; - } : - function( a, b ) { - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - - // Parentless nodes are either documents or disconnected - } else if ( !aup || !bup ) { - return a === doc ? -1 : - b === doc ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return doc; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch(e) {} - } - - return Sizzle( expr, document, null, [elem] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val === undefined ? - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null : - val; -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - for ( ; (node = elem[i]); i++ ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (see #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[5] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] && match[4] !== undefined ) { - match[2] = match[4]; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, outerCache, node, diff, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - // Seek `elem` from a previously-cached index - outerCache = parent[ expando ] || (parent[ expando ] = {}); - cache = outerCache[ type ] || []; - nodeIndex = cache[0] === dirruns && cache[1]; - diff = cache[0] === dirruns && cache[2]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - outerCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - // Use previously-cached element index if available - } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { - diff = cache[1]; - - // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) - } else { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { - // Cache the index of each encountered element - if ( useCache ) { - (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf.call( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": function( elem ) { - return elem.disabled === false; - }, - - "disabled": function( elem ) { - return elem.disabled === true; - }, - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)), - // not comment, processing instructions, or others - // Thanks to Diego Perini for the nodeName shortcut - // Greater than "@" means alpha characters (specifically not starting with "#" or "?") - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) - // use getAttribute instead to test this case - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -function tokenize( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( tokens = [] ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -} - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - checkNonElements = base && dir === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var data, cache, outerCache, - dirkey = dirruns + " " + doneName; - - // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) { - if ( (data = cache[1]) === true || data === cachedruns ) { - return data === true; - } - } else { - cache = outerCache[ dir ] = [ dirkey ]; - cache[1] = matcher( elem, context, xml ) || cachedruns; - if ( cache[1] === true ) { - return true; - } - } - } - } - } - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf.call( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - // A counter to specify which element is currently being matched - var matcherCachedRuns = 0, - bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, expandContext ) { - var elem, j, matcher, - setMatched = [], - matchedCount = 0, - i = "0", - unmatched = seed && [], - outermost = expandContext != null, - contextBackup = outermostContext, - // We must always have either seed elements or context - elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1); - - if ( outermost ) { - outermostContext = context !== document && context; - cachedruns = matcherCachedRuns; - } - - // Add elements passing elementMatchers directly to results - // Keep `i` a string if there are no elements so `matchedCount` will be "00" below - for ( ; (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - cachedruns = ++matcherCachedRuns; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // Apply set filters to unmatched elements - matchedCount += i; - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !group ) { - group = tokenize( selector ); - } - i = group.length; - while ( i-- ) { - cached = matcherFromTokens( group[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - } - return cached; -}; - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function select( selector, context, results, seed ) { - var i, tokens, token, type, find, - match = tokenize( selector ); - - if ( !seed ) { - // Try to minimize operations if there is only one group - if ( match.length === 1 ) { - - // Take a shortcut and set the context if the root selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - support.getById && context.nodeType === 9 && documentIsHTML && - Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - } - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && context.parentNode || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - } - - // Compile and execute a filtering function - // Provide `match` to avoid retokenization if we modified the selector above - compile( selector, match )( - seed, - context, - !documentIsHTML, - results, - rsibling.test( selector ) - ); - return results; -} - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome<14 -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( div1 ) { - // Should return 1, but returns 4 (following) - return div1.compareDocumentPosition( document.createElement("div") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( div ) { - div.innerHTML = ""; - return div.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( div ) { - div.innerHTML = ""; - div.firstChild.setAttribute( "value", "" ); - return div.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( div ) { - return div.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - elem[ name ] === true ? name.toLowerCase() : null; - } - }); -} - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.pseudos; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - -})( window ); -// String to Object options format cache -var optionsCache = {}; - -// Convert String-formatted options into Object-formatted ones and store in cache -function createOptions( options ) { - var object = optionsCache[ options ] = {}; - jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) { - object[ flag ] = true; - }); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - ( optionsCache[ options ] || createOptions( options ) ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - // Last fire value (for non-forgettable lists) - memory, - // Flag to know if list was already fired - fired, - // End of the loop when firing - firingLength, - // Index of currently firing callback (modified by remove if needed) - firingIndex, - // First callback to fire (used internally by add and fireWith) - firingStart, - // Actual callback list - list = [], - // Stack of fire calls for repeatable lists - stack = !options.once && [], - // Fire callbacks - fire = function( data ) { - memory = options.memory && data; - fired = true; - firingIndex = firingStart || 0; - firingStart = 0; - firingLength = list.length; - firing = true; - for ( ; list && firingIndex < firingLength; firingIndex++ ) { - if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { - memory = false; // To prevent further calls using add - break; - } - } - firing = false; - if ( list ) { - if ( stack ) { - if ( stack.length ) { - fire( stack.shift() ); - } - } else if ( memory ) { - list = []; - } else { - self.disable(); - } - } - }, - // Actual Callbacks object - self = { - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - // First, we save the current length - var start = list.length; - (function add( args ) { - jQuery.each( args, function( _, arg ) { - var type = jQuery.type( arg ); - if ( type === "function" ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && type !== "string" ) { - // Inspect recursively - add( arg ); - } - }); - })( arguments ); - // Do we need to add the callbacks to the - // current firing batch? - if ( firing ) { - firingLength = list.length; - // With memory, if we're not firing then - // we should call right away - } else if ( memory ) { - firingStart = start; - fire( memory ); - } - } - return this; - }, - // Remove a callback from the list - remove: function() { - if ( list ) { - jQuery.each( arguments, function( _, arg ) { - var index; - while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - // Handle firing indexes - if ( firing ) { - if ( index <= firingLength ) { - firingLength--; - } - if ( index <= firingIndex ) { - firingIndex--; - } - } - } - }); - } - return this; - }, - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); - }, - // Remove all callbacks from the list - empty: function() { - list = []; - firingLength = 0; - return this; - }, - // Have the list do nothing anymore - disable: function() { - list = stack = memory = undefined; - return this; - }, - // Is it disabled? - disabled: function() { - return !list; - }, - // Lock the list in its current state - lock: function() { - stack = undefined; - if ( !memory ) { - self.disable(); - } - return this; - }, - // Is it locked? - locked: function() { - return !stack; - }, - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( list && ( !fired || stack ) ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - if ( firing ) { - stack.push( args ); - } else { - fire( args ); - } - } - return this; - }, - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; -jQuery.extend({ - - Deferred: function( func ) { - var tuples = [ - // action, add listener, listener list, final state - [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], - [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], - [ "notify", "progress", jQuery.Callbacks("memory") ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - then: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - return jQuery.Deferred(function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - var action = tuple[ 0 ], - fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; - // deferred[ done | fail | progress ] for forwarding actions to newDefer - deferred[ tuple[1] ](function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .done( newDefer.resolve ) - .fail( newDefer.reject ) - .progress( newDefer.notify ); - } else { - newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); - } - }); - }); - fns = null; - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Keep pipe for back-compat - promise.pipe = promise.then; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 3 ]; - - // promise[ done | fail | progress ] = list.add - promise[ tuple[1] ] = list.add; - - // Handle state - if ( stateString ) { - list.add(function() { - // state = [ resolved | rejected ] - state = stateString; - - // [ reject_list | resolve_list ].disable; progress_list.lock - }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); - } - - // deferred[ resolve | reject | notify ] - deferred[ tuple[0] ] = function() { - deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); - return this; - }; - deferred[ tuple[0] + "With" ] = list.fireWith; - }); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( subordinate /* , ..., subordinateN */ ) { - var i = 0, - resolveValues = core_slice.call( arguments ), - length = resolveValues.length, - - // the count of uncompleted subordinates - remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, - - // the master Deferred. If resolveValues consist of only a single Deferred, just use that. - deferred = remaining === 1 ? subordinate : jQuery.Deferred(), - - // Update function for both resolve and progress values - updateFunc = function( i, contexts, values ) { - return function( value ) { - contexts[ i ] = this; - values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value; - if( values === progressValues ) { - deferred.notifyWith( contexts, values ); - } else if ( !( --remaining ) ) { - deferred.resolveWith( contexts, values ); - } - }; - }, - - progressValues, progressContexts, resolveContexts; - - // add listeners to Deferred subordinates; treat others as resolved - if ( length > 1 ) { - progressValues = new Array( length ); - progressContexts = new Array( length ); - resolveContexts = new Array( length ); - for ( ; i < length; i++ ) { - if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { - resolveValues[ i ].promise() - .done( updateFunc( i, resolveContexts, resolveValues ) ) - .fail( deferred.reject ) - .progress( updateFunc( i, progressContexts, progressValues ) ); - } else { - --remaining; - } - } - } - - // if we're not waiting on anything, resolve the master - if ( !remaining ) { - deferred.resolveWith( resolveContexts, resolveValues ); - } - - return deferred.promise(); - } -}); -jQuery.support = (function( support ) { - - var all, a, input, select, fragment, opt, eventName, isSupported, i, - div = document.createElement("div"); - - // Setup - div.setAttribute( "className", "t" ); - div.innerHTML = "
a"; - - // Finish early in limited (non-browser) environments - all = div.getElementsByTagName("*") || []; - a = div.getElementsByTagName("a")[ 0 ]; - if ( !a || !a.style || !all.length ) { - return support; - } - - // First batch of tests - select = document.createElement("select"); - opt = select.appendChild( document.createElement("option") ); - input = div.getElementsByTagName("input")[ 0 ]; - - a.style.cssText = "top:1px;float:left;opacity:.5"; - - // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) - support.getSetAttribute = div.className !== "t"; - - // IE strips leading whitespace when .innerHTML is used - support.leadingWhitespace = div.firstChild.nodeType === 3; - - // Make sure that tbody elements aren't automatically inserted - // IE will insert them into empty tables - support.tbody = !div.getElementsByTagName("tbody").length; - - // Make sure that link elements get serialized correctly by innerHTML - // This requires a wrapper element in IE - support.htmlSerialize = !!div.getElementsByTagName("link").length; - - // Get the style information from getAttribute - // (IE uses .cssText instead) - support.style = /top/.test( a.getAttribute("style") ); - - // Make sure that URLs aren't manipulated - // (IE normalizes it by default) - support.hrefNormalized = a.getAttribute("href") === "/a"; - - // Make sure that element opacity exists - // (IE uses filter instead) - // Use a regex to work around a WebKit issue. See #5145 - support.opacity = /^0.5/.test( a.style.opacity ); - - // Verify style float existence - // (IE uses styleFloat instead of cssFloat) - support.cssFloat = !!a.style.cssFloat; - - // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere) - support.checkOn = !!input.value; - - // Make sure that a selected-by-default option has a working selected property. - // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) - support.optSelected = opt.selected; - - // Tests for enctype support on a form (#6743) - support.enctype = !!document.createElement("form").enctype; - - // Makes sure cloning an html5 element does not cause problems - // Where outerHTML is undefined, this still works - support.html5Clone = document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>"; - - // Will be defined later - support.inlineBlockNeedsLayout = false; - support.shrinkWrapBlocks = false; - support.pixelPosition = false; - support.deleteExpando = true; - support.noCloneEvent = true; - support.reliableMarginRight = true; - support.boxSizingReliable = true; - - // Make sure checked status is properly cloned - input.checked = true; - support.noCloneChecked = input.cloneNode( true ).checked; - - // Make sure that the options inside disabled selects aren't marked as disabled - // (WebKit marks them as disabled) - select.disabled = true; - support.optDisabled = !opt.disabled; - - // Support: IE<9 - try { - delete div.test; - } catch( e ) { - support.deleteExpando = false; - } - - // Check if we can trust getAttribute("value") - input = document.createElement("input"); - input.setAttribute( "value", "" ); - support.input = input.getAttribute( "value" ) === ""; - - // Check if an input maintains its value after becoming a radio - input.value = "t"; - input.setAttribute( "type", "radio" ); - support.radioValue = input.value === "t"; - - // #11217 - WebKit loses check when the name is after the checked attribute - input.setAttribute( "checked", "t" ); - input.setAttribute( "name", "t" ); - - fragment = document.createDocumentFragment(); - fragment.appendChild( input ); - - // Check if a disconnected checkbox will retain its checked - // value of true after appended to the DOM (IE6/7) - support.appendChecked = input.checked; - - // WebKit doesn't clone checked state correctly in fragments - support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE<9 - // Opera does not clone events (and typeof div.attachEvent === undefined). - // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() - if ( div.attachEvent ) { - div.attachEvent( "onclick", function() { - support.noCloneEvent = false; - }); - - div.cloneNode( true ).click(); - } - - // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event) - // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) - for ( i in { submit: true, change: true, focusin: true }) { - div.setAttribute( eventName = "on" + i, "t" ); - - support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false; - } - - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - // Support: IE<9 - // Iteration over object's inherited properties before its own. - for ( i in jQuery( support ) ) { - break; - } - support.ownLast = i !== "0"; - - // Run tests that need a body at doc ready - jQuery(function() { - var container, marginDiv, tds, - divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;", - body = document.getElementsByTagName("body")[0]; - - if ( !body ) { - // Return for frameset docs that don't have a body - return; - } - - container = document.createElement("div"); - container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px"; - - body.appendChild( container ).appendChild( div ); - - // Support: IE8 - // Check if table cells still have offsetWidth/Height when they are set - // to display:none and there are still other visible table cells in a - // table row; if so, offsetWidth/Height are not reliable for use when - // determining if an element has been hidden directly using - // display:none (it is still safe to use offsets if a parent element is - // hidden; don safety goggles and see bug #4512 for more information). - div.innerHTML = "
t
"; - tds = div.getElementsByTagName("td"); - tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none"; - isSupported = ( tds[ 0 ].offsetHeight === 0 ); - - tds[ 0 ].style.display = ""; - tds[ 1 ].style.display = "none"; - - // Support: IE8 - // Check if empty table cells still have offsetWidth/Height - support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); - - // Check box-sizing and margin behavior. - div.innerHTML = ""; - div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;"; - - // Workaround failing boxSizing test due to offsetWidth returning wrong value - // with some non-1 values of body zoom, ticket #13543 - jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() { - support.boxSizing = div.offsetWidth === 4; - }); - - // Use window.getComputedStyle because jsdom on node.js will break without it. - if ( window.getComputedStyle ) { - support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%"; - support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px"; - - // Check if div with explicit width and no margin-right incorrectly - // gets computed margin-right based on width of container. (#3333) - // Fails in WebKit before Feb 2011 nightlies - // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right - marginDiv = div.appendChild( document.createElement("div") ); - marginDiv.style.cssText = div.style.cssText = divReset; - marginDiv.style.marginRight = marginDiv.style.width = "0"; - div.style.width = "1px"; - - support.reliableMarginRight = - !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight ); - } - - if ( typeof div.style.zoom !== core_strundefined ) { - // Support: IE<8 - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' and giving - // them layout - div.innerHTML = ""; - div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1"; - support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); - - // Support: IE6 - // Check if elements with layout shrink-wrap their children - div.style.display = "block"; - div.innerHTML = "
"; - div.firstChild.style.width = "5px"; - support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); - - if ( support.inlineBlockNeedsLayout ) { - // Prevent IE 6 from affecting layout for positioned elements #11048 - // Prevent IE from shrinking the body in IE 7 mode #12869 - // Support: IE<8 - body.style.zoom = 1; - } - } - - body.removeChild( container ); - - // Null elements to avoid leaks in IE - container = div = tds = marginDiv = null; - }); - - // Null elements to avoid leaks in IE - all = select = fragment = opt = a = input = null; - - return support; -})({}); - -var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, - rmultiDash = /([A-Z])/g; - -function internalData( elem, name, data, pvt /* Internal Use Only */ ){ - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var ret, thisCache, - internalKey = jQuery.expando, - - // We have to handle DOM nodes and JS objects differently because IE6-7 - // can't GC object references properly across the DOM-JS boundary - isNode = elem.nodeType, - - // Only DOM nodes need the global jQuery cache; JS object data is - // attached directly to the object so GC can occur automatically - cache = isNode ? jQuery.cache : elem, - - // Only defining an ID for JS objects if its cache already exists allows - // the code to shortcut on the same path as a DOM node with no cache - id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; - - // Avoid doing any more work than we need to when trying to get data on an - // object that has no data at all - if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) { - return; - } - - if ( !id ) { - // Only DOM nodes need a new unique ID for each element since their data - // ends up in the global cache - if ( isNode ) { - id = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++; - } else { - id = internalKey; - } - } - - if ( !cache[ id ] ) { - // Avoid exposing jQuery metadata on plain JS objects when the object - // is serialized using JSON.stringify - cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; - } - - // An object can be passed to jQuery.data instead of a key/value pair; this gets - // shallow copied over onto the existing cache - if ( typeof name === "object" || typeof name === "function" ) { - if ( pvt ) { - cache[ id ] = jQuery.extend( cache[ id ], name ); - } else { - cache[ id ].data = jQuery.extend( cache[ id ].data, name ); - } - } - - thisCache = cache[ id ]; - - // jQuery data() is stored in a separate object inside the object's internal data - // cache in order to avoid key collisions between internal data and user-defined - // data. - if ( !pvt ) { - if ( !thisCache.data ) { - thisCache.data = {}; - } - - thisCache = thisCache.data; - } - - if ( data !== undefined ) { - thisCache[ jQuery.camelCase( name ) ] = data; - } - - // Check for both converted-to-camel and non-converted data property names - // If a data property was specified - if ( typeof name === "string" ) { - - // First Try to find as-is property data - ret = thisCache[ name ]; - - // Test for null|undefined property data - if ( ret == null ) { - - // Try to find the camelCased property - ret = thisCache[ jQuery.camelCase( name ) ]; - } - } else { - ret = thisCache; - } - - return ret; -} - -function internalRemoveData( elem, name, pvt ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var thisCache, i, - isNode = elem.nodeType, - - // See jQuery.data for more information - cache = isNode ? jQuery.cache : elem, - id = isNode ? elem[ jQuery.expando ] : jQuery.expando; - - // If there is already no cache entry for this object, there is no - // purpose in continuing - if ( !cache[ id ] ) { - return; - } - - if ( name ) { - - thisCache = pvt ? cache[ id ] : cache[ id ].data; - - if ( thisCache ) { - - // Support array or space separated string names for data keys - if ( !jQuery.isArray( name ) ) { - - // try the string as a key before any manipulation - if ( name in thisCache ) { - name = [ name ]; - } else { - - // split the camel cased version by spaces unless a key with the spaces exists - name = jQuery.camelCase( name ); - if ( name in thisCache ) { - name = [ name ]; - } else { - name = name.split(" "); - } - } - } else { - // If "name" is an array of keys... - // When data is initially created, via ("key", "val") signature, - // keys will be converted to camelCase. - // Since there is no way to tell _how_ a key was added, remove - // both plain key and camelCase key. #12786 - // This will only penalize the array argument path. - name = name.concat( jQuery.map( name, jQuery.camelCase ) ); - } - - i = name.length; - while ( i-- ) { - delete thisCache[ name[i] ]; - } - - // If there is no data left in the cache, we want to continue - // and let the cache object itself get destroyed - if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) { - return; - } - } - } - - // See jQuery.data for more information - if ( !pvt ) { - delete cache[ id ].data; - - // Don't destroy the parent cache unless the internal data object - // had been the only thing left in it - if ( !isEmptyDataObject( cache[ id ] ) ) { - return; - } - } - - // Destroy the cache - if ( isNode ) { - jQuery.cleanData( [ elem ], true ); - - // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) - /* jshint eqeqeq: false */ - } else if ( jQuery.support.deleteExpando || cache != cache.window ) { - /* jshint eqeqeq: true */ - delete cache[ id ]; - - // When all else fails, null - } else { - cache[ id ] = null; - } -} - -jQuery.extend({ - cache: {}, - - // The following elements throw uncatchable exceptions if you - // attempt to add expando properties to them. - noData: { - "applet": true, - "embed": true, - // Ban all objects except for Flash (which handle expandos) - "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" - }, - - hasData: function( elem ) { - elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; - return !!elem && !isEmptyDataObject( elem ); - }, - - data: function( elem, name, data ) { - return internalData( elem, name, data ); - }, - - removeData: function( elem, name ) { - return internalRemoveData( elem, name ); - }, - - // For internal use only. - _data: function( elem, name, data ) { - return internalData( elem, name, data, true ); - }, - - _removeData: function( elem, name ) { - return internalRemoveData( elem, name, true ); - }, - - // A method for determining if a DOM node can handle the data expando - acceptData: function( elem ) { - // Do not set data on non-element because it will not be cleared (#8335). - if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) { - return false; - } - - var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ]; - - // nodes accept data unless otherwise specified; rejection can be conditional - return !noData || noData !== true && elem.getAttribute("classid") === noData; - } -}); - -jQuery.fn.extend({ - data: function( key, value ) { - var attrs, name, - data = null, - i = 0, - elem = this[0]; - - // Special expections of .data basically thwart jQuery.access, - // so implement the relevant behavior ourselves - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = jQuery.data( elem ); - - if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { - attrs = elem.attributes; - for ( ; i < attrs.length; i++ ) { - name = attrs[i].name; - - if ( name.indexOf("data-") === 0 ) { - name = jQuery.camelCase( name.slice(5) ); - - dataAttr( elem, name, data[ name ] ); - } - } - jQuery._data( elem, "parsedAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each(function() { - jQuery.data( this, key ); - }); - } - - return arguments.length > 1 ? - - // Sets one value - this.each(function() { - jQuery.data( this, key, value ); - }) : - - // Gets one value - // Try to fetch any internally stored data first - elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null; - }, - - removeData: function( key ) { - return this.each(function() { - jQuery.removeData( this, key ); - }); - } -}); - -function dataAttr( elem, key, data ) { - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - - var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); - - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - jQuery.data( elem, key, data ); - - } else { - data = undefined; - } - } - - return data; -} - -// checks a cache object for emptiness -function isEmptyDataObject( obj ) { - var name; - for ( name in obj ) { - - // if the public data object is empty, the private is still empty - if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { - continue; - } - if ( name !== "toJSON" ) { - return false; - } - } - - return true; -} -jQuery.extend({ - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = jQuery._data( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || jQuery.isArray(data) ) { - queue = jQuery._data( elem, type, jQuery.makeArray(data) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // not intended for public consumption - generates a queueHooks object, or returns the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return jQuery._data( elem, key ) || jQuery._data( elem, key, { - empty: jQuery.Callbacks("once memory").add(function() { - jQuery._removeData( elem, type + "queue" ); - jQuery._removeData( elem, key ); - }) - }); - } -}); - -jQuery.fn.extend({ - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[0], type ); - } - - return data === undefined ? - this : - this.each(function() { - var queue = jQuery.queue( this, type, data ); - - // ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - // Based off of the plugin by Clint Helfers, with permission. - // http://blindsignals.com/index.php/2009/07/jquery-delay/ - delay: function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = setTimeout( next, time ); - hooks.stop = function() { - clearTimeout( timeout ); - }; - }); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while( i-- ) { - tmp = jQuery._data( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -}); -var nodeHook, boolHook, - rclass = /[\t\r\n\f]/g, - rreturn = /\r/g, - rfocusable = /^(?:input|select|textarea|button|object)$/i, - rclickable = /^(?:a|area)$/i, - ruseDefault = /^(?:checked|selected)$/i, - getSetAttribute = jQuery.support.getSetAttribute, - getSetInput = jQuery.support.input; - -jQuery.fn.extend({ - attr: function( name, value ) { - return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each(function() { - jQuery.removeAttr( this, name ); - }); - }, - - prop: function( name, value ) { - return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - name = jQuery.propFix[ name ] || name; - return this.each(function() { - // try/catch handles cases where IE balks (such as removing a property on window) - try { - this[ name ] = undefined; - delete this[ name ]; - } catch( e ) {} - }); - }, - - addClass: function( value ) { - var classes, elem, cur, clazz, j, - i = 0, - len = this.length, - proceed = typeof value === "string" && value; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).addClass( value.call( this, j, this.className ) ); - }); - } - - if ( proceed ) { - // The disjunction here is for better compressibility (see removeClass) - classes = ( value || "" ).match( core_rnotwhite ) || []; - - for ( ; i < len; i++ ) { - elem = this[ i ]; - cur = elem.nodeType === 1 && ( elem.className ? - ( " " + elem.className + " " ).replace( rclass, " " ) : - " " - ); - - if ( cur ) { - j = 0; - while ( (clazz = classes[j++]) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - elem.className = jQuery.trim( cur ); - - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, clazz, j, - i = 0, - len = this.length, - proceed = arguments.length === 0 || typeof value === "string" && value; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).removeClass( value.call( this, j, this.className ) ); - }); - } - if ( proceed ) { - classes = ( value || "" ).match( core_rnotwhite ) || []; - - for ( ; i < len; i++ ) { - elem = this[ i ]; - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( elem.className ? - ( " " + elem.className + " " ).replace( rclass, " " ) : - "" - ); - - if ( cur ) { - j = 0; - while ( (clazz = classes[j++]) ) { - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) >= 0 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - elem.className = value ? jQuery.trim( cur ) : ""; - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value; - - if ( typeof stateVal === "boolean" && type === "string" ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( jQuery.isFunction( value ) ) { - return this.each(function( i ) { - jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); - }); - } - - return this.each(function() { - if ( type === "string" ) { - // toggle individual class names - var className, - i = 0, - self = jQuery( this ), - classNames = value.match( core_rnotwhite ) || []; - - while ( (className = classNames[ i++ ]) ) { - // check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( type === core_strundefined || type === "boolean" ) { - if ( this.className ) { - // store className if set - jQuery._data( this, "__className__", this.className ); - } - - // If the element has a class name or if we're passed "false", - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; - } - }); - }, - - hasClass: function( selector ) { - var className = " " + selector + " ", - i = 0, - l = this.length; - for ( ; i < l; i++ ) { - if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) { - return true; - } - } - - return false; - }, - - val: function( value ) { - var ret, hooks, isFunction, - elem = this[0]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { - return ret; - } - - ret = elem.value; - - return typeof ret === "string" ? - // handle most common string cases - ret.replace(rreturn, "") : - // handle cases where value is null/undef or number - ret == null ? "" : ret; - } - - return; - } - - isFunction = jQuery.isFunction( value ); - - return this.each(function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - } else if ( typeof val === "number" ) { - val += ""; - } else if ( jQuery.isArray( val ) ) { - val = jQuery.map(val, function ( value ) { - return value == null ? "" : value + ""; - }); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - }); - } -}); - -jQuery.extend({ - valHooks: { - option: { - get: function( elem ) { - // Use proper attribute retrieval(#6932, #12072) - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - elem.text; - } - }, - select: { - get: function( elem ) { - var value, option, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one" || index < 0, - values = one ? null : [], - max = one ? index + 1 : options.length, - i = index < 0 ? - max : - one ? index : 0; - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // oldIE doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - // Don't return options that are disabled or in a disabled optgroup - ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) && - ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) { - optionSet = true; - } - } - - // force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - }, - - attr: function( elem, name, value ) { - var hooks, ret, - nType = elem.nodeType; - - // don't get/set attributes on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === core_strundefined ) { - return jQuery.prop( elem, name, value ); - } - - // All attributes are lowercase - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - name = name.toLowerCase(); - hooks = jQuery.attrHooks[ name ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook ); - } - - if ( value !== undefined ) { - - if ( value === null ) { - jQuery.removeAttr( elem, name ); - - } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - elem.setAttribute( name, value + "" ); - return value; - } - - } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? - undefined : - ret; - } - }, - - removeAttr: function( elem, value ) { - var name, propName, - i = 0, - attrNames = value && value.match( core_rnotwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( (name = attrNames[i++]) ) { - propName = jQuery.propFix[ name ] || name; - - // Boolean attributes get special treatment (#10870) - if ( jQuery.expr.match.bool.test( name ) ) { - // Set corresponding property to false - if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { - elem[ propName ] = false; - // Support: IE<9 - // Also clear defaultChecked/defaultSelected (if appropriate) - } else { - elem[ jQuery.camelCase( "default-" + name ) ] = - elem[ propName ] = false; - } - - // See #9699 for explanation of this approach (setting first, then removal) - } else { - jQuery.attr( elem, name, "" ); - } - - elem.removeAttribute( getSetAttribute ? name : propName ); - } - } - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { - // Setting the type on a radio button after the value resets the value in IE6-9 - // Reset value to default in case type is set after value during creation - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - }, - - prop: function( elem, name, value ) { - var ret, hooks, notxml, - nType = elem.nodeType; - - // don't get/set properties on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - if ( notxml ) { - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ? - ret : - ( elem[ name ] = value ); - - } else { - return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ? - ret : - elem[ name ]; - } - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set - // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - return tabindex ? - parseInt( tabindex, 10 ) : - rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? - 0 : - -1; - } - } - } -}); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { - // IE<8 needs the *property* name - elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name ); - - // Use defaultChecked and defaultSelected for oldIE - } else { - elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true; - } - - return name; - } -}; -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { - var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr; - - jQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ? - function( elem, name, isXML ) { - var fn = jQuery.expr.attrHandle[ name ], - ret = isXML ? - undefined : - /* jshint eqeqeq: false */ - (jQuery.expr.attrHandle[ name ] = undefined) != - getter( elem, name, isXML ) ? - - name.toLowerCase() : - null; - jQuery.expr.attrHandle[ name ] = fn; - return ret; - } : - function( elem, name, isXML ) { - return isXML ? - undefined : - elem[ jQuery.camelCase( "default-" + name ) ] ? - name.toLowerCase() : - null; - }; -}); - -// fix oldIE attroperties -if ( !getSetInput || !getSetAttribute ) { - jQuery.attrHooks.value = { - set: function( elem, value, name ) { - if ( jQuery.nodeName( elem, "input" ) ) { - // Does not return so that setAttribute is also used - elem.defaultValue = value; - } else { - // Use nodeHook if defined (#1954); otherwise setAttribute is fine - return nodeHook && nodeHook.set( elem, value, name ); - } - } - }; -} - -// IE6/7 do not support getting/setting some attributes with get/setAttribute -if ( !getSetAttribute ) { - - // Use this for any attribute in IE6/7 - // This fixes almost every IE6/7 issue - nodeHook = { - set: function( elem, value, name ) { - // Set the existing or create a new attribute node - var ret = elem.getAttributeNode( name ); - if ( !ret ) { - elem.setAttributeNode( - (ret = elem.ownerDocument.createAttribute( name )) - ); - } - - ret.value = value += ""; - - // Break association with cloned elements by also using setAttribute (#9646) - return name === "value" || value === elem.getAttribute( name ) ? - value : - undefined; - } - }; - jQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords = - // Some attributes are constructed with empty-string values when not defined - function( elem, name, isXML ) { - var ret; - return isXML ? - undefined : - (ret = elem.getAttributeNode( name )) && ret.value !== "" ? - ret.value : - null; - }; - jQuery.valHooks.button = { - get: function( elem, name ) { - var ret = elem.getAttributeNode( name ); - return ret && ret.specified ? - ret.value : - undefined; - }, - set: nodeHook.set - }; - - // Set contenteditable to false on removals(#10429) - // Setting to empty string throws an error as an invalid value - jQuery.attrHooks.contenteditable = { - set: function( elem, value, name ) { - nodeHook.set( elem, value === "" ? false : value, name ); - } - }; - - // Set width and height to auto instead of 0 on empty string( Bug #8150 ) - // This is for removals - jQuery.each([ "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = { - set: function( elem, value ) { - if ( value === "" ) { - elem.setAttribute( name, "auto" ); - return value; - } - } - }; - }); -} - - -// Some attributes require a special call on IE -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !jQuery.support.hrefNormalized ) { - // href/src property should get the full normalized URL (#10299/#12915) - jQuery.each([ "href", "src" ], function( i, name ) { - jQuery.propHooks[ name ] = { - get: function( elem ) { - return elem.getAttribute( name, 4 ); - } - }; - }); -} - -if ( !jQuery.support.style ) { - jQuery.attrHooks.style = { - get: function( elem ) { - // Return undefined in the case of empty string - // Note: IE uppercases css property names, but if we were to .toLowerCase() - // .cssText, that would destroy case senstitivity in URL's, like in "background" - return elem.style.cssText || undefined; - }, - set: function( elem, value ) { - return ( elem.style.cssText = value + "" ); - } - }; -} - -// Safari mis-reports the default selected property of an option -// Accessing the parent's selectedIndex property fixes it -if ( !jQuery.support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - var parent = elem.parentNode; - - if ( parent ) { - parent.selectedIndex; - - // Make sure that it also works with optgroups, see #5701 - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - return null; - } - }; -} - -jQuery.each([ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -}); - -// IE6/7 call enctype encoding -if ( !jQuery.support.enctype ) { - jQuery.propFix.enctype = "encoding"; -} - -// Radios and checkboxes getter/setter -jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( jQuery.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); - } - } - }; - if ( !jQuery.support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - // Support: Webkit - // "" is returned instead of "on" if a value isn't specified - return elem.getAttribute("value") === null ? "on" : elem.value; - }; - } -}); -var rformElems = /^(?:input|select|textarea)$/i, - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|contextmenu)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - var tmp, events, t, handleObjIn, - special, eventHandle, handleObj, - handlers, type, namespaces, origType, - elemData = jQuery._data( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !(events = elemData.events) ) { - events = elemData.events = {}; - } - if ( !(eventHandle = elemData.handle) ) { - eventHandle = elemData.handle = function( e ) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ? - jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : - undefined; - }; - // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events - eventHandle.elem = elem; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( core_rnotwhite ) || [""]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend({ - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join(".") - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !(handlers = events[ type ]) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener/attachEvent if the special events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - // Bind the global event handler to the element - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - - } else if ( elem.attachEvent ) { - elem.attachEvent( "on" + type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - var j, handleObj, tmp, - origCount, t, events, - special, handlers, type, - namespaces, origType, - elemData = jQuery.hasData( elem ) && jQuery._data( elem ); - - if ( !elemData || !(events = elemData.events) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( core_rnotwhite ) || [""]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - delete elemData.handle; - - // removeData also checks for emptiness and clears the expando if empty - // so use it instead of delete - jQuery._removeData( elem, "events" ); - } - }, - - trigger: function( event, data, elem, onlyHandlers ) { - var handle, ontype, cur, - bubbleType, special, tmp, i, - eventPath = [ elem || document ], - type = core_hasOwn.call( event, "type" ) ? event.type : event, - namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf(".") >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf(":") < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join("."); - event.namespace_re = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === (elem.ownerDocument || document) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) { - event.preventDefault(); - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && - jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Can't use an .isFunction() check here because IE6/7 fails that test. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - try { - elem[ type ](); - } catch ( e ) { - // IE<9 dies on focus/blur to hidden element (#1486,#12518) - // only reproducible on winXP IE8 native, not IE9 in IE8 mode - } - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - dispatch: function( event ) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event ); - - var i, ret, handleObj, matched, j, - handlerQueue = [], - args = core_slice.call( arguments ), - handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[0] = event; - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). - if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) - .apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( (event.result = ret) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var sel, handleObj, matches, i, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - // Black-hole SVG instance trees (#13180) - // Avoid non-left-click bubbling in Firefox (#3861) - if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { - - /* jshint eqeqeq: false */ - for ( ; cur != this; cur = cur.parentNode || this ) { - /* jshint eqeqeq: true */ - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) { - matches = []; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matches[ sel ] === undefined ) { - matches[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) >= 0 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matches[ sel ] ) { - matches.push( handleObj ); - } - } - if ( matches.length ) { - handlerQueue.push({ elem: cur, handlers: matches }); - } - } - } - } - - // Add the remaining (directly-bound) handlers - if ( delegateCount < handlers.length ) { - handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); - } - - return handlerQueue; - }, - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, copy, - type = event.type, - originalEvent = event, - fixHook = this.fixHooks[ type ]; - - if ( !fixHook ) { - this.fixHooks[ type ] = fixHook = - rmouseEvent.test( type ) ? this.mouseHooks : - rkeyEvent.test( type ) ? this.keyHooks : - {}; - } - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = new jQuery.Event( originalEvent ); - - i = copy.length; - while ( i-- ) { - prop = copy[ i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Support: IE<9 - // Fix target property (#1925) - if ( !event.target ) { - event.target = originalEvent.srcElement || document; - } - - // Support: Chrome 23+, Safari? - // Target should not be a text node (#504, #13143) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - // Support: IE<9 - // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) - event.metaKey = !!event.metaKey; - - return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), - - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split(" "), - filter: function( event, original ) { - - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), - filter: function( event, original ) { - var body, eventDoc, doc, - button = original.button, - fromElement = original.fromElement; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add relatedTarget, if necessary - if ( !event.relatedTarget && fromElement ) { - event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); - } - - return event; - } - }, - - special: { - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - try { - this.focus(); - return false; - } catch ( e ) { - // Support: IE<9 - // If we error on focus to hidden element (#1486, #12518), - // let .trigger() run the handlers - } - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return jQuery.nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Even when returnValue equals to undefined Firefox will still show alert - if ( event.result !== undefined ) { - event.originalEvent.returnValue = event.result; - } - } - } - }, - - simulate: function( type, elem, event, bubble ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true, - originalEvent: {} - } - ); - if ( bubble ) { - jQuery.event.trigger( e, null, elem ); - } else { - jQuery.event.dispatch.call( elem, e ); - } - if ( e.isDefaultPrevented() ) { - event.preventDefault(); - } - } -}; - -jQuery.removeEvent = document.removeEventListener ? - function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } - } : - function( elem, type, handle ) { - var name = "on" + type; - - if ( elem.detachEvent ) { - - // #8545, #7054, preventing memory leaks for custom events in IE6-8 - // detachEvent needed property on element, by name of that event, to properly expose it to GC - if ( typeof elem[ name ] === core_strundefined ) { - elem[ name ] = null; - } - - elem.detachEvent( name, handle ); - } - }; - -jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !(this instanceof jQuery.Event) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || - src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - if ( !e ) { - return; - } - - // If preventDefault exists, run it on the original event - if ( e.preventDefault ) { - e.preventDefault(); - - // Support: IE - // Otherwise set the returnValue property of the original event to false - } else { - e.returnValue = false; - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - if ( !e ) { - return; - } - // If stopPropagation exists, run it on the original event - if ( e.stopPropagation ) { - e.stopPropagation(); - } - - // Support: IE - // Set the cancelBubble property of the original event to true - e.cancelBubble = true; - }, - stopImmediatePropagation: function() { - this.isImmediatePropagationStopped = returnTrue; - this.stopPropagation(); - } -}; - -// Create mouseenter/leave events using mouseover/out and event-time checks -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || (related !== target && !jQuery.contains( target, related )) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -}); - -// IE submit delegation -if ( !jQuery.support.submitBubbles ) { - - jQuery.event.special.submit = { - setup: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Lazy-add a submit handler when a descendant form may potentially be submitted - jQuery.event.add( this, "click._submit keypress._submit", function( e ) { - // Node name check avoids a VML-related crash in IE (#9807) - var elem = e.target, - form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; - if ( form && !jQuery._data( form, "submitBubbles" ) ) { - jQuery.event.add( form, "submit._submit", function( event ) { - event._submit_bubble = true; - }); - jQuery._data( form, "submitBubbles", true ); - } - }); - // return undefined since we don't need an event listener - }, - - postDispatch: function( event ) { - // If form was submitted by the user, bubble the event up the tree - if ( event._submit_bubble ) { - delete event._submit_bubble; - if ( this.parentNode && !event.isTrigger ) { - jQuery.event.simulate( "submit", this.parentNode, event, true ); - } - } - }, - - teardown: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Remove delegated handlers; cleanData eventually reaps submit handlers attached above - jQuery.event.remove( this, "._submit" ); - } - }; -} - -// IE change delegation and checkbox/radio fix -if ( !jQuery.support.changeBubbles ) { - - jQuery.event.special.change = { - - setup: function() { - - if ( rformElems.test( this.nodeName ) ) { - // IE doesn't fire change on a check/radio until blur; trigger it on click - // after a propertychange. Eat the blur-change in special.change.handle. - // This still fires onchange a second time for check/radio after blur. - if ( this.type === "checkbox" || this.type === "radio" ) { - jQuery.event.add( this, "propertychange._change", function( event ) { - if ( event.originalEvent.propertyName === "checked" ) { - this._just_changed = true; - } - }); - jQuery.event.add( this, "click._change", function( event ) { - if ( this._just_changed && !event.isTrigger ) { - this._just_changed = false; - } - // Allow triggered, simulated change events (#11500) - jQuery.event.simulate( "change", this, event, true ); - }); - } - return false; - } - // Delegated event; lazy-add a change handler on descendant inputs - jQuery.event.add( this, "beforeactivate._change", function( e ) { - var elem = e.target; - - if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) { - jQuery.event.add( elem, "change._change", function( event ) { - if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { - jQuery.event.simulate( "change", this.parentNode, event, true ); - } - }); - jQuery._data( elem, "changeBubbles", true ); - } - }); - }, - - handle: function( event ) { - var elem = event.target; - - // Swallow native change events from checkbox/radio, we already triggered them above - if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { - return event.handleObj.handler.apply( this, arguments ); - } - }, - - teardown: function() { - jQuery.event.remove( this, "._change" ); - - return !rformElems.test( this.nodeName ); - } - }; -} - -// Create "bubbling" focus and blur events -if ( !jQuery.support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler while someone wants focusin/focusout - var attaches = 0, - handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - if ( attaches++ === 0 ) { - document.addEventListener( orig, handler, true ); - } - }, - teardown: function() { - if ( --attaches === 0 ) { - document.removeEventListener( orig, handler, true ); - } - } - }; - }); -} - -jQuery.fn.extend({ - - on: function( types, selector, data, fn, /*INTERNAL*/ one ) { - var type, origFn; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - this.on( type, selector, data, types[ type ], one ); - } - return this; - } - - if ( data == null && fn == null ) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return this; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return this.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - }); - }, - one: function( types, selector, data, fn ) { - return this.on( types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each(function() { - jQuery.event.remove( this, types, fn, selector ); - }); - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - triggerHandler: function( type, data ) { - var elem = this[0]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -}); -var isSimple = /^.[^:#\[\.,]*$/, - rparentsprev = /^(?:parents|prev(?:Until|All))/, - rneedsContext = jQuery.expr.match.needsContext, - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend({ - find: function( selector ) { - var i, - ret = [], - self = this, - len = self.length; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter(function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - }) ); - } - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - // Needed because $( selector, context ) becomes $( context ).find( selector ) - ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); - ret.selector = this.selector ? this.selector + " " + selector : selector; - return ret; - }, - - has: function( target ) { - var i, - targets = jQuery( target, this ), - len = targets.length; - - return this.filter(function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; - } - } - }); - }, - - not: function( selector ) { - return this.pushStack( winnow(this, selector || [], true) ); - }, - - filter: function( selector ) { - return this.pushStack( winnow(this, selector || [], false) ); - }, - - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - ret = [], - pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( ; i < l; i++ ) { - for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { - // Always skip document fragments - if ( cur.nodeType < 11 && (pos ? - pos.index(cur) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector(cur, selectors)) ) { - - cur = ret.push( cur ); - break; - } - } - } - - return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1; - } - - // index in selector - if ( typeof elem === "string" ) { - return jQuery.inArray( this[0], jQuery( elem ) ); - } - - // Locate the position of the desired element - return jQuery.inArray( - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[0] : elem, this ); - }, - - add: function( selector, context ) { - var set = typeof selector === "string" ? - jQuery( selector, context ) : - jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), - all = jQuery.merge( this.get(), set ); - - return this.pushStack( jQuery.unique(all) ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter(selector) - ); - } -}); - -function sibling( cur, dir ) { - do { - cur = cur[ dir ]; - } while ( cur && cur.nodeType !== 1 ); - - return cur; -} - -jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return jQuery.nodeName( elem, "iframe" ) ? - elem.contentDocument || elem.contentWindow.document : - jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var ret = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - ret = jQuery.filter( selector, ret ); - } - - if ( this.length > 1 ) { - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - ret = jQuery.unique( ret ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - ret = ret.reverse(); - } - } - - return this.pushStack( ret ); - }; -}); - -jQuery.extend({ - filter: function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 && elem.nodeType === 1 ? - jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : - jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - })); - }, - - dir: function( elem, dir, until ) { - var matched = [], - cur = elem[ dir ]; - - while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { - if ( cur.nodeType === 1 ) { - matched.push( cur ); - } - cur = cur[dir]; - } - return matched; - }, - - sibling: function( n, elem ) { - var r = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - r.push( n ); - } - } - - return r; - } -}); - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - /* jshint -W018 */ - return !!qualifier.call( elem, i, elem ) !== not; - }); - - } - - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - }); - - } - - if ( typeof qualifier === "string" ) { - if ( isSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - qualifier = jQuery.filter( qualifier, elements ); - } - - return jQuery.grep( elements, function( elem ) { - return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not; - }); -} -function createSafeFragment( document ) { - var list = nodeNames.split( "|" ), - safeFrag = document.createDocumentFragment(); - - if ( safeFrag.createElement ) { - while ( list.length ) { - safeFrag.createElement( - list.pop() - ); - } - } - return safeFrag; -} - -var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + - "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", - rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, - rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), - rleadingWhitespace = /^\s+/, - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, - rtagName = /<([\w:]+)/, - rtbody = /\s*$/g, - - // We have to close these tags to support XHTML (#13200) - wrapMap = { - option: [ 1, "" ], - legend: [ 1, "
", "
" ], - area: [ 1, "", "" ], - param: [ 1, "", "" ], - thead: [ 1, "", "
" ], - tr: [ 2, "", "
" ], - col: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, - // unless wrapped in a div with non-breaking characters in front of it. - _default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ] - }, - safeFragment = createSafeFragment( document ), - fragmentDiv = safeFragment.appendChild( document.createElement("div") ); - -wrapMap.optgroup = wrapMap.option; -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -jQuery.fn.extend({ - text: function( value ) { - return jQuery.access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); - }, null, value, arguments.length ); - }, - - append: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - }); - }, - - prepend: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - }); - }, - - before: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - }); - }, - - after: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - }); - }, - - // keepData is for internal use only--do not document - remove: function( selector, keepData ) { - var elem, - elems = selector ? jQuery.filter( selector, this ) : this, - i = 0; - - for ( ; (elem = elems[i]) != null; i++ ) { - - if ( !keepData && elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem ) ); - } - - if ( elem.parentNode ) { - if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { - setGlobalEval( getAll( elem, "script" ) ); - } - elem.parentNode.removeChild( elem ); - } - } - - return this; - }, - - empty: function() { - var elem, - i = 0; - - for ( ; (elem = this[i]) != null; i++ ) { - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - } - - // Remove any remaining nodes - while ( elem.firstChild ) { - elem.removeChild( elem.firstChild ); - } - - // If this is a select, ensure that it displays empty (#12336) - // Support: IE<9 - if ( elem.options && jQuery.nodeName( elem, "select" ) ) { - elem.options.length = 0; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function () { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - }); - }, - - html: function( value ) { - return jQuery.access( this, function( value ) { - var elem = this[0] || {}, - i = 0, - l = this.length; - - if ( value === undefined ) { - return elem.nodeType === 1 ? - elem.innerHTML.replace( rinlinejQuery, "" ) : - undefined; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - ( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) && - ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && - !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) { - - value = value.replace( rxhtmlTag, "<$1>" ); - - try { - for (; i < l; i++ ) { - // Remove element nodes and prevent memory leaks - elem = this[i] || {}; - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch(e) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var - // Snapshot the DOM in case .domManip sweeps something relevant into its fragment - args = jQuery.map( this, function( elem ) { - return [ elem.nextSibling, elem.parentNode ]; - }), - i = 0; - - // Make the changes, replacing each context element with the new content - this.domManip( arguments, function( elem ) { - var next = args[ i++ ], - parent = args[ i++ ]; - - if ( parent ) { - // Don't use the snapshot next if it has moved (#13810) - if ( next && next.parentNode !== parent ) { - next = this.nextSibling; - } - jQuery( this ).remove(); - parent.insertBefore( elem, next ); - } - // Allow new content to include elements from the context set - }, true ); - - // Force removal if there was no new content (e.g., from empty arguments) - return i ? this : this.remove(); - }, - - detach: function( selector ) { - return this.remove( selector, true ); - }, - - domManip: function( args, callback, allowIntersection ) { - - // Flatten any nested arrays - args = core_concat.apply( [], args ); - - var first, node, hasScripts, - scripts, doc, fragment, - i = 0, - l = this.length, - set = this, - iNoClone = l - 1, - value = args[0], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) { - return this.each(function( index ) { - var self = set.eq( index ); - if ( isFunction ) { - args[0] = value.call( this, index, self.html() ); - } - self.domManip( args, callback, allowIntersection ); - }); - } - - if ( l ) { - fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - if ( first ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( this[i], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { - - if ( node.src ) { - // Hope ajax is available... - jQuery._evalUrl( node.src ); - } else { - jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); - } - } - } - } - - // Fix #11809: Avoid leaking memory - fragment = first = null; - } - } - - return this; - } -}); - -// Support: IE<8 -// Manipulating tables requires a tbody -function manipulationTarget( elem, content ) { - return jQuery.nodeName( elem, "table" ) && - jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ? - - elem.getElementsByTagName("tbody")[0] || - elem.appendChild( elem.ownerDocument.createElement("tbody") ) : - elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - if ( match ) { - elem.type = match[1]; - } else { - elem.removeAttribute("type"); - } - return elem; -} - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var elem, - i = 0; - for ( ; (elem = elems[i]) != null; i++ ) { - jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) ); - } -} - -function cloneCopyEvent( src, dest ) { - - if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { - return; - } - - var type, i, l, - oldData = jQuery._data( src ), - curData = jQuery._data( dest, oldData ), - events = oldData.events; - - if ( events ) { - delete curData.handle; - curData.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - - // make the cloned public data object a copy from the original - if ( curData.data ) { - curData.data = jQuery.extend( {}, curData.data ); - } -} - -function fixCloneNodeIssues( src, dest ) { - var nodeName, e, data; - - // We do not need to do anything for non-Elements - if ( dest.nodeType !== 1 ) { - return; - } - - nodeName = dest.nodeName.toLowerCase(); - - // IE6-8 copies events bound via attachEvent when using cloneNode. - if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) { - data = jQuery._data( dest ); - - for ( e in data.events ) { - jQuery.removeEvent( dest, e, data.handle ); - } - - // Event data gets referenced instead of copied if the expando gets copied too - dest.removeAttribute( jQuery.expando ); - } - - // IE blanks contents when cloning scripts, and tries to evaluate newly-set text - if ( nodeName === "script" && dest.text !== src.text ) { - disableScript( dest ).text = src.text; - restoreScript( dest ); - - // IE6-10 improperly clones children of object elements using classid. - // IE10 throws NoModificationAllowedError if parent is null, #12132. - } else if ( nodeName === "object" ) { - if ( dest.parentNode ) { - dest.outerHTML = src.outerHTML; - } - - // This path appears unavoidable for IE9. When cloning an object - // element in IE9, the outerHTML strategy above is not sufficient. - // If the src has innerHTML and the destination does not, - // copy the src.innerHTML into the dest.innerHTML. #10324 - if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) { - dest.innerHTML = src.innerHTML; - } - - } else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) { - // IE6-8 fails to persist the checked state of a cloned checkbox - // or radio button. Worse, IE6-7 fail to give the cloned element - // a checked appearance if the defaultChecked value isn't also set - - dest.defaultChecked = dest.checked = src.checked; - - // IE6-7 get confused and end up setting the value of a cloned - // checkbox/radio button to an empty string instead of "on" - if ( dest.value !== src.value ) { - dest.value = src.value; - } - - // IE6-8 fails to return the selected option to the default selected - // state when cloning options - } else if ( nodeName === "option" ) { - dest.defaultSelected = dest.selected = src.defaultSelected; - - // IE6-8 fails to set the defaultValue to the correct value when - // cloning other types of input fields - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -jQuery.each({ - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - i = 0, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone(true); - jQuery( insert[i] )[ original ]( elems ); - - // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() - core_push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -}); - -function getAll( context, tag ) { - var elems, elem, - i = 0, - found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) : - typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) : - undefined; - - if ( !found ) { - for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) { - if ( !tag || jQuery.nodeName( elem, tag ) ) { - found.push( elem ); - } else { - jQuery.merge( found, getAll( elem, tag ) ); - } - } - } - - return tag === undefined || tag && jQuery.nodeName( context, tag ) ? - jQuery.merge( [ context ], found ) : - found; -} - -// Used in buildFragment, fixes the defaultChecked property -function fixDefaultChecked( elem ) { - if ( manipulation_rcheckableType.test( elem.type ) ) { - elem.defaultChecked = elem.checked; - } -} - -jQuery.extend({ - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var destElements, node, clone, i, srcElements, - inPage = jQuery.contains( elem.ownerDocument, elem ); - - if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { - clone = elem.cloneNode( true ); - - // IE<=8 does not properly clone detached, unknown element nodes - } else { - fragmentDiv.innerHTML = elem.outerHTML; - fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); - } - - if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && - (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { - - // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - // Fix all IE cloning issues - for ( i = 0; (node = srcElements[i]) != null; ++i ) { - // Ensure that the destination node is not null; Fixes #9587 - if ( destElements[i] ) { - fixCloneNodeIssues( node, destElements[i] ); - } - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0; (node = srcElements[i]) != null; i++ ) { - cloneCopyEvent( node, destElements[i] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - destElements = srcElements = node = null; - - // Return the cloned set - return clone; - }, - - buildFragment: function( elems, context, scripts, selection ) { - var j, elem, contains, - tmp, tag, tbody, wrap, - l = elems.length, - - // Ensure a safe fragment - safe = createSafeFragment( context ), - - nodes = [], - i = 0; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || safe.appendChild( context.createElement("div") ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - - tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[2]; - - // Descend through wrappers to the right content - j = wrap[0]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Manually add leading whitespace removed by IE - if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { - nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); - } - - // Remove IE's autoinserted from table fragments - if ( !jQuery.support.tbody ) { - - // String was a , *may* have spurious - elem = tag === "table" && !rtbody.test( elem ) ? - tmp.firstChild : - - // String was a bare or - wrap[1] === "
" && !rtbody.test( elem ) ? - tmp : - 0; - - j = elem && elem.childNodes.length; - while ( j-- ) { - if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { - elem.removeChild( tbody ); - } - } - } - - jQuery.merge( nodes, tmp.childNodes ); - - // Fix #12392 for WebKit and IE > 9 - tmp.textContent = ""; - - // Fix #12392 for oldIE - while ( tmp.firstChild ) { - tmp.removeChild( tmp.firstChild ); - } - - // Remember the top-level container for proper cleanup - tmp = safe.lastChild; - } - } - } - - // Fix #11356: Clear elements from fragment - if ( tmp ) { - safe.removeChild( tmp ); - } - - // Reset defaultChecked for any radios and checkboxes - // about to be appended to the DOM in IE 6/7 (#8060) - if ( !jQuery.support.appendChecked ) { - jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); - } - - i = 0; - while ( (elem = nodes[ i++ ]) ) { - - // #4087 - If origin and destination elements are the same, and this is - // that element, do not do anything - if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( safe.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( (elem = tmp[ j++ ]) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - tmp = null; - - return safe; - }, - - cleanData: function( elems, /* internal */ acceptData ) { - var elem, type, id, data, - i = 0, - internalKey = jQuery.expando, - cache = jQuery.cache, - deleteExpando = jQuery.support.deleteExpando, - special = jQuery.event.special; - - for ( ; (elem = elems[i]) != null; i++ ) { - - if ( acceptData || jQuery.acceptData( elem ) ) { - - id = elem[ internalKey ]; - data = id && cache[ id ]; - - if ( data ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Remove cache only if it was not already removed by jQuery.event.remove - if ( cache[ id ] ) { - - delete cache[ id ]; - - // IE does not allow us to delete expando properties from nodes, - // nor does it have a removeAttribute function on Document nodes; - // we must handle all of these cases - if ( deleteExpando ) { - delete elem[ internalKey ]; - - } else if ( typeof elem.removeAttribute !== core_strundefined ) { - elem.removeAttribute( internalKey ); - - } else { - elem[ internalKey ] = null; - } - - core_deletedIds.push( id ); - } - } - } - } - }, - - _evalUrl: function( url ) { - return jQuery.ajax({ - url: url, - type: "GET", - dataType: "script", - async: false, - global: false, - "throws": true - }); - } -}); -jQuery.fn.extend({ - wrapAll: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each(function(i) { - jQuery(this).wrapAll( html.call(this, i) ); - }); - } - - if ( this[0] ) { - // The elements to wrap the target around - var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); - - if ( this[0].parentNode ) { - wrap.insertBefore( this[0] ); - } - - wrap.map(function() { - var elem = this; - - while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { - elem = elem.firstChild; - } - - return elem; - }).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each(function(i) { - jQuery(this).wrapInner( html.call(this, i) ); - }); - } - - return this.each(function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - }); - }, - - wrap: function( html ) { - var isFunction = jQuery.isFunction( html ); - - return this.each(function(i) { - jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); - }); - }, - - unwrap: function() { - return this.parent().each(function() { - if ( !jQuery.nodeName( this, "body" ) ) { - jQuery( this ).replaceWith( this.childNodes ); - } - }).end(); - } -}); -var iframe, getStyles, curCSS, - ralpha = /alpha\([^)]*\)/i, - ropacity = /opacity\s*=\s*([^)]*)/, - rposition = /^(top|right|bottom|left)$/, - // swappable if display is none or starts with table except "table", "table-cell", or "table-caption" - // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rmargin = /^margin/, - rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ), - rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ), - rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ), - elemdisplay = { BODY: "block" }, - - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: 0, - fontWeight: 400 - }, - - cssExpand = [ "Top", "Right", "Bottom", "Left" ], - cssPrefixes = [ "Webkit", "O", "Moz", "ms" ]; - -// return a css property mapped to a potentially vendor prefixed property -function vendorPropName( style, name ) { - - // shortcut for names that are not vendor prefixed - if ( name in style ) { - return name; - } - - // check for vendor prefixed names - var capName = name.charAt(0).toUpperCase() + name.slice(1), - origName = name, - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in style ) { - return name; - } - } - - return origName; -} - -function isHidden( elem, el ) { - // isHidden might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); -} - -function showHide( elements, show ) { - var display, elem, hidden, - values = [], - index = 0, - length = elements.length; - - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - values[ index ] = jQuery._data( elem, "olddisplay" ); - display = elem.style.display; - if ( show ) { - // Reset the inline display of this element to learn if it is - // being hidden by cascaded rules or not - if ( !values[ index ] && display === "none" ) { - elem.style.display = ""; - } - - // Set elements which have been overridden with display: none - // in a stylesheet to whatever the default browser style is - // for such an element - if ( elem.style.display === "" && isHidden( elem ) ) { - values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) ); - } - } else { - - if ( !values[ index ] ) { - hidden = isHidden( elem ); - - if ( display && display !== "none" || !hidden ) { - jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) ); - } - } - } - } - - // Set the display of most of the elements in a second loop - // to avoid the constant reflow - for ( index = 0; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - if ( !show || elem.style.display === "none" || elem.style.display === "" ) { - elem.style.display = show ? values[ index ] || "" : "none"; - } - } - - return elements; -} - -jQuery.fn.extend({ - css: function( name, value ) { - return jQuery.access( this, function( elem, name, value ) { - var len, styles, - map = {}, - i = 0; - - if ( jQuery.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - }, - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each(function() { - if ( isHidden( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - }); - } -}); - -jQuery.extend({ - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "columnCount": true, - "fillOpacity": true, - "fontWeight": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: { - // normalize float css property - "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat" - }, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = jQuery.camelCase( name ), - style = elem.style; - - name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) ); - - // gets hook for the prefixed version - // followed by the unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // convert relative number strings (+= or -=) to relative numbers. #7345 - if ( type === "string" && (ret = rrelNum.exec( value )) ) { - value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) ); - // Fixes bug #9237 - type = "number"; - } - - // Make sure that NaN and null values aren't set. See: #7116 - if ( value == null || type === "number" && isNaN( value ) ) { - return; - } - - // If a number was passed in, add 'px' to the (except for certain CSS properties) - if ( type === "number" && !jQuery.cssNumber[ origName ] ) { - value += "px"; - } - - // Fixes #8908, it can be done more correctly by specifing setters in cssHooks, - // but it would mean to define eight (for every problematic property) identical functions - if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) { - - // Wrapped to prevent IE from throwing errors when 'invalid' values are provided - // Fixes bug #5509 - try { - style[ name ] = value; - } catch(e) {} - } - - } else { - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var num, val, hooks, - origName = jQuery.camelCase( name ); - - // Make sure that we're working with the right name - name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) ); - - // gets hook for the prefixed version - // followed by the unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - //convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Return, converting to number if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || jQuery.isNumeric( num ) ? num || 0 : val; - } - return val; - } -}); - -// NOTE: we've included the "window" in window.getComputedStyle -// because jsdom on node.js will break without it. -if ( window.getComputedStyle ) { - getStyles = function( elem ) { - return window.getComputedStyle( elem, null ); - }; - - curCSS = function( elem, name, _computed ) { - var width, minWidth, maxWidth, - computed = _computed || getStyles( elem ), - - // getPropertyValue is only needed for .css('filter') in IE9, see #12537 - ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined, - style = elem.style; - - if ( computed ) { - - if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right - // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels - // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values - if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret; - }; -} else if ( document.documentElement.currentStyle ) { - getStyles = function( elem ) { - return elem.currentStyle; - }; - - curCSS = function( elem, name, _computed ) { - var left, rs, rsLeft, - computed = _computed || getStyles( elem ), - ret = computed ? computed[ name ] : undefined, - style = elem.style; - - // Avoid setting ret to empty string here - // so we don't default to auto - if ( ret == null && style && style[ name ] ) { - ret = style[ name ]; - } - - // From the awesome hack by Dean Edwards - // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 - - // If we're not dealing with a regular pixel number - // but a number that has a weird ending, we need to convert it to pixels - // but not position css attributes, as those are proportional to the parent element instead - // and we can't measure the parent instead because it might trigger a "stacking dolls" problem - if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) { - - // Remember the original values - left = style.left; - rs = elem.runtimeStyle; - rsLeft = rs && rs.left; - - // Put in the new values to get a computed value out - if ( rsLeft ) { - rs.left = elem.currentStyle.left; - } - style.left = name === "fontSize" ? "1em" : ret; - ret = style.pixelLeft + "px"; - - // Revert the changed values - style.left = left; - if ( rsLeft ) { - rs.left = rsLeft; - } - } - - return ret === "" ? "auto" : ret; - }; -} - -function setPositiveNumber( elem, value, subtract ) { - var matches = rnumsplit.exec( value ); - return matches ? - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : - value; -} - -function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { - var i = extra === ( isBorderBox ? "border" : "content" ) ? - // If we already have the right measurement, avoid augmentation - 4 : - // Otherwise initialize for horizontal or vertical properties - name === "width" ? 1 : 0, - - val = 0; - - for ( ; i < 4; i += 2 ) { - // both box models exclude margin, so add it if we want it - if ( extra === "margin" ) { - val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); - } - - if ( isBorderBox ) { - // border-box includes padding, so remove it if we want content - if ( extra === "content" ) { - val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // at this point, extra isn't border nor margin, so remove border - if ( extra !== "margin" ) { - val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } else { - // at this point, extra isn't content, so add padding - val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // at this point, extra isn't content nor padding, so add border - if ( extra !== "padding" ) { - val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - return val; -} - -function getWidthOrHeight( elem, name, extra ) { - - // Start with offset property, which is equivalent to the border-box value - var valueIsBorderBox = true, - val = name === "width" ? elem.offsetWidth : elem.offsetHeight, - styles = getStyles( elem ), - isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // some non-html elements return undefined for offsetWidth, so check for null/undefined - // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 - // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 - if ( val <= 0 || val == null ) { - // Fall back to computed then uncomputed css if necessary - val = curCSS( elem, name, styles ); - if ( val < 0 || val == null ) { - val = elem.style[ name ]; - } - - // Computed unit is not pixels. Stop here and return. - if ( rnumnonpx.test(val) ) { - return val; - } - - // we need the check for style in case a browser which returns unreliable values - // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] ); - - // Normalize "", auto, and prepare for extra - val = parseFloat( val ) || 0; - } - - // use the active box-sizing model to add/subtract irrelevant styles - return ( val + - augmentWidthOrHeight( - elem, - name, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles - ) - ) + "px"; -} - -// Try to determine the default display value of an element -function css_defaultDisplay( nodeName ) { - var doc = document, - display = elemdisplay[ nodeName ]; - - if ( !display ) { - display = actualDisplay( nodeName, doc ); - - // If the simple way fails, read from inside an iframe - if ( display === "none" || !display ) { - // Use the already-created iframe if possible - iframe = ( iframe || - jQuery(" - -
  • - -
  • - -
  • - -
  • - - - - -
    - -
    - -

    Introducing Bootstrap.

    - - -
    -
    - -

    By nerds, for nerds.

    -

    Built at Twitter by @mdo and @fat, Bootstrap utilizes LESS CSS, is compiled via Node, and is managed through GitHub to help nerds do awesome stuff on the web.

    -
    -
    - -

    Made for everyone.

    -

    Bootstrap was made to not only look and behave great in the latest desktop browsers (as well as IE7!), but in tablet and smartphone browsers via responsive CSS as well.

    -
    -
    - -

    Packed with features.

    -

    A 12-column responsive grid, dozens of components, JavaScript plugins, typography, form controls, and even a web-based Customizer to make Bootstrap your own.

    -
    -
    - -
    - -

    Built with Bootstrap.

    - -
    - -
    - -
    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/javascript.html b/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/javascript.html deleted file mode 100644 index 9166fe35c..000000000 --- a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/javascript.html +++ /dev/null @@ -1,1805 +0,0 @@ - - - - - Javascript · Bootstrap - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -

    JavaScript

    -

    Bring Bootstrap's components to life—now with 13 custom jQuery plugins. -

    -
    - -
    - - -
    - -
    - - - -
    - - -

    Individual or compiled

    -

    Plugins can be included individually (though some have required dependencies), or all at once. Both bootstrap.js and bootstrap.min.js contain all plugins in a single file.

    - -

    Data attributes

    -

    You can use all Bootstrap plugins purely through the markup API without writing a single line of JavaScript. This is Bootstrap's first class API and should be your first consideration when using a plugin.

    - -

    That said, in some situations it may be desirable to turn this functionality off. Therefore, we also provide the ability to disable the data attribute API by unbinding all events on the body namespaced with `'data-api'`. This looks like this: -

    $('body').off('.data-api')
    - -

    Alternatively, to target a specific plugin, just include the plugin's name as a namespace along with the data-api namespace like this:

    -
    $('body').off('.alert.data-api')
    - -

    Programmatic API

    -

    We also believe you should be able to use all Bootstrap plugins purely through the JavaScript API. All public APIs are single, chainable methods, and return the collection acted upon.

    -
    $(".btn.danger").button("toggle").addClass("fat")
    -

    All methods should accept an optional options object, a string which targets a particular method, or nothing (which initiates a plugin with default behavior):

    -
    -$("#myModal").modal()                       // initialized with defaults
    -$("#myModal").modal({ keyboard: false })   // initialized with no keyboard
    -$("#myModal").modal('show')                // initializes and invokes show immediately

    -
    -

    Each plugin also exposes its raw constructor on a `Constructor` property: $.fn.popover.Constructor. If you'd like to get a particular plugin instance, retrieve it directly from an element: $('[rel=popover]').data('popover').

    - -

    No Conflict

    -

    Sometimes it is necessary to use Bootstrap plugins with other UI frameworks. In these circumstances, namespace collisions can occasionally occur. If this happens, you may call .noConflict on the plugin you wish to revert the value of.

    - -
    -var bootstrapButton = $.fn.button.noConflict() // return $.fn.button to previously assigned value
    -$.fn.bootstrapBtn = bootstrapButton            // give $().bootstrapBtn the bootstrap functionality
    -
    - -

    Events

    -

    Bootstrap provides custom events for most plugin's unique actions. Generally, these come in an infinitive and past participle form - where the infinitive (ex. show) is triggered at the start of an event, and its past participle form (ex. shown) is trigger on the completion of an action.

    -

    All infinitive events provide preventDefault functionality. This provides the ability to stop the execution of an action before it starts.

    -
    -$('#myModal').on('show', function (e) {
    -    if (!data) return e.preventDefault() // stops modal from being shown
    -})
    -
    -
    - - - - -
    - -

    About transitions

    -

    For simple transition effects, include bootstrap-transition.js once alongside the other JS files. If you're using the compiled (or minified) bootstrap.js, there is no need to include this—it's already there.

    -

    Use cases

    -

    A few examples of the transition plugin:

    -
      -
    • Sliding or fading in modals
    • -
    • Fading out tabs
    • -
    • Fading out alerts
    • -
    • Sliding carousel panes
    • -
    - -
    - - - - -
    - - - -

    Examples

    -

    Modals are streamlined, but flexible, dialog prompts with the minimum required functionality and smart defaults.

    - -

    Static example

    -

    A rendered modal with header, body, and set of actions in the footer.

    -
    - -
    -
    -<div class="modal hide fade">
    -  <div class="modal-header">
    -    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
    -    <h3>Modal header</h3>
    -  </div>
    -  <div class="modal-body">
    -    <p>One fine body…</p>
    -  </div>
    -  <div class="modal-footer">
    -    <a href="#" class="btn">Close</a>
    -    <a href="#" class="btn btn-primary">Save changes</a>
    -  </div>
    -</div>
    -
    - -

    Live demo

    -

    Toggle a modal via JavaScript by clicking the button below. It will slide down and fade in from the top of the page.

    - - - -
    -<!-- Button to trigger modal -->
    -<a href="#myModal" role="button" class="btn" data-toggle="modal">Launch demo modal</a>
    -
    -<!-- Modal -->
    -<div id="myModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    -  <div class="modal-header">
    -    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
    -    <h3 id="myModalLabel">Modal header</h3>
    -  </div>
    -  <div class="modal-body">
    -    <p>One fine body…</p>
    -  </div>
    -  <div class="modal-footer">
    -    <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
    -    <button class="btn btn-primary">Save changes</button>
    -  </div>
    -</div>
    -
    - - -
    - - -

    Usage

    - -

    Via data attributes

    -

    Activate a modal without writing JavaScript. Set data-toggle="modal" on a controller element, like a button, along with a data-target="#foo" or href="#foo" to target a specific modal to toggle.

    -
    <button type="button" data-toggle="modal" data-target="#myModal">Launch modal</button>
    - -

    Via JavaScript

    -

    Call a modal with id myModal with a single line of JavaScript:

    -
    $('#myModal').modal(options)
    - -

    Options

    -

    Options can be passed via data attributes or JavaScript. For data attributes, append the option name to data-, as in data-backdrop="".

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Nametypedefaultdescription
    backdropbooleantrueIncludes a modal-backdrop element. Alternatively, specify static for a backdrop which doesn't close the modal on click.
    keyboardbooleantrueCloses the modal when escape key is pressed
    showbooleantrueShows the modal when initialized.
    remotepathfalse

    If a remote url is provided, content will be loaded via jQuery's load method and injected into the .modal-body. If you're using the data api, you may alternatively use the href tag to specify the remote source. An example of this is shown below:

    -
    <a data-toggle="modal" href="remote.html" data-target="#modal">click me</a>
    - -

    Methods

    -

    .modal(options)

    -

    Activates your content as a modal. Accepts an optional options object.

    -
    -$('#myModal').modal({
    -  keyboard: false
    -})
    -
    -

    .modal('toggle')

    -

    Manually toggles a modal.

    -
    $('#myModal').modal('toggle')
    -

    .modal('show')

    -

    Manually opens a modal.

    -
    $('#myModal').modal('show')
    -

    .modal('hide')

    -

    Manually hides a modal.

    -
    $('#myModal').modal('hide')
    -

    Events

    -

    Bootstrap's modal class exposes a few events for hooking into modal functionality.

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDescription
    showThis event fires immediately when the show instance method is called.
    shownThis event is fired when the modal has been made visible to the user (will wait for css transitions to complete).
    hideThis event is fired immediately when the hide instance method has been called.
    hiddenThis event is fired when the modal has finished being hidden from the user (will wait for css transitions to complete).
    -
    -$('#myModal').on('hidden', function () {
    -  // do something…
    -})
    -
    - - - - - - - - - - -
    - - - -

    Example in navbar

    -

    The ScrollSpy plugin is for automatically updating nav targets based on scroll position. Scroll the area below the navbar and watch the active class change. The dropdown sub items will be highlighted as well.

    -
    - -
    -

    @fat

    -

    Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.

    -

    @mdo

    -

    Veniam marfa mustache skateboard, adipisicing fugiat velit pitchfork beard. Freegan beard aliqua cupidatat mcsweeney's vero. Cupidatat four loko nisi, ea helvetica nulla carles. Tattooed cosby sweater food truck, mcsweeney's quis non freegan vinyl. Lo-fi wes anderson +1 sartorial. Carles non aesthetic exercitation quis gentrify. Brooklyn adipisicing craft beer vice keytar deserunt.

    -

    one

    -

    Occaecat commodo aliqua delectus. Fap craft beer deserunt skateboard ea. Lomo bicycle rights adipisicing banh mi, velit ea sunt next level locavore single-origin coffee in magna veniam. High life id vinyl, echo park consequat quis aliquip banh mi pitchfork. Vero VHS est adipisicing. Consectetur nisi DIY minim messenger bag. Cred ex in, sustainable delectus consectetur fanny pack iphone.

    -

    two

    -

    In incididunt echo park, officia deserunt mcsweeney's proident master cleanse thundercats sapiente veniam. Excepteur VHS elit, proident shoreditch +1 biodiesel laborum craft beer. Single-origin coffee wayfarers irure four loko, cupidatat terry richardson master cleanse. Assumenda you probably haven't heard of them art party fanny pack, tattooed nulla cardigan tempor ad. Proident wolf nesciunt sartorial keffiyeh eu banh mi sustainable. Elit wolf voluptate, lo-fi ea portland before they sold out four loko. Locavore enim nostrud mlkshk brooklyn nesciunt.

    -

    three

    -

    Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.

    -

    Keytar twee blog, culpa messenger bag marfa whatever delectus food truck. Sapiente synth id assumenda. Locavore sed helvetica cliche irony, thundercats you probably haven't heard of them consequat hoodie gluten-free lo-fi fap aliquip. Labore elit placeat before they sold out, terry richardson proident brunch nesciunt quis cosby sweater pariatur keffiyeh ut helvetica artisan. Cardigan craft beer seitan readymade velit. VHS chambray laboris tempor veniam. Anim mollit minim commodo ullamco thundercats. -

    -
    -
    - - -
    - - -

    Usage

    - -

    Via data attributes

    -

    To easily add scrollspy behavior to your topbar navigation, just add data-spy="scroll" to the element you want to spy on (most typically this would be the body) and data-target=".navbar" to select which nav to use. You'll want to use scrollspy with a .nav component.

    -
    <body data-spy="scroll" data-target=".navbar">...</body>
    - -

    Via JavaScript

    -

    Call the scrollspy via JavaScript:

    -
    $('#navbar').scrollspy()
    - -
    - Heads up! - Navbar links must have resolvable id targets. For example, a <a href="#home">home</a> must correspond to something in the dom like <div id="home"></div>. -
    - -

    Methods

    -

    .scrollspy('refresh')

    -

    When using scrollspy in conjunction with adding or removing of elements from the DOM, you'll need to call the refresh method like so:

    -
    -$('[data-spy="scroll"]').each(function () {
    -  var $spy = $(this).scrollspy('refresh')
    -});
    -
    - -

    Options

    -

    Options can be passed via data attributes or JavaScript. For data attributes, append the option name to data-, as in data-offset="".

    - - - - - - - - - - - - - - - - - -
    Nametypedefaultdescription
    offsetnumber10Pixels to offset from top when calculating position of scroll.
    - -

    Events

    - - - - - - - - - - - - - -
    EventDescription
    activateThis event fires whenever a new item becomes activated by the scrollspy.
    -
    - - - - -
    - - - -

    Example tabs

    -

    Add quick, dynamic tab functionality to transition through panes of local content, even via dropdown menus.

    -
    - -
    -
    -

    Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.

    -
    -
    -

    Food truck fixie locavore, accusamus mcsweeney's marfa nulla single-origin coffee squid. Exercitation +1 labore velit, blog sartorial PBR leggings next level wes anderson artisan four loko farm-to-table craft beer twee. Qui photo booth letterpress, commodo enim craft beer mlkshk aliquip jean shorts ullamco ad vinyl cillum PBR. Homo nostrud organic, assumenda labore aesthetic magna delectus mollit. Keytar helvetica VHS salvia yr, vero magna velit sapiente labore stumptown. Vegan fanny pack odio cillum wes anderson 8-bit, sustainable jean shorts beard ut DIY ethical culpa terry richardson biodiesel. Art party scenester stumptown, tumblr butcher vero sint qui sapiente accusamus tattooed echo park.

    -
    - - -
    -
    - - -
    - - -

    Usage

    -

    Enable tabbable tabs via JavaScript (each tab needs to be activated individually):

    -
    -$('#myTab a').click(function (e) {
    -  e.preventDefault();
    -  $(this).tab('show');
    -})
    -

    You can activate individual tabs in several ways:

    -
    -$('#myTab a[href="#profile"]').tab('show'); // Select tab by name
    -$('#myTab a:first').tab('show'); // Select first tab
    -$('#myTab a:last').tab('show'); // Select last tab
    -$('#myTab li:eq(2) a').tab('show'); // Select third tab (0-indexed)
    -
    - -

    Markup

    -

    You can activate a tab or pill navigation without writing any JavaScript by simply specifying data-toggle="tab" or data-toggle="pill" on an element. Adding the nav and nav-tabs classes to the tab ul will apply the Bootstrap tab styling.

    -
    -<ul class="nav nav-tabs">
    -  <li><a href="#home" data-toggle="tab">Home</a></li>
    -  <li><a href="#profile" data-toggle="tab">Profile</a></li>
    -  <li><a href="#messages" data-toggle="tab">Messages</a></li>
    -  <li><a href="#settings" data-toggle="tab">Settings</a></li>
    -</ul>
    - -

    Methods

    -

    $().tab

    -

    - Activates a tab element and content container. Tab should have either a data-target or an href targeting a container node in the DOM. -

    -
    -<ul class="nav nav-tabs" id="myTab">
    -  <li class="active"><a href="#home">Home</a></li>
    -  <li><a href="#profile">Profile</a></li>
    -  <li><a href="#messages">Messages</a></li>
    -  <li><a href="#settings">Settings</a></li>
    -</ul>
    -
    -<div class="tab-content">
    -  <div class="tab-pane active" id="home">...</div>
    -  <div class="tab-pane" id="profile">...</div>
    -  <div class="tab-pane" id="messages">...</div>
    -  <div class="tab-pane" id="settings">...</div>
    -</div>
    -
    -<script>
    -  $(function () {
    -    $('#myTab a:last').tab('show');
    -  })
    -</script>
    -
    - -

    Events

    - - - - - - - - - - - - - - - - - -
    EventDescription
    showThis event fires on tab show, but before the new tab has been shown. Use event.target and event.relatedTarget to target the active tab and the previous active tab (if available) respectively.
    shownThis event fires on tab show after a tab has been shown. Use event.target and event.relatedTarget to target the active tab and the previous active tab (if available) respectively.
    -
    -$('a[data-toggle="tab"]').on('shown', function (e) {
    -  e.target // activated tab
    -  e.relatedTarget // previous tab
    -})
    -
    -
    - - - -
    - - - -

    Examples

    -

    Inspired by the excellent jQuery.tipsy plugin written by Jason Frame; Tooltips are an updated version, which don't rely on images, use CSS3 for animations, and data-attributes for local title storage.

    -

    For performance reasons, the tooltip and popover data-apis are opt in, meaning you must initialize them yourself.

    -

    Hover over the links below to see tooltips:

    -
    -

    Tight pants next level keffiyeh you probably haven't heard of them. Photo booth beard raw denim letterpress vegan messenger bag stumptown. Farm-to-table seitan, mcsweeney's fixie sustainable quinoa 8-bit american apparel have a terry richardson vinyl chambray. Beard stumptown, cardigans banh mi lomo thundercats. Tofu biodiesel williamsburg marfa, four loko mcsweeney's cleanse vegan chambray. A really ironic artisan whatever keytar, scenester farm-to-table banksy Austin twitter handle freegan cred raw denim single-origin coffee viral. -

    -
    - -

    Four directions

    - - - -

    Tooltips in input groups

    -

    When using tooltips and popovers with the Bootstrap input groups, you'll have to set the container (documented below) option to avoid unwanted side effects.

    - -
    - - -

    Usage

    -

    Trigger the tooltip via JavaScript:

    -
    $('#example').tooltip(options)
    - -

    Options

    -

    Options can be passed via data attributes or JavaScript. For data attributes, append the option name to data-, as in data-animation="".

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Nametypedefaultdescription
    animationbooleantrueapply a css fade transition to the tooltip
    htmlbooleanfalseInsert html into the tooltip. If false, jquery's text method will be used to insert content into the dom. Use text if you're worried about XSS attacks.
    placementstring | function'top'how to position the tooltip - top | bottom | left | right
    selectorstringfalseIf a selector is provided, tooltip objects will be delegated to the specified targets.
    titlestring | function''default title value if `title` tag isn't present
    triggerstring'hover focus'how tooltip is triggered - click | hover | focus | manual. Note you case pass trigger mutliple, space seperated, trigger types.
    delaynumber | object0 -

    delay showing and hiding the tooltip (ms) - does not apply to manual trigger type

    -

    If a number is supplied, delay is applied to both hide/show

    -

    Object structure is: delay: { show: 500, hide: 100 }

    -
    containerstring | falsefalse -

    Appends the tooltip to a specific element container: 'body'

    -
    -
    - Heads up! - Options for individual tooltips can alternatively be specified through the use of data attributes. -
    - -

    Markup

    -
    <a href="#" data-toggle="tooltip" title="first tooltip">hover over me</a>
    - -

    Methods

    -

    $().tooltip(options)

    -

    Attaches a tooltip handler to an element collection.

    -

    .tooltip('show')

    -

    Reveals an element's tooltip.

    -
    $('#element').tooltip('show')
    -

    .tooltip('hide')

    -

    Hides an element's tooltip.

    -
    $('#element').tooltip('hide')
    -

    .tooltip('toggle')

    -

    Toggles an element's tooltip.

    -
    $('#element').tooltip('toggle')
    -

    .tooltip('destroy')

    -

    Hides and destroys an element's tooltip.

    -
    $('#element').tooltip('destroy')
    -
    - - - - -
    - - -

    Examples

    -

    Add small overlays of content, like those on the iPad, to any element for housing secondary information. Hover over the button to trigger the popover. Requires Tooltip to be included.

    - -

    Static popover

    -

    Four options are available: top, right, bottom, and left aligned.

    -
    -
    -
    -

    Popover top

    -
    -

    Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

    -
    -
    - -
    -
    -

    Popover right

    -
    -

    Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

    -
    -
    - -
    -
    -

    Popover bottom

    -
    -

    Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

    -
    -
    - -
    -
    -

    Popover left

    -
    -

    Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

    -
    -
    - -
    -
    -

    No markup shown as popovers are generated from JavaScript and content within a data attribute.

    - -

    Live demo

    - - -

    Four directions

    - - - -
    - - -

    Usage

    -

    Enable popovers via JavaScript:

    -
    $('#example').popover(options)
    - -

    Options

    -

    Options can be passed via data attributes or JavaScript. For data attributes, append the option name to data-, as in data-animation="".

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Nametypedefaultdescription
    animationbooleantrueapply a css fade transition to the tooltip
    htmlbooleanfalseInsert html into the popover. If false, jquery's text method will be used to insert content into the dom. Use text if you're worried about XSS attacks.
    placementstring | function'right'how to position the popover - top | bottom | left | right
    selectorstringfalseif a selector is provided, tooltip objects will be delegated to the specified targets
    triggerstring'click'how popover is triggered - click | hover | focus | manual
    titlestring | function''default title value if `title` attribute isn't present
    contentstring | function''default content value if `data-content` attribute isn't present
    delaynumber | object0 -

    delay showing and hiding the popover (ms) - does not apply to manual trigger type

    -

    If a number is supplied, delay is applied to both hide/show

    -

    Object structure is: delay: { show: 500, hide: 100 }

    -
    containerstring | falsefalse -

    Appends the popover to a specific element container: 'body'

    -
    -
    - Heads up! - Options for individual popovers can alternatively be specified through the use of data attributes. -
    - -

    Markup

    -

    For performance reasons, the Tooltip and Popover data-apis are opt in. If you would like to use them just specify a selector option.

    - -

    Methods

    -

    $().popover(options)

    -

    Initializes popovers for an element collection.

    -

    .popover('show')

    -

    Reveals an elements popover.

    -
    $('#element').popover('show')
    -

    .popover('hide')

    -

    Hides an elements popover.

    -
    $('#element').popover('hide')
    -

    .popover('toggle')

    -

    Toggles an elements popover.

    -
    $('#element').popover('toggle')
    -

    .popover('destroy')

    -

    Hides and destroys an element's popover.

    -
    $('#element').popover('destroy')
    -
    - - - - -
    - - - -

    Example alerts

    -

    Add dismiss functionality to all alert messages with this plugin.

    -
    -
    - - Holy guacamole! Best check yo self, you're not looking too good. -
    -
    - -
    -
    - -

    Oh snap! You got an error!

    -

    Change this and that and try again. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cras mattis consectetur purus sit amet fermentum.

    -

    - Take this action Or do this -

    -
    -
    - - -
    - - -

    Usage

    -

    Enable dismissal of an alert via JavaScript:

    -
    $(".alert").alert()
    - -

    Markup

    -

    Just add data-dismiss="alert" to your close button to automatically give an alert close functionality.

    -
    <a class="close" data-dismiss="alert" href="#">&times;</a>
    - -

    Methods

    -

    $().alert()

    -

    Wraps all alerts with close functionality. To have your alerts animate out when closed, make sure they have the .fade and .in class already applied to them.

    -

    .alert('close')

    -

    Closes an alert.

    -
    $(".alert").alert('close')
    - - -

    Events

    -

    Bootstrap's alert class exposes a few events for hooking into alert functionality.

    - - - - - - - - - - - - - - - - - -
    EventDescription
    closeThis event fires immediately when the close instance method is called.
    closedThis event is fired when the alert has been closed (will wait for css transitions to complete).
    -
    -$('#my-alert').bind('closed', function () {
    -  // do something…
    -})
    -
    -
    - - - - -
    - - -

    Example uses

    -

    Do more with buttons. Control button states or create groups of buttons for more components like toolbars.

    - -

    Stateful

    -

    Add data-loading-text="Loading..." to use a loading state on a button.

    -
    - -
    -
    <button type="button" class="btn btn-primary" data-loading-text="Loading...">Loading state</button>
    - -

    Single toggle

    -

    Add data-toggle="button" to activate toggling on a single button.

    -
    - -
    -
    <button type="button" class="btn btn-primary" data-toggle="button">Single Toggle</button>
    - -

    Checkbox

    -

    Add data-toggle="buttons-checkbox" for checkbox style toggling on btn-group.

    -
    -
    - - - -
    -
    -
    -<div class="btn-group" data-toggle="buttons-checkbox">
    -  <button type="button" class="btn btn-primary">Left</button>
    -  <button type="button" class="btn btn-primary">Middle</button>
    -  <button type="button" class="btn btn-primary">Right</button>
    -</div>
    -
    - -

    Radio

    -

    Add data-toggle="buttons-radio" for radio style toggling on btn-group.

    -
    -
    - - - -
    -
    -
    -<div class="btn-group" data-toggle="buttons-radio">
    -  <button type="button" class="btn btn-primary">Left</button>
    -  <button type="button" class="btn btn-primary">Middle</button>
    -  <button type="button" class="btn btn-primary">Right</button>
    -</div>
    -
    - - -
    - - -

    Usage

    -

    Enable buttons via JavaScript:

    -
    $('.nav-tabs').button()
    - -

    Markup

    -

    Data attributes are integral to the button plugin. Check out the example code below for the various markup types.

    - -

    Options

    -

    None

    - -

    Methods

    -

    $().button('toggle')

    -

    Toggles push state. Gives the button the appearance that it has been activated.

    -
    - Heads up! - You can enable auto toggling of a button by using the data-toggle attribute. -
    -
    <button type="button" class="btn" data-toggle="button" >…</button>
    -

    $().button('loading')

    -

    Sets button state to loading - disables button and swaps text to loading text. Loading text should be defined on the button element using the data attribute data-loading-text. -

    -
    <button type="button" class="btn" data-loading-text="loading stuff..." >...</button>
    -
    - Heads up! - Firefox persists the disabled state across page loads. A workaround for this is to use autocomplete="off". -
    -

    $().button('reset')

    -

    Resets button state - swaps text to original text.

    -

    $().button(string)

    -

    Resets button state - swaps text to any data defined text state.

    -
    <button type="button" class="btn" data-complete-text="finished!" >...</button>
    -<script>
    -  $('.btn').button('complete')
    -</script>
    -
    -
    - - - - -
    - - -

    About

    -

    Get base styles and flexible support for collapsible components like accordions and navigation.

    -

    * Requires the Transitions plugin to be included.

    - -

    Example accordion

    -

    Using the collapse plugin, we built a simple accordion style widget:

    - -
    -
    -
    - -
    -
    - Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. -
    -
    -
    -
    - -
    -
    - Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. -
    -
    -
    -
    - -
    -
    - Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. -
    -
    -
    -
    -
    -
    -<div class="accordion" id="accordion2">
    -  <div class="accordion-group">
    -    <div class="accordion-heading">
    -      <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion2" href="#collapseOne">
    -        Collapsible Group Item #1
    -      </a>
    -    </div>
    -    <div id="collapseOne" class="accordion-body collapse in">
    -      <div class="accordion-inner">
    -        Anim pariatur cliche...
    -      </div>
    -    </div>
    -  </div>
    -  <div class="accordion-group">
    -    <div class="accordion-heading">
    -      <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion2" href="#collapseTwo">
    -        Collapsible Group Item #2
    -      </a>
    -    </div>
    -    <div id="collapseTwo" class="accordion-body collapse">
    -      <div class="accordion-inner">
    -        Anim pariatur cliche...
    -      </div>
    -    </div>
    -  </div>
    -</div>
    -...
    -
    -

    You can also use the plugin without the accordion markup. Make a button toggle the expanding and collapsing of another element.

    -
    -<button type="button" class="btn btn-danger" data-toggle="collapse" data-target="#demo">
    -  simple collapsible
    -</button>
    -
    -<div id="demo" class="collapse in"> … </div>
    -
    - - -
    - - -

    Usage

    - -

    Via data attributes

    -

    Just add data-toggle="collapse" and a data-target to element to automatically assign control of a collapsible element. The data-target attribute accepts a css selector to apply the collapse to. Be sure to add the class collapse to the collapsible element. If you'd like it to default open, add the additional class in.

    -

    To add accordion-like group management to a collapsible control, add the data attribute data-parent="#selector". Refer to the demo to see this in action.

    - -

    Via JavaScript

    -

    Enable manually with:

    -
    $(".collapse").collapse()
    - -

    Options

    -

    Options can be passed via data attributes or JavaScript. For data attributes, append the option name to data-, as in data-parent="".

    - - - - - - - - - - - - - - - - - - - - - - - -
    Nametypedefaultdescription
    parentselectorfalseIf selector then all collapsible elements under the specified parent will be closed when this collapsible item is shown. (similar to traditional accordion behavior)
    togglebooleantrueToggles the collapsible element on invocation
    - - -

    Methods

    -

    .collapse(options)

    -

    Activates your content as a collapsible element. Accepts an optional options object. -

    -$('#myCollapsible').collapse({
    -  toggle: false
    -})
    -
    -

    .collapse('toggle')

    -

    Toggles a collapsible element to shown or hidden.

    -

    .collapse('show')

    -

    Shows a collapsible element.

    -

    .collapse('hide')

    -

    Hides a collapsible element.

    - -

    Events

    -

    Bootstrap's collapse class exposes a few events for hooking into collapse functionality.

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    EventDescription
    showThis event fires immediately when the show instance method is called.
    shownThis event is fired when a collapse element has been made visible to the user (will wait for css transitions to complete).
    hide - This event is fired immediately when the hide method has been called. -
    hiddenThis event is fired when a collapse element has been hidden from the user (will wait for css transitions to complete).
    -
    -$('#myCollapsible').on('hidden', function () {
    -  // do something…
    -})
    -
    - - - - - - - - - -
    - - - -

    Example

    -

    A basic, easily extended plugin for quickly creating elegant typeaheads with any form text input.

    -
    - -
    -
    <input type="text" data-provide="typeahead">
    -

    You'll want to set autocomplete="off" to prevent default browser menus from appearing over the Bootstrap typeahead dropdown.

    - -
    - - -

    Usage

    - -

    Via data attributes

    -

    Add data attributes to register an element with typeahead functionality as shown in the example above.

    - -

    Via JavaScript

    -

    Call the typeahead manually with:

    -
    $('.typeahead').typeahead()
    - -

    Options

    -

    Options can be passed via data attributes or JavaScript. For data attributes, append the option name to data-, as in data-source="".

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Nametypedefaultdescription
    sourcearray, function[ ]The data source to query against. May be an array of strings or a function. The function is passed two arguments, the query value in the input field and the process callback. The function may be used synchronously by returning the data source directly or asynchronously via the process callback's single argument.
    itemsnumber8The max number of items to display in the dropdown.
    minLengthnumber1The minimum character length needed before triggering autocomplete suggestions
    matcherfunctioncase insensitiveThe method used to determine if a query matches an item. Accepts a single argument, the item against which to test the query. Access the current query with this.query. Return a boolean true if query is a match.
    sorterfunctionexact match,
    case sensitive,
    case insensitive
    Method used to sort autocomplete results. Accepts a single argument items and has the scope of the typeahead instance. Reference the current query with this.query.
    updaterfunctionreturns selected itemThe method used to return selected item. Accepts a single argument, the item and has the scope of the typeahead instance.
    highlighterfunctionhighlights all default matchesMethod used to highlight autocomplete results. Accepts a single argument item and has the scope of the typeahead instance. Should return html.
    - -

    Methods

    -

    .typeahead(options)

    -

    Initializes an input with a typeahead.

    -
    - - - - -
    - - -

    Example

    -

    The subnavigation on the left is a live demo of the affix plugin.

    - -
    - -

    Usage

    - -

    Via data attributes

    -

    To easily add affix behavior to any element, just add data-spy="affix" to the element you want to spy on. Then use offsets to define when to toggle the pinning of an element on and off.

    - -
    <div data-spy="affix" data-offset-top="200">...</div>
    - -
    - Heads up! - You must manage the position of a pinned element and the behavior of its immediate parent. Position is controlled by affix, affix-top, and affix-bottom. Remember to check for a potentially collapsed parent when the affix kicks in as it's removing content from the normal flow of the page. -
    - -

    Via JavaScript

    -

    Call the affix plugin via JavaScript:

    -
    $('#navbar').affix()
    - -

    Options

    -

    Options can be passed via data attributes or JavaScript. For data attributes, append the option name to data-, as in data-offset-top="200".

    - - - - - - - - - - - - - - - - - -
    Nametypedefaultdescription
    offsetnumber | function | object10Pixels to offset from screen when calculating position of scroll. If a single number is provided, the offset will be applied in both top and left directions. To listen for a single direction, or multiple unique offsets, just provide an object offset: { x: 10 }. Use a function when you need to dynamically provide an offset (useful for some responsive designs).
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/scaffolding.html b/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/scaffolding.html deleted file mode 100644 index 8db4fa5eb..000000000 --- a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/scaffolding.html +++ /dev/null @@ -1,627 +0,0 @@ - - - - - Scaffolding · Bootstrap - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -

    Scaffolding

    -

    Bootstrap is built on responsive 12-column grids, layouts, and components.

    -
    -
    - -
    - - -
    - -
    - - - - -
    - - -

    Requires HTML5 doctype

    -

    Bootstrap makes use of certain HTML elements and CSS properties that require the use of the HTML5 doctype. Include it at the beginning of all your projects.

    -
    -<!DOCTYPE html>
    -<html lang="en">
    -  ...
    -</html>
    -
    - -

    Typography and links

    -

    Bootstrap sets basic global display, typography, and link styles. Specifically, we:

    -
      -
    • Remove margin on the body
    • -
    • Set background-color: white; on the body
    • -
    • Use the @baseFontFamily, @baseFontSize, and @baseLineHeight attributes as our typographic base
    • -
    • Set the global link color via @linkColor and apply link underlines only on :hover
    • -
    -

    These styles can be found within scaffolding.less.

    - -

    Reset via Normalize

    -

    With Bootstrap 2, the old reset block has been dropped in favor of Normalize.css, a project by Nicolas Gallagher and Jonathan Neal that also powers the HTML5 Boilerplate. While we use much of Normalize within our reset.less, we have removed some elements specifically for Bootstrap.

    - -
    - - - - - -
    - - -

    Live grid example

    -

    The default Bootstrap grid system utilizes 12 columns, making for a 940px wide container without responsive features enabled. With the responsive CSS file added, the grid adapts to be 724px and 1170px wide depending on your viewport. Below 767px viewports, the columns become fluid and stack vertically.

    -
    -
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    -
    -
    2
    -
    3
    -
    4
    -
    -
    -
    4
    -
    5
    -
    -
    -
    9
    -
    -
    - -

    Basic grid HTML

    -

    For a simple two column layout, create a .row and add the appropriate number of .span* columns. As this is a 12-column grid, each .span* spans a number of those 12 columns, and should always add up to 12 for each row (or the number of columns in the parent).

    -
    -<div class="row">
    -  <div class="span4">...</div>
    -  <div class="span8">...</div>
    -</div>
    -
    -

    Given this example, we have .span4 and .span8, making for 12 total columns and a complete row.

    - -

    Offsetting columns

    -

    Move columns to the right using .offset* classes. Each class increases the left margin of a column by a whole column. For example, .offset4 moves .span4 over four columns.

    -
    -
    -
    4
    -
    3 offset 2
    -
    -
    -
    3 offset 1
    -
    3 offset 2
    -
    -
    -
    6 offset 3
    -
    -
    -
    -<div class="row">
    -  <div class="span4">...</div>
    -  <div class="span3 offset2">...</div>
    -</div>
    -
    - -

    Nesting columns

    -

    To nest your content with the default grid, add a new .row and set of .span* columns within an existing .span* column. Nested rows should include a set of columns that add up to the number of columns of its parent.

    -
    -
    - Level 1 column -
    -
    - Level 2 -
    -
    - Level 2 -
    -
    -
    -
    -
    -<div class="row">
    -  <div class="span9">
    -    Level 1 column
    -    <div class="row">
    -      <div class="span6">Level 2</div>
    -      <div class="span3">Level 2</div>
    -    </div>
    -  </div>
    -</div>
    -
    -
    - - - - -
    - - -

    Live fluid grid example

    -

    The fluid grid system uses percents instead of pixels for column widths. It has the same responsive capabilities as our fixed grid system, ensuring proper proportions for key screen resolutions and devices.

    -
    -
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    -
    -
    4
    -
    4
    -
    4
    -
    -
    -
    4
    -
    8
    -
    -
    -
    6
    -
    6
    -
    -
    -
    12
    -
    -
    - -

    Basic fluid grid HTML

    -

    Make any row "fluid" by changing .row to .row-fluid. The column classes stay the exact same, making it easy to flip between fixed and fluid grids.

    -
    -<div class="row-fluid">
    -  <div class="span4">...</div>
    -  <div class="span8">...</div>
    -</div>
    -
    - -

    Fluid offsetting

    -

    Operates the same way as the fixed grid system offsetting: add .offset* to any column to offset by that many columns.

    -
    -
    -
    4
    -
    4 offset 4
    -
    -
    -
    3 offset 3
    -
    3 offset 3
    -
    -
    -
    6 offset 6
    -
    -
    -
    -<div class="row-fluid">
    -  <div class="span4">...</div>
    -  <div class="span4 offset2">...</div>
    -</div>
    -
    - -

    Fluid nesting

    -

    Fluid grids utilize nesting differently: each nested level of columns should add up to 12 columns. This is because the fluid grid uses percentages, not pixels, for setting widths.

    -
    -
    - Fluid 12 -
    -
    - Fluid 6 -
    -
    - Fluid 6 -
    -
    - Fluid 6 -
    -
    -
    -
    - Fluid 6 -
    -
    -
    -
    -
    -<div class="row-fluid">
    -  <div class="span12">
    -    Fluid 12
    -    <div class="row-fluid">
    -      <div class="span6">
    -        Fluid 6
    -        <div class="row-fluid">
    -          <div class="span6">Fluid 6</div>
    -          <div class="span6">Fluid 6</div>
    -        </div>
    -      </div>
    -      <div class="span6">Fluid 6</div>
    -    </div>
    -  </div>
    -</div>
    -
    - -
    - - - - - -
    - - -

    Fixed layout

    -

    Provides a common fixed-width (and optionally responsive) layout with only <div class="container"> required.

    -
    -
    -
    -
    -<body>
    -  <div class="container">
    -    ...
    -  </div>
    -</body>
    -
    - -

    Fluid layout

    -

    Create a fluid, two-column page with <div class="container-fluid">—great for applications and docs.

    -
    -
    -
    -
    -
    -<div class="container-fluid">
    -  <div class="row-fluid">
    -    <div class="span2">
    -      <!--Sidebar content-->
    -    </div>
    -    <div class="span10">
    -      <!--Body content-->
    -    </div>
    -  </div>
    -</div>
    -
    -
    - - - - - -
    - - -

    Enabling responsive features

    -

    Turn on responsive CSS in your project by including the proper meta tag and additional stylesheet within the <head> of your document. If you've compiled Bootstrap from the Customize page, you need only include the meta tag.

    -
    -<meta name="viewport" content="width=device-width, initial-scale=1.0">
    -<link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
    -
    -

    Heads up! Bootstrap doesn't include responsive features by default at this time as not everything needs to be responsive. Instead of encouraging developers to remove this feature, we figure it best to enable it as needed.

    - -

    About responsive Bootstrap

    - Responsive devices -

    Media queries allow for custom CSS based on a number of conditions—ratios, widths, display type, etc—but usually focuses around min-width and max-width.

    -
      -
    • Modify the width of column in our grid
    • -
    • Stack elements instead of float wherever necessary
    • -
    • Resize headings and text to be more appropriate for devices
    • -
    -

    Use media queries responsibly and only as a start to your mobile audiences. For larger projects, do consider dedicated code bases and not layers of media queries.

    - -

    Supported devices

    -

    Bootstrap supports a handful of media queries in a single file to help make your projects more appropriate on different devices and screen resolutions. Here's what's included:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    LabelLayout widthColumn widthGutter width
    Large display1200px and up70px30px
    Default980px and up60px20px
    Portrait tablets768px and above42px20px
    Phones to tablets767px and belowFluid columns, no fixed widths
    Phones480px and belowFluid columns, no fixed widths
    -
    -/* Large desktop */
    -@media (min-width: 1200px) { ... }
    -
    -/* Portrait tablet to landscape and desktop */
    -@media (min-width: 768px) and (max-width: 979px) { ... }
    -
    -/* Landscape phone to portrait tablet */
    -@media (max-width: 767px) { ... }
    -
    -/* Landscape phones and down */
    -@media (max-width: 480px) { ... }
    -
    - - -

    Responsive utility classes

    -

    For faster mobile-friendly development, use these utility classes for showing and hiding content by device. Below is a table of the available classes and their effect on a given media query layout (labeled by device). They can be found in responsive.less.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ClassPhones 767px and belowTablets 979px to 768pxDesktops Default
    .visible-phoneVisible
    .visible-tabletVisible
    .visible-desktopVisible
    .hidden-phoneVisibleVisible
    .hidden-tabletVisibleVisible
    .hidden-desktopVisibleVisible
    - -

    When to use

    -

    Use on a limited basis and avoid creating entirely different versions of the same site. Instead, use them to complement each device's presentation. Responsive utilities should not be used with tables, and as such are not supported.

    - -

    Responsive utilities test case

    -

    Resize your browser or load on different devices to test the above classes.

    -

    Visible on...

    -

    Green checkmarks indicate that class is visible in your current viewport.

    -
      -
    • Phone✔ Phone
    • -
    • Tablet✔ Tablet
    • -
    • Desktop✔ Desktop
    • -
    -

    Hidden on...

    -

    Here, green checkmarks indicate that class is hidden in your current viewport.

    -
      -
    • Phone✔ Phone
    • -
    • Tablet✔ Tablet
    • -
    • Desktop✔ Desktop
    • -
    - -
    - - - -
    -
    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/layout.mustache b/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/layout.mustache deleted file mode 100644 index 5254fc069..000000000 --- a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/layout.mustache +++ /dev/null @@ -1,151 +0,0 @@ - - - - - {{title}} - - - - - - - - - - - - - - - - - - - - - {{#production}} - - {{/production}} - - - - - - - -{{>body}} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {{#production}} - - - {{/production}} - - - diff --git a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/base-css.mustache b/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/base-css.mustache deleted file mode 100644 index 1f40f3711..000000000 --- a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/base-css.mustache +++ /dev/null @@ -1,2102 +0,0 @@ - -
    -
    -

    {{_i}}Base CSS{{/i}}

    -

    {{_i}}Fundamental HTML elements styled and enhanced with extensible classes.{{/i}}

    -
    -
    - - -
    - - -
    - -
    - - - - -
    - - - {{! Headings }} -

    {{_i}}Headings{{/i}}

    -

    {{_i}}All HTML headings, <h1> through <h6> are available.{{/i}}

    -
    -

    h1. {{_i}}Heading 1{{/i}}

    -

    h2. {{_i}}Heading 2{{/i}}

    -

    h3. {{_i}}Heading 3{{/i}}

    -

    h4. {{_i}}Heading 4{{/i}}

    -
    h5. {{_i}}Heading 5{{/i}}
    -
    h6. {{_i}}Heading 6{{/i}}
    -
    - - {{! Body copy }} -

    {{_i}}Body copy{{/i}}

    -

    {{_i}}Bootstrap's global default font-size is 14px, with a line-height of 20px. This is applied to the <body> and all paragraphs. In addition, <p> (paragraphs) receive a bottom margin of half their line-height (10px by default).{{/i}}

    -
    -

    Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam id dolor id nibh ultricies vehicula.

    -

    Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec ullamcorper nulla non metus auctor fringilla. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla.

    -

    Maecenas sed diam eget risus varius blandit sit amet non magna. Donec id elit non mi porta gravida at eget metus. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

    -
    -
    <p>...</p>
    - - {{! Body copy .lead }} -

    {{_i}}Lead body copy{{/i}}

    -

    {{_i}}Make a paragraph stand out by adding .lead.{{/i}}

    -
    -

    Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Duis mollis, est non commodo luctus.

    -
    -
    <p class="lead">...</p>
    - - {{! Using LESS }} -

    {{_i}}Built with Less{{/i}}

    -

    {{_i}}The typographic scale is based on two LESS variables in variables.less: @baseFontSize and @baseLineHeight. The first is the base font-size used throughout and the second is the base line-height. We use those variables and some simple math to create the margins, paddings, and line-heights of all our type and more. Customize them and Bootstrap adapts.{{/i}}

    - - -
    - - - {{! Emphasis }} -

    {{_i}}Emphasis{{/i}}

    -

    {{_i}}Make use of HTML's default emphasis tags with lightweight styles.{{/i}}

    - -

    <small>

    -

    {{_i}}For de-emphasizing inline or blocks of text, use the small tag.{{/i}}

    -
    -

    This line of text is meant to be treated as fine print.

    -
    -
    -<p>
    -  <small>This line of text is meant to be treated as fine print.</small>
    -</p>
    -
    - -

    {{_i}}Bold{{/i}}

    -

    {{_i}}For emphasizing a snippet of text with a heavier font-weight.{{/i}}

    -
    -

    The following snippet of text is rendered as bold text.

    -
    -
    <strong>rendered as bold text</strong>
    - -

    {{_i}}Italics{{/i}}

    -

    {{_i}}For emphasizing a snippet of text with italics.{{/i}}

    -
    -

    The following snippet of text is rendered as italicized text.

    -
    -
    <em>rendered as italicized text</em>
    - -

    {{_i}}Heads up!{{/i}} {{_i}}Feel free to use <b> and <i> in HTML5. <b> is meant to highlight words or phrases without conveying additional importance while <i> is mostly for voice, technical terms, etc.{{/i}}

    - -

    {{_i}}Alignment classes{{/i}}

    -

    {{_i}}Easily realign text to components with text alignment classes.{{/i}}

    -
    -

    Left aligned text.

    -

    Center aligned text.

    -

    Right aligned text.

    -
    -
    -<p class="text-left">Left aligned text.</p>
    -<p class="text-center">Center aligned text.</p>
    -<p class="text-right">Right aligned text.</p>
    -
    - -

    {{_i}}Emphasis classes{{/i}}

    -

    {{_i}}Convey meaning through color with a handful of emphasis utility classes.{{/i}}

    -
    -

    Fusce dapibus, tellus ac cursus commodo, tortor mauris nibh.

    -

    Etiam porta sem malesuada magna mollis euismod.

    -

    Donec ullamcorper nulla non metus auctor fringilla.

    -

    Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis.

    -

    Duis mollis, est non commodo luctus, nisi erat porttitor ligula.

    -
    -
    -<p class="muted">Fusce dapibus, tellus ac cursus commodo, tortor mauris nibh.</p>
    -<p class="text-warning">Etiam porta sem malesuada magna mollis euismod.</p>
    -<p class="text-error">Donec ullamcorper nulla non metus auctor fringilla.</p>
    -<p class="text-info">Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis.</p>
    -<p class="text-success">Duis mollis, est non commodo luctus, nisi erat porttitor ligula.</p>
    -
    - - -
    - - - {{! Abbreviations }} -

    {{_i}}Abbreviations{{/i}}

    -

    {{_i}}Stylized implementation of HTML's <abbr> element for abbreviations and acronyms to show the expanded version on hover. Abbreviations with a title attribute have a light dotted bottom border and a help cursor on hover, providing additional context on hover.{{/i}}

    - -

    <abbr>

    -

    {{_i}}For expanded text on long hover of an abbreviation, include the title attribute.{{/i}}

    -
    -

    {{_i}}An abbreviation of the word attribute is attr.{{/i}}

    -
    -
    <abbr title="attribute">attr</abbr>
    - -

    <abbr class="initialism">

    -

    {{_i}}Add .initialism to an abbreviation for a slightly smaller font-size.{{/i}}

    -
    -

    {{_i}}HTML is the best thing since sliced bread.{{/i}}

    -
    -
    <abbr title="HyperText Markup Language" class="initialism">HTML</abbr>
    - - -
    - - - {{! Addresses }} -

    {{_i}}Addresses{{/i}}

    -

    {{_i}}Present contact information for the nearest ancestor or the entire body of work.{{/i}}

    - -

    <address>

    -

    {{_i}}Preserve formatting by ending all lines with <br>.{{/i}}

    -
    -
    - Twitter, Inc.
    - 795 Folsom Ave, Suite 600
    - San Francisco, CA 94107
    - P: (123) 456-7890 -
    -
    - {{_i}}Full Name{{/i}}
    - {{_i}}first.last@example.com{{/i}} -
    -
    -
    -<address>
    -  <strong>Twitter, Inc.</strong><br>
    -  795 Folsom Ave, Suite 600<br>
    -  San Francisco, CA 94107<br>
    -  <abbr title="Phone">P:</abbr> (123) 456-7890
    -</address>
    -
    -<address>
    -  <strong>{{_i}}Full Name{{/i}}</strong><br>
    -  <a href="mailto:#">{{_i}}first.last@example.com{{/i}}</a>
    -</address>
    -
    - - -
    - - - {{! Blockquotes }} -

    {{_i}}Blockquotes{{/i}}

    -

    {{_i}}For quoting blocks of content from another source within your document.{{/i}}

    - -

    {{_i}}Default blockquote{{/i}}

    -

    {{_i}}Wrap <blockquote> around any HTML as the quote. For straight quotes we recommend a <p>.{{/i}}

    -
    -
    -

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.

    -
    -
    -
    -<blockquote>
    -  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.</p>
    -</blockquote>
    -
    - -

    {{_i}}Blockquote options{{/i}}

    -

    {{_i}}Style and content changes for simple variations on a standard blockquote.{{/i}}

    - -

    {{_i}}Naming a source{{/i}}

    -

    {{_i}}Add <small> tag for identifying the source. Wrap the name of the source work in <cite>.{{/i}}

    -
    -
    -

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.

    - {{_i}}Someone famous in Source Title{{/i}} -
    -
    -
    -<blockquote>
    -  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.</p>
    -  <small>{{_i}}Someone famous <cite title="Source Title">Source Title</cite>{{/i}}</small>
    -</blockquote>
    -
    - -

    {{_i}}Alternate displays{{/i}}

    -

    {{_i}}Use .pull-right for a floated, right-aligned blockquote.{{/i}}

    -
    -
    -

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.

    - {{_i}}Someone famous in Source Title{{/i}} -
    -
    -
    -<blockquote class="pull-right">
    -  ...
    -</blockquote>
    -
    - - -
    - - - -

    {{_i}}Lists{{/i}}

    - -

    {{_i}}Unordered{{/i}}

    -

    {{_i}}A list of items in which the order does not explicitly matter.{{/i}}

    -
    -
      -
    • Lorem ipsum dolor sit amet
    • -
    • Consectetur adipiscing elit
    • -
    • Integer molestie lorem at massa
    • -
    • Facilisis in pretium nisl aliquet
    • -
    • Nulla volutpat aliquam velit -
        -
      • Phasellus iaculis neque
      • -
      • Purus sodales ultricies
      • -
      • Vestibulum laoreet porttitor sem
      • -
      • Ac tristique libero volutpat at
      • -
      -
    • -
    • Faucibus porta lacus fringilla vel
    • -
    • Aenean sit amet erat nunc
    • -
    • Eget porttitor lorem
    • -
    -
    -
    -<ul>
    -  <li>...</li>
    -</ul>
    -
    - -

    {{_i}}Ordered{{/i}}

    -

    {{_i}}A list of items in which the order does explicitly matter.{{/i}}

    -
    -
      -
    1. Lorem ipsum dolor sit amet
    2. -
    3. Consectetur adipiscing elit
    4. -
    5. Integer molestie lorem at massa
    6. -
    7. Facilisis in pretium nisl aliquet
    8. -
    9. Nulla volutpat aliquam velit
    10. -
    11. Faucibus porta lacus fringilla vel
    12. -
    13. Aenean sit amet erat nunc
    14. -
    15. Eget porttitor lorem
    16. -
    -
    -
    -<ol>
    -  <li>...</li>
    -</ol>
    -
    - -

    {{_i}}Unstyled{{/i}}

    -

    {{_i}}Remove the default list-style and left padding on list items (immediate children only).{{/i}}

    -
    -
      -
    • Lorem ipsum dolor sit amet
    • -
    • Consectetur adipiscing elit
    • -
    • Integer molestie lorem at massa
    • -
    • Facilisis in pretium nisl aliquet
    • -
    • Nulla volutpat aliquam velit -
        -
      • Phasellus iaculis neque
      • -
      • Purus sodales ultricies
      • -
      • Vestibulum laoreet porttitor sem
      • -
      • Ac tristique libero volutpat at
      • -
      -
    • -
    • Faucibus porta lacus fringilla vel
    • -
    • Aenean sit amet erat nunc
    • -
    • Eget porttitor lorem
    • -
    -
    -
    -<ul class="unstyled">
    -  <li>...</li>
    -</ul>
    -
    - -

    {{_i}}Inline{{/i}}

    -

    {{_i}}Place all list items on a single line with inline-block and some light padding.{{/i}}

    -
    -
      -
    • Lorem ipsum
    • -
    • Phasellus iaculis
    • -
    • Nulla volutpat
    • -
    -
    -
    -<ul class="inline">
    -  <li>...</li>
    -</ul>
    -
    - -

    {{_i}}Description{{/i}}

    -

    {{_i}}A list of terms with their associated descriptions.{{/i}}

    -
    -
    -
    {{_i}}Description lists{{/i}}
    -
    {{_i}}A description list is perfect for defining terms.{{/i}}
    -
    Euismod
    -
    Vestibulum id ligula porta felis euismod semper eget lacinia odio sem nec elit.
    -
    Donec id elit non mi porta gravida at eget metus.
    -
    Malesuada porta
    -
    Etiam porta sem malesuada magna mollis euismod.
    -
    -
    -
    -<dl>
    -  <dt>...</dt>
    -  <dd>...</dd>
    -</dl>
    -
    - -

    {{_i}}Horizontal description{{/i}}

    -

    {{_i}}Make terms and descriptions in <dl> line up side-by-side.{{/i}}

    -
    -
    -
    {{_i}}Description lists{{/i}}
    -
    {{_i}}A description list is perfect for defining terms.{{/i}}
    -
    Euismod
    -
    Vestibulum id ligula porta felis euismod semper eget lacinia odio sem nec elit.
    -
    Donec id elit non mi porta gravida at eget metus.
    -
    Malesuada porta
    -
    Etiam porta sem malesuada magna mollis euismod.
    -
    Felis euismod semper eget lacinia
    -
    Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.
    -
    -
    -
    -<dl class="dl-horizontal">
    -  <dt>...</dt>
    -  <dd>...</dd>
    -</dl>
    -
    -

    - {{_i}}Heads up!{{/i}} - {{_i}}Horizontal description lists will truncate terms that are too long to fit in the left column fix text-overflow. In narrower viewports, they will change to the default stacked layout.{{/i}} -

    -
    - - - - -
    - - -

    Inline

    -

    Wrap inline snippets of code with <code>.

    -
    - For example, <section> should be wrapped as inline. -
    -
    -{{_i}}For example, <code>&lt;section&gt;</code> should be wrapped as inline.{{/i}}
    -
    - -

    Basic block

    -

    {{_i}}Use <pre> for multiple lines of code. Be sure to escape any angle brackets in the code for proper rendering.{{/i}}

    -
    -
    <p>{{_i}}Sample text here...{{/i}}</p>
    -
    -
    -<pre>
    -  &lt;p&gt;{{_i}}Sample text here...{{/i}}&lt;/p&gt;
    -</pre>
    -
    -

    {{_i}}Heads up!{{/i}} {{_i}}Be sure to keep code within <pre> tags as close to the left as possible; it will render all tabs.{{/i}}

    -

    {{_i}}You may optionally add the .pre-scrollable class which will set a max-height of 350px and provide a y-axis scrollbar.{{/i}}

    -
    - - - - -
    - - -

    {{_i}}Default styles{{/i}}

    -

    {{_i}}For basic styling—light padding and only horizontal dividers—add the base class .table to any <table>.{{/i}}

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #{{_i}}First Name{{/i}}{{_i}}Last Name{{/i}}{{_i}}Username{{/i}}
    1MarkOtto@mdo
    2JacobThornton@fat
    3Larrythe Bird@twitter
    -
    {{! /example }} -
    -<table class="table">
    -  …
    -</table>
    -
    - - -
    - - -

    {{_i}}Optional classes{{/i}}

    -

    {{_i}}Add any of the following classes to the .table base class.{{/i}}

    - -

    {{_i}}.table-striped{{/i}}

    -

    {{_i}}Adds zebra-striping to any table row within the <tbody> via the :nth-child CSS selector (not available in IE7-8).{{/i}}

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #{{_i}}First Name{{/i}}{{_i}}Last Name{{/i}}{{_i}}Username{{/i}}
    1MarkOtto@mdo
    2JacobThornton@fat
    3Larrythe Bird@twitter
    -
    {{! /example }} -
    -<table class="table table-striped">
    -  …
    -</table>
    -
    - -

    {{_i}}.table-bordered{{/i}}

    -

    {{_i}}Add borders and rounded corners to the table.{{/i}}

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #{{_i}}First Name{{/i}}{{_i}}Last Name{{/i}}{{_i}}Username{{/i}}
    1MarkOtto@mdo
    MarkOtto@TwBootstrap
    2JacobThornton@fat
    3Larry the Bird@twitter
    -
    {{! /example }} -
    -<table class="table table-bordered">
    -  …
    -</table>
    -
    - -

    {{_i}}.table-hover{{/i}}

    -

    {{_i}}Enable a hover state on table rows within a <tbody>.{{/i}}

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #{{_i}}First Name{{/i}}{{_i}}Last Name{{/i}}{{_i}}Username{{/i}}
    1MarkOtto@mdo
    2JacobThornton@fat
    3Larry the Bird@twitter
    -
    {{! /example }} -
    -<table class="table table-hover">
    -  …
    -</table>
    -
    - -

    {{_i}}.table-condensed{{/i}}

    -

    {{_i}}Makes tables more compact by cutting cell padding in half.{{/i}}

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #{{_i}}First Name{{/i}}{{_i}}Last Name{{/i}}{{_i}}Username{{/i}}
    1MarkOtto@mdo
    2JacobThornton@fat
    3Larry the Bird@twitter
    -
    {{! /example }} -
    -<table class="table table-condensed">
    -  …
    -</table>
    -
    - - -
    - - -

    {{_i}}Optional row classes{{/i}}

    -

    {{_i}}Use contextual classes to color table rows.{{/i}}

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{_i}}Class{{/i}}{{_i}}Description{{/i}}
    - .success - {{_i}}Indicates a successful or positive action.{{/i}}
    - .error - {{_i}}Indicates a dangerous or potentially negative action.{{/i}}
    - .warning - {{_i}}Indicates a warning that might need attention.{{/i}}
    - .info - {{_i}}Used as an alternative to the default styles.{{/i}}
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #{{_i}}Product{{/i}}{{_i}}Payment Taken{{/i}}{{_i}}Status{{/i}}
    1TB - Monthly01/04/2012Approved
    2TB - Monthly02/04/2012Declined
    3TB - Monthly03/04/2012Pending
    4TB - Monthly04/04/2012Call in to confirm
    -
    {{! /example }} -
    -...
    -  <tr class="success">
    -    <td>1</td>
    -    <td>TB - Monthly</td>
    -    <td>01/04/2012</td>
    -    <td>Approved</td>
    -  </tr>
    -...
    -
    - - -
    - - -

    {{_i}}Supported table markup{{/i}}

    -

    {{_i}}List of supported table HTML elements and how they should be used.{{/i}}

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{_i}}Tag{{/i}}{{_i}}Description{{/i}}
    - <table> - - {{_i}}Wrapping element for displaying data in a tabular format{{/i}} -
    - <thead> - - {{_i}}Container element for table header rows (<tr>) to label table columns{{/i}} -
    - <tbody> - - {{_i}}Container element for table rows (<tr>) in the body of the table{{/i}} -
    - <tr> - - {{_i}}Container element for a set of table cells (<td> or <th>) that appears on a single row{{/i}} -
    - <td> - - {{_i}}Default table cell{{/i}} -
    - <th> - - {{_i}}Special table cell for column (or row, depending on scope and placement) labels{{/i}} -
    - <caption> - - {{_i}}Description or summary of what the table holds, especially useful for screen readers{{/i}} -
    -
    -<table>
    -  <caption>...</caption>
    -  <thead>
    -    <tr>
    -      <th>...</th>
    -      <th>...</th>
    -    </tr>
    -  </thead>
    -  <tbody>
    -    <tr>
    -      <td>...</td>
    -      <td>...</td>
    -    </tr>
    -  </tbody>
    -</table>
    -
    - -
    - - - - -
    - - -

    {{_i}}Default styles{{/i}}

    -

    {{_i}}Individual form controls receive styling, but without any required base class on the <form> or large changes in markup. Results in stacked, left-aligned labels on top of form controls.{{/i}}

    -
    -
    - Legend - - - {{_i}}Example block-level help text here.{{/i}} - - -
    -
    {{! /example }} -
    -<form>
    -  <fieldset>
    -    <legend>{{_i}}Legend{{/i}}</legend>
    -    <label>{{_i}}Label name{{/i}}</label>
    -    <input type="text" placeholder="{{_i}}Type something…{{/i}}">
    -    <span class="help-block">Example block-level help text here.</span>
    -    <label class="checkbox">
    -      <input type="checkbox"> {{_i}}Check me out{{/i}}
    -    </label>
    -    <button type="submit" class="btn">{{_i}}Submit{{/i}}</button>
    -  </fieldset>
    -</form>
    -
    - - -
    - - -

    {{_i}}Optional layouts{{/i}}

    -

    {{_i}}Included with Bootstrap are three optional form layouts for common use cases.{{/i}}

    - -

    {{_i}}Search form{{/i}}

    -

    {{_i}}Add .form-search to the form and .search-query to the <input> for an extra-rounded text input.{{/i}}

    - {{! /example }} -
    -<form class="form-search">
    -  <input type="text" class="input-medium search-query">
    -  <button type="submit" class="btn">{{_i}}Search{{/i}}</button>
    -</form>
    -
    - -

    {{_i}}Inline form{{/i}}

    -

    {{_i}}Add .form-inline for left-aligned labels and inline-block controls for a compact layout.{{/i}}

    -
    - - - - -
    {{! /example }} -
    -<form class="form-inline">
    -  <input type="text" class="input-small" placeholder="{{_i}}Email{{/i}}">
    -  <input type="password" class="input-small" placeholder="{{_i}}Password{{/i}}">
    -  <label class="checkbox">
    -    <input type="checkbox"> {{_i}}Remember me{{/i}}
    -  </label>
    -  <button type="submit" class="btn">{{_i}}Sign in{{/i}}</button>
    -</form>
    -
    - -

    {{_i}}Horizontal form{{/i}}

    -

    {{_i}}Right align labels and float them to the left to make them appear on the same line as controls. Requires the most markup changes from a default form:{{/i}}

    -
      -
    • {{_i}}Add .form-horizontal to the form{{/i}}
    • -
    • {{_i}}Wrap labels and controls in .control-group{{/i}}
    • -
    • {{_i}}Add .control-label to the label{{/i}}
    • -
    • {{_i}}Wrap any associated controls in .controls for proper alignment{{/i}}
    • -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    -
    - - -
    -
    -
    -
    -<form class="form-horizontal">
    -  <div class="control-group">
    -    <label class="control-label" for="inputEmail">{{_i}}Email{{/i}}</label>
    -    <div class="controls">
    -      <input type="text" id="inputEmail" placeholder="{{_i}}Email{{/i}}">
    -    </div>
    -  </div>
    -  <div class="control-group">
    -    <label class="control-label" for="inputPassword">{{_i}}Password{{/i}}</label>
    -    <div class="controls">
    -      <input type="password" id="inputPassword" placeholder="{{_i}}Password{{/i}}">
    -    </div>
    -  </div>
    -  <div class="control-group">
    -    <div class="controls">
    -      <label class="checkbox">
    -        <input type="checkbox"> {{_i}}Remember me{{/i}}
    -      </label>
    -      <button type="submit" class="btn">{{_i}}Sign in{{/i}}</button>
    -    </div>
    -  </div>
    -</form>
    -
    - - -
    - - -

    {{_i}}Supported form controls{{/i}}

    -

    {{_i}}Examples of standard form controls supported in an example form layout.{{/i}}

    - -

    {{_i}}Inputs{{/i}}

    -

    {{_i}}Most common form control, text-based input fields. Includes support for all HTML5 types: text, password, datetime, datetime-local, date, month, time, week, number, email, url, search, tel, and color.{{/i}}

    -

    {{_i}}Requires the use of a specified type at all times.{{/i}}

    -
    - -
    -
    -<input type="text" placeholder="Text input">
    -
    - -

    {{_i}}Textarea{{/i}}

    -

    {{_i}}Form control which supports multiple lines of text. Change rows attribute as necessary.{{/i}}

    -
    - -
    -
    -<textarea rows="3"></textarea>
    -
    - -

    {{_i}}Checkboxes and radios{{/i}}

    -

    {{_i}}Checkboxes are for selecting one or several options in a list while radios are for selecting one option from many.{{/i}}

    -

    {{_i}}Default (stacked){{/i}}

    -
    - -
    - - -
    -
    -<label class="checkbox">
    -  <input type="checkbox" value="">
    -  {{_i}}Option one is this and that—be sure to include why it's great{{/i}}
    -</label>
    -
    -<label class="radio">
    -  <input type="radio" name="optionsRadios" id="optionsRadios1" value="option1" checked>
    -  {{_i}}Option one is this and that—be sure to include why it's great{{/i}}
    -</label>
    -<label class="radio">
    -  <input type="radio" name="optionsRadios" id="optionsRadios2" value="option2">
    -  {{_i}}Option two can be something else and selecting it will deselect option one{{/i}}
    -</label>
    -
    - -

    {{_i}}Inline checkboxes{{/i}}

    -

    {{_i}}Add the .inline class to a series of checkboxes or radios for controls appear on the same line.{{/i}}

    -
    - - - -
    -
    -<label class="checkbox inline">
    -  <input type="checkbox" id="inlineCheckbox1" value="option1"> 1
    -</label>
    -<label class="checkbox inline">
    -  <input type="checkbox" id="inlineCheckbox2" value="option2"> 2
    -</label>
    -<label class="checkbox inline">
    -  <input type="checkbox" id="inlineCheckbox3" value="option3"> 3
    -</label>
    -
    - -

    {{_i}}Selects{{/i}}

    -

    {{_i}}Use the default option or specify a multiple="multiple" to show multiple options at once.{{/i}}

    -
    - -
    - -
    -
    -<select>
    -  <option>1</option>
    -  <option>2</option>
    -  <option>3</option>
    -  <option>4</option>
    -  <option>5</option>
    -</select>
    -
    -<select multiple="multiple">
    -  <option>1</option>
    -  <option>2</option>
    -  <option>3</option>
    -  <option>4</option>
    -  <option>5</option>
    -</select>
    -
    - - -
    - - -

    {{_i}}Extending form controls{{/i}}

    -

    {{_i}}Adding on top of existing browser controls, Bootstrap includes other useful form components.{{/i}}

    - -

    {{_i}}Prepended and appended inputs{{/i}}

    -

    {{_i}}Add text or buttons before or after any text-based input. Do note that select elements are not supported here.{{/i}}

    - -

    {{_i}}Default options{{/i}}

    -

    {{_i}}Wrap an .add-on and an input with one of two classes to prepend or append text to an input.{{/i}}

    -
    -
    - @ - -
    -
    -
    - - .00 -
    -
    -
    -<div class="input-prepend">
    -  <span class="add-on">@</span>
    -  <input class="span2" id="prependedInput" type="text" placeholder="{{_i}}Username{{/i}}">
    -</div>
    -<div class="input-append">
    -  <input class="span2" id="appendedInput" type="text">
    -  <span class="add-on">.00</span>
    -</div>
    -
    - -

    {{_i}}Combined{{/i}}

    -

    {{_i}}Use both classes and two instances of .add-on to prepend and append an input.{{/i}}

    -
    -
    - $ - - .00 -
    -
    -
    -<div class="input-prepend input-append">
    -  <span class="add-on">$</span>
    -  <input class="span2" id="appendedPrependedInput" type="text">
    -  <span class="add-on">.00</span>
    -</div>
    -
    - -

    {{_i}}Buttons instead of text{{/i}}

    -

    {{_i}}Instead of a <span> with text, use a .btn to attach a button (or two) to an input.{{/i}}

    -
    -
    - - -
    -
    -
    -<div class="input-append">
    -  <input class="span2" id="appendedInputButton" type="text">
    -  <button class="btn" type="button">Go!</button>
    -</div>
    -
    -
    -
    - - - -
    -
    -
    -<div class="input-append">
    -  <input class="span2" id="appendedInputButtons" type="text">
    -  <button class="btn" type="button">Search</button>
    -  <button class="btn" type="button">Options</button>
    -</div>
    -
    - -

    {{_i}}Button dropdowns{{/i}}

    -

    {{_i}}{{/i}}

    -
    - -
    -
    -<div class="input-append">
    -  <input class="span2" id="appendedDropdownButton" type="text">
    -  <div class="btn-group">
    -    <button class="btn dropdown-toggle" data-toggle="dropdown">
    -      {{_i}}Action{{/i}}
    -      <span class="caret"></span>
    -    </button>
    -    <ul class="dropdown-menu">
    -      ...
    -    </ul>
    -  </div>
    -</div>
    -
    - -
    - -
    -
    -<div class="input-prepend">
    -  <div class="btn-group">
    -    <button class="btn dropdown-toggle" data-toggle="dropdown">
    -      {{_i}}Action{{/i}}
    -      <span class="caret"></span>
    -    </button>
    -    <ul class="dropdown-menu">
    -      ...
    -    </ul>
    -  </div>
    -  <input class="span2" id="prependedDropdownButton" type="text">
    -</div>
    -
    - -
    - -
    -
    -<div class="input-prepend input-append">
    -  <div class="btn-group">
    -    <button class="btn dropdown-toggle" data-toggle="dropdown">
    -      {{_i}}Action{{/i}}
    -      <span class="caret"></span>
    -    </button>
    -    <ul class="dropdown-menu">
    -      ...
    -    </ul>
    -  </div>
    -  <input class="span2" id="appendedPrependedDropdownButton" type="text">
    -  <div class="btn-group">
    -    <button class="btn dropdown-toggle" data-toggle="dropdown">
    -      {{_i}}Action{{/i}}
    -      <span class="caret"></span>
    -    </button>
    -    <ul class="dropdown-menu">
    -      ...
    -    </ul>
    -  </div>
    -</div>
    -
    - -

    {{_i}}Segmented dropdown groups{{/i}}

    -
    - - -
    -
    -<form>
    -  <div class="input-prepend">
    -    <div class="btn-group">...</div>
    -    <input type="text">
    -  </div>
    -  <div class="input-append">
    -    <input type="text">
    -    <div class="btn-group">...</div>
    -  </div>
    -</form>
    -
    - -

    {{_i}}Search form{{/i}}

    - {{! /example }} -
    -<form class="form-search">
    -  <div class="input-append">
    -    <input type="text" class="span2 search-query">
    -    <button type="submit" class="btn">{{_i}}Search{{/i}}</button>
    -  </div>
    -  <div class="input-prepend">
    -    <button type="submit" class="btn">{{_i}}Search{{/i}}</button>
    -    <input type="text" class="span2 search-query">
    -  </div>
    -</form>
    -
    - -

    {{_i}}Control sizing{{/i}}

    -

    {{_i}}Use relative sizing classes like .input-large or match your inputs to the grid column sizes using .span* classes.{{/i}}

    - -

    {{_i}}Block level inputs{{/i}}

    -

    {{_i}}Make any <input> or <textarea> element behave like a block level element.{{/i}}

    -
    -
    - -
    -
    -
    -<input class="input-block-level" type="text" placeholder=".input-block-level">
    -
    - -

    {{_i}}Relative sizing{{/i}}

    -
    -
    - - - - - - -
    -
    -
    -<input class="input-mini" type="text" placeholder=".input-mini">
    -<input class="input-small" type="text" placeholder=".input-small">
    -<input class="input-medium" type="text" placeholder=".input-medium">
    -<input class="input-large" type="text" placeholder=".input-large">
    -<input class="input-xlarge" type="text" placeholder=".input-xlarge">
    -<input class="input-xxlarge" type="text" placeholder=".input-xxlarge">
    -
    -

    - {{_i}}Heads up!{{/i}} In future versions, we'll be altering the use of these relative input classes to match our button sizes. For example, .input-large will increase the padding and font-size of an input. -

    - -

    {{_i}}Grid sizing{{/i}}

    -

    {{_i}}Use .span1 to .span12 for inputs that match the same sizes of the grid columns.{{/i}}

    -
    -
    - - - - - - -
    -
    -
    -<input class="span1" type="text" placeholder=".span1">
    -<input class="span2" type="text" placeholder=".span2">
    -<input class="span3" type="text" placeholder=".span3">
    -<select class="span1">
    -  ...
    -</select>
    -<select class="span2">
    -  ...
    -</select>
    -<select class="span3">
    -  ...
    -</select>
    -
    - -

    {{_i}}For multiple grid inputs per line, use the .controls-row modifier class for proper spacing. It floats the inputs to collapse white-space, sets the proper margins, and clears the float.{{/i}}

    -
    -
    - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    -
    -<div class="controls">
    -  <input class="span5" type="text" placeholder=".span5">
    -</div>
    -<div class="controls controls-row">
    -  <input class="span4" type="text" placeholder=".span4">
    -  <input class="span1" type="text" placeholder=".span1">
    -</div>
    -...
    -
    - -

    {{_i}}Uneditable inputs{{/i}}

    -

    {{_i}}Present data in a form that's not editable without using actual form markup.{{/i}}

    -
    - Some value here -
    -
    -<span class="input-xlarge uneditable-input">Some value here</span>
    -
    - -

    {{_i}}Form actions{{/i}}

    -

    {{_i}}End a form with a group of actions (buttons). When placed within a .form-actions, the buttons will automatically indent to line up with the form controls.{{/i}}

    -
    -
    - - -
    -
    -
    -<div class="form-actions">
    -  <button type="submit" class="btn btn-primary">{{_i}}Save changes{{/i}}</button>
    -  <button type="button" class="btn">{{_i}}Cancel{{/i}}</button>
    -</div>
    -
    - -

    {{_i}}Help text{{/i}}

    -

    {{_i}}Inline and block level support for help text that appears around form controls.{{/i}}

    -

    {{_i}}Inline help{{/i}}

    -
    - Inline help text -
    -
    -<input type="text"><span class="help-inline">Inline help text</span>
    -
    - -

    {{_i}}Block help{{/i}}

    -
    - - A longer block of help text that breaks onto a new line and may extend beyond one line. -
    -
    -<input type="text"><span class="help-block">A longer block of help text that breaks onto a new line and may extend beyond one line.</span>
    -
    - - -
    - - -

    {{_i}}Form control states{{/i}}

    -

    {{_i}}Provide feedback to users or visitors with basic feedback states on form controls and labels.{{/i}}

    - -

    {{_i}}Input focus{{/i}}

    -

    {{_i}}We remove the default outline styles on some form controls and apply a box-shadow in its place for :focus.{{/i}}

    -
    - -
    -
    -<input class="input-xlarge" id="focusedInput" type="text" value="{{_i}}This is focused...{{/i}}">
    -
    - -

    {{_i}}Invalid inputs{{/i}}

    -

    {{_i}}Style inputs via default browser functionality with :invalid. Specify a type, add the required attribute if the field is not optional, and (if applicable) specify a pattern.{{/i}}

    -

    {{_i}}This is not available in versions of Internet Explorer 7-9 due to lack of support for CSS pseudo selectors.{{/i}}

    -
    - -
    -
    -<input class="span3" type="email" required>
    -
    - -

    {{_i}}Disabled inputs{{/i}}

    -

    {{_i}}Add the disabled attribute on an input to prevent user input and trigger a slightly different look.{{/i}}

    -
    - -
    -
    -<input class="input-xlarge" id="disabledInput" type="text" placeholder="{{_i}}Disabled input here...{{/i}}" disabled>
    -
    - -

    {{_i}}Validation states{{/i}}

    -

    {{_i}}Bootstrap includes validation styles for error, warning, info, and success messages. To use, add the appropriate class to the surrounding .control-group.{{/i}}

    - -
    -
    - -
    - - {{_i}}Something may have gone wrong{{/i}} -
    -
    -
    - -
    - - {{_i}}Please correct the error{{/i}} -
    -
    -
    - -
    - - {{_i}}Username is taken{{/i}} -
    -
    -
    - -
    - - {{_i}}Woohoo!{{/i}} -
    -
    -
    -
    -<div class="control-group warning">
    -  <label class="control-label" for="inputWarning">{{_i}}Input with warning{{/i}}</label>
    -  <div class="controls">
    -    <input type="text" id="inputWarning">
    -    <span class="help-inline">{{_i}}Something may have gone wrong{{/i}}</span>
    -  </div>
    -</div>
    -
    -<div class="control-group error">
    -  <label class="control-label" for="inputError">{{_i}}Input with error{{/i}}</label>
    -  <div class="controls">
    -    <input type="text" id="inputError">
    -    <span class="help-inline">{{_i}}Please correct the error{{/i}}</span>
    -  </div>
    -</div>
    -
    -<div class="control-group info">
    -  <label class="control-label" for="inputInfo">{{_i}}Input with info{{/i}}</label>
    -  <div class="controls">
    -    <input type="text" id="inputInfo">
    -    <span class="help-inline">{{_i}}Username is already taken{{/i}}</span>
    -  </div>
    -</div>
    -
    -<div class="control-group success">
    -  <label class="control-label" for="inputSuccess">{{_i}}Input with success{{/i}}</label>
    -  <div class="controls">
    -    <input type="text" id="inputSuccess">
    -    <span class="help-inline">{{_i}}Woohoo!{{/i}}</span>
    -  </div>
    -</div>
    -
    - -
    - - - - -
    - - -

    Default buttons

    -

    {{_i}}Button styles can be applied to anything with the .btn class applied. However, typically you'll want to apply these to only <a> and <button> elements for the best rendering.{{/i}}

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{_i}}Button{{/i}}{{_i}}class=""{{/i}}{{_i}}Description{{/i}}
    btn{{_i}}Standard gray button with gradient{{/i}}
    btn btn-primary{{_i}}Provides extra visual weight and identifies the primary action in a set of buttons{{/i}}
    btn btn-info{{_i}}Used as an alternative to the default styles{{/i}}
    btn btn-success{{_i}}Indicates a successful or positive action{{/i}}
    btn btn-warning{{_i}}Indicates caution should be taken with this action{{/i}}
    btn btn-danger{{_i}}Indicates a dangerous or potentially negative action{{/i}}
    btn btn-inverse{{_i}}Alternate dark gray button, not tied to a semantic action or use{{/i}}
    btn btn-link{{_i}}Deemphasize a button by making it look like a link while maintaining button behavior{{/i}}
    - -

    {{_i}}Cross browser compatibility{{/i}}

    -

    {{_i}}IE9 doesn't crop background gradients on rounded corners, so we remove it. Related, IE9 jankifies disabled button elements, rendering text gray with a nasty text-shadow that we cannot fix.{{/i}}

    - - -

    {{_i}}Button sizes{{/i}}

    -

    {{_i}}Fancy larger or smaller buttons? Add .btn-large, .btn-small, or .btn-mini for additional sizes.{{/i}}

    -
    -

    - - -

    -

    - - -

    -

    - - -

    -

    - - -

    -
    -
    -<p>
    -  <button class="btn btn-large btn-primary" type="button">{{_i}}Large button{{/i}}</button>
    -  <button class="btn btn-large" type="button">{{_i}}Large button{{/i}}</button>
    -</p>
    -<p>
    -  <button class="btn btn-primary" type="button">{{_i}}Default button{{/i}}</button>
    -  <button class="btn" type="button">{{_i}}Default button{{/i}}</button>
    -</p>
    -<p>
    -  <button class="btn btn-small btn-primary" type="button">{{_i}}Small button{{/i}}</button>
    -  <button class="btn btn-small" type="button">{{_i}}Small button{{/i}}</button>
    -</p>
    -<p>
    -  <button class="btn btn-mini btn-primary" type="button">{{_i}}Mini button{{/i}}</button>
    -  <button class="btn btn-mini" type="button">{{_i}}Mini button{{/i}}</button>
    -</p>
    -
    -

    {{_i}}Create block level buttons—those that span the full width of a parent— by adding .btn-block.{{/i}}

    -
    -
    - - -
    -
    -
    -<button class="btn btn-large btn-block btn-primary" type="button">{{_i}}Block level button{{/i}}</button>
    -<button class="btn btn-large btn-block" type="button">{{_i}}Block level button{{/i}}</button>
    -
    - - -

    {{_i}}Disabled state{{/i}}

    -

    {{_i}}Make buttons look unclickable by fading them back 50%.{{/i}}

    - -

    Anchor element

    -

    {{_i}}Add the .disabled class to <a> buttons.{{/i}}

    -

    - {{_i}}Primary link{{/i}} - {{_i}}Link{{/i}} -

    -
    -<a href="#" class="btn btn-large btn-primary disabled">{{_i}}Primary link{{/i}}</a>
    -<a href="#" class="btn btn-large disabled">{{_i}}Link{{/i}}</a>
    -
    -

    - {{_i}}Heads up!{{/i}} - {{_i}}We use .disabled as a utility class here, similar to the common .active class, so no prefix is required. Also, this class is only for aesthetic; you must use custom JavaScript to disable links here.{{/i}} -

    - -

    Button element

    -

    {{_i}}Add the disabled attribute to <button> buttons.{{/i}}

    -

    - - -

    -
    -<button type="button" class="btn btn-large btn-primary disabled" disabled="disabled">{{_i}}Primary button{{/i}}</button>
    -<button type="button" class="btn btn-large" disabled>{{_i}}Button{{/i}}</button>
    -
    - - -

    {{_i}}One class, multiple tags{{/i}}

    -

    {{_i}}Use the .btn class on an <a>, <button>, or <input> element.{{/i}}

    -
    - {{_i}}Link{{/i}} - - - -
    -
    -<a class="btn" href="">{{_i}}Link{{/i}}</a>
    -<button class="btn" type="submit">{{_i}}Button{{/i}}</button>
    -<input class="btn" type="button" value="{{_i}}Input{{/i}}">
    -<input class="btn" type="submit" value="{{_i}}Submit{{/i}}">
    -
    -

    {{_i}}As a best practice, try to match the element for your context to ensure matching cross-browser rendering. If you have an input, use an <input type="submit"> for your button.{{/i}}

    - -
    - - - - -
    - - -

    {{_i}}Add classes to an <img> element to easily style images in any project.{{/i}}

    -
    - - - -
    -
    -<img src="..." class="img-rounded">
    -<img src="..." class="img-circle">
    -<img src="..." class="img-polaroid">
    -
    -

    {{_i}}Heads up!{{/i}} {{_i}}.img-rounded and .img-circle do not work in IE7-8 due to lack of border-radius support.{{/i}}

    - - -
    - - - - -
    - - -

    {{_i}}Icon glyphs{{/i}}

    -

    {{_i}}140 icons in sprite form, available in dark gray (default) and white, provided by Glyphicons.{{/i}}

    -
      -
    • icon-glass
    • -
    • icon-music
    • -
    • icon-search
    • -
    • icon-envelope
    • -
    • icon-heart
    • -
    • icon-star
    • -
    • icon-star-empty
    • -
    • icon-user
    • -
    • icon-film
    • -
    • icon-th-large
    • -
    • icon-th
    • -
    • icon-th-list
    • -
    • icon-ok
    • -
    • icon-remove
    • -
    • icon-zoom-in
    • -
    • icon-zoom-out
    • -
    • icon-off
    • -
    • icon-signal
    • -
    • icon-cog
    • -
    • icon-trash
    • -
    • icon-home
    • -
    • icon-file
    • -
    • icon-time
    • -
    • icon-road
    • -
    • icon-download-alt
    • -
    • icon-download
    • -
    • icon-upload
    • -
    • icon-inbox
    • - -
    • icon-play-circle
    • -
    • icon-repeat
    • -
    • icon-refresh
    • -
    • icon-list-alt
    • -
    • icon-lock
    • -
    • icon-flag
    • -
    • icon-headphones
    • -
    • icon-volume-off
    • -
    • icon-volume-down
    • -
    • icon-volume-up
    • -
    • icon-qrcode
    • -
    • icon-barcode
    • -
    • icon-tag
    • -
    • icon-tags
    • -
    • icon-book
    • -
    • icon-bookmark
    • -
    • icon-print
    • -
    • icon-camera
    • -
    • icon-font
    • -
    • icon-bold
    • -
    • icon-italic
    • -
    • icon-text-height
    • -
    • icon-text-width
    • -
    • icon-align-left
    • -
    • icon-align-center
    • -
    • icon-align-right
    • -
    • icon-align-justify
    • -
    • icon-list
    • - -
    • icon-indent-left
    • -
    • icon-indent-right
    • -
    • icon-facetime-video
    • -
    • icon-picture
    • -
    • icon-pencil
    • -
    • icon-map-marker
    • -
    • icon-adjust
    • -
    • icon-tint
    • -
    • icon-edit
    • -
    • icon-share
    • -
    • icon-check
    • -
    • icon-move
    • -
    • icon-step-backward
    • -
    • icon-fast-backward
    • -
    • icon-backward
    • -
    • icon-play
    • -
    • icon-pause
    • -
    • icon-stop
    • -
    • icon-forward
    • -
    • icon-fast-forward
    • -
    • icon-step-forward
    • -
    • icon-eject
    • -
    • icon-chevron-left
    • -
    • icon-chevron-right
    • -
    • icon-plus-sign
    • -
    • icon-minus-sign
    • -
    • icon-remove-sign
    • -
    • icon-ok-sign
    • - -
    • icon-question-sign
    • -
    • icon-info-sign
    • -
    • icon-screenshot
    • -
    • icon-remove-circle
    • -
    • icon-ok-circle
    • -
    • icon-ban-circle
    • -
    • icon-arrow-left
    • -
    • icon-arrow-right
    • -
    • icon-arrow-up
    • -
    • icon-arrow-down
    • -
    • icon-share-alt
    • -
    • icon-resize-full
    • -
    • icon-resize-small
    • -
    • icon-plus
    • -
    • icon-minus
    • -
    • icon-asterisk
    • -
    • icon-exclamation-sign
    • -
    • icon-gift
    • -
    • icon-leaf
    • -
    • icon-fire
    • -
    • icon-eye-open
    • -
    • icon-eye-close
    • -
    • icon-warning-sign
    • -
    • icon-plane
    • -
    • icon-calendar
    • -
    • icon-random
    • -
    • icon-comment
    • -
    • icon-magnet
    • - -
    • icon-chevron-up
    • -
    • icon-chevron-down
    • -
    • icon-retweet
    • -
    • icon-shopping-cart
    • -
    • icon-folder-close
    • -
    • icon-folder-open
    • -
    • icon-resize-vertical
    • -
    • icon-resize-horizontal
    • -
    • icon-hdd
    • -
    • icon-bullhorn
    • -
    • icon-bell
    • -
    • icon-certificate
    • -
    • icon-thumbs-up
    • -
    • icon-thumbs-down
    • -
    • icon-hand-right
    • -
    • icon-hand-left
    • -
    • icon-hand-up
    • -
    • icon-hand-down
    • -
    • icon-circle-arrow-right
    • -
    • icon-circle-arrow-left
    • -
    • icon-circle-arrow-up
    • -
    • icon-circle-arrow-down
    • -
    • icon-globe
    • -
    • icon-wrench
    • -
    • icon-tasks
    • -
    • icon-filter
    • -
    • icon-briefcase
    • -
    • icon-fullscreen
    • -
    - -

    Glyphicons attribution

    -

    {{_i}}Glyphicons Halflings are normally not available for free, but an arrangement between Bootstrap and the Glyphicons creators have made this possible at no cost to you as developers. As a thank you, we ask you to include an optional link back to Glyphicons whenever practical.{{/i}}

    - - -
    - - -

    {{_i}}How to use{{/i}}

    -

    {{_i}}All icons require an <i> tag with a unique class, prefixed with icon-. To use, place the following code just about anywhere:{{/i}}

    -
    -<i class="icon-search"></i>
    -
    -

    {{_i}}There are also styles available for inverted (white) icons, made ready with one extra class. We will specifically enforce this class on hover and active states for nav and dropdown links.{{/i}}

    -
    -<i class="icon-search icon-white"></i>
    -
    -

    - {{_i}}Heads up!{{/i}} - {{_i}}When using beside strings of text, as in buttons or nav links, be sure to leave a space after the <i> tag for proper spacing.{{/i}} -

    - - -
    - - -

    {{_i}}Icon examples{{/i}}

    -

    {{_i}}Use them in buttons, button groups for a toolbar, navigation, or prepended form inputs.{{/i}}

    - -

    {{_i}}Buttons{{/i}}

    - -
    {{_i}}Button group in a button toolbar{{/i}}
    -
    -
    -
    - - - - -
    -
    -
    {{! /bs-docs-example }} -
    -<div class="btn-toolbar">
    -  <div class="btn-group">
    -    <a class="btn" href="#"><i class="icon-align-left"></i></a>
    -    <a class="btn" href="#"><i class="icon-align-center"></i></a>
    -    <a class="btn" href="#"><i class="icon-align-right"></i></a>
    -    <a class="btn" href="#"><i class="icon-align-justify"></i></a>
    -  </div>
    -</div>
    -
    - -
    {{_i}}Dropdown in a button group{{/i}}
    - {{! /bs-docs-example }} -
    -<div class="btn-group">
    -  <a class="btn btn-primary" href="#"><i class="icon-user icon-white"></i> {{_i}}User{{/i}}</a>
    -  <a class="btn btn-primary dropdown-toggle" data-toggle="dropdown" href="#"><span class="caret"></span></a>
    -  <ul class="dropdown-menu">
    -    <li><a href="#"><i class="icon-pencil"></i> {{_i}}Edit{{/i}}</a></li>
    -    <li><a href="#"><i class="icon-trash"></i> {{_i}}Delete{{/i}}</a></li>
    -    <li><a href="#"><i class="icon-ban-circle"></i> {{_i}}Ban{{/i}}</a></li>
    -    <li class="divider"></li>
    -    <li><a href="#"><i class="i"></i> {{_i}}Make admin{{/i}}</a></li>
    -  </ul>
    -</div>
    -
    - -
    {{_i}}Button sizes{{/i}}
    - {{! /bs-docs-example }} -
    -<a class="btn btn-large" href="#"><i class="icon-star"></i> Star</a>
    -<a class="btn btn-small" href="#"><i class="icon-star"></i> Star</a>
    -<a class="btn btn-mini" href="#"><i class="icon-star"></i> Star</a>
    -
    - -

    {{_i}}Navigation{{/i}}

    - {{! /bs-docs-example }} -
    -<ul class="nav nav-list">
    -  <li class="active"><a href="#"><i class="icon-home icon-white"></i> {{_i}}Home{{/i}}</a></li>
    -  <li><a href="#"><i class="icon-book"></i> {{_i}}Library{{/i}}</a></li>
    -  <li><a href="#"><i class="icon-pencil"></i> {{_i}}Applications{{/i}}</a></li>
    -  <li><a href="#"><i class="i"></i> {{_i}}Misc{{/i}}</a></li>
    -</ul>
    -
    - -

    {{_i}}Form fields{{/i}}

    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    -<div class="control-group">
    -  <label class="control-label" for="inputIcon">{{_i}}Email address{{/i}}</label>
    -  <div class="controls">
    -    <div class="input-prepend">
    -      <span class="add-on"><i class="icon-envelope"></i></span>
    -      <input class="span2" id="inputIcon" type="text">
    -    </div>
    -  </div>
    -</div>
    -
    - -
    - - - -
    {{! /span9 }} -
    {{! row}} - -
    {{! /.container }} diff --git a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/components.mustache b/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/components.mustache deleted file mode 100644 index 6d3ff9bee..000000000 --- a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/components.mustache +++ /dev/null @@ -1,2505 +0,0 @@ - -
    -
    -

    {{_i}}Components{{/i}}

    -

    {{_i}}Dozens of reusable components built to provide navigation, alerts, popovers, and more.{{/i}}

    -
    -
    - - -
    - - -
    - -
    - - - - - - - - - - -
    - - -

    {{_i}}Examples{{/i}}

    -

    {{_i}}Two basic options, along with two more specific variations.{{/i}}

    - -

    {{_i}}Single button group{{/i}}

    -

    {{_i}}Wrap a series of buttons with .btn in .btn-group.{{/i}}

    -
    -
    - - - -
    -
    -
    -<div class="btn-group">
    -  <button class="btn">Left</button>
    -  <button class="btn">Middle</button>
    -  <button class="btn">Right</button>
    -</div>
    -
    - -

    {{_i}}Multiple button groups{{/i}}

    -

    {{_i}}Combine sets of <div class="btn-group"> into a <div class="btn-toolbar"> for more complex components.{{/i}}

    -
    -
    -
    - - - - -
    -
    - - - -
    -
    - -
    -
    -
    -
    -<div class="btn-toolbar">
    -  <div class="btn-group">
    -    ...
    -  </div>
    -</div>
    -
    - -

    {{_i}}Vertical button groups{{/i}}

    -

    {{_i}}Make a set of buttons appear vertically stacked rather than horizontally.{{/i}}

    -
    -
    - - - - -
    -
    -
    -<div class="btn-group btn-group-vertical">
    -  ...
    -</div>
    -
    - - -
    - - -

    {{_i}}Checkbox and radio flavors{{/i}}

    -

    {{_i}}Button groups can also function as radios, where only one button may be active, or checkboxes, where any number of buttons may be active. View the JavaScript docs for that.{{/i}}

    - -

    {{_i}}Dropdowns in button groups{{/i}}

    -

    {{_i}}Heads up!{{/i}} {{_i}}Buttons with dropdowns must be individually wrapped in their own .btn-group within a .btn-toolbar for proper rendering.{{/i}}

    -
    - - - - -
    - - - -

    {{_i}}Overview and examples{{/i}}

    -

    {{_i}}Use any button to trigger a dropdown menu by placing it within a .btn-group and providing the proper menu markup.{{/i}}

    - {{! /example }} -
    -<div class="btn-group">
    -  <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
    -    {{_i}}Action{{/i}}
    -    <span class="caret"></span>
    -  </a>
    -  <ul class="dropdown-menu">
    -    <!-- {{_i}}dropdown menu links{{/i}} -->
    -  </ul>
    -</div>
    -
    - -

    {{_i}}Works with all button sizes{{/i}}

    -

    {{_i}}Button dropdowns work at any size: .btn-large, .btn-small, or .btn-mini.{{/i}}

    - {{! /example }} - -

    {{_i}}Requires JavaScript{{/i}}

    -

    {{_i}}Button dropdowns require the Bootstrap dropdown plugin to function.{{/i}}

    -

    {{_i}}In some cases—like mobile—dropdown menus will extend outside the viewport. You need to resolve the alignment manually or with custom JavaScript.{{/i}}

    - - -
    - - -

    {{_i}}Split button dropdowns{{/i}}

    -

    {{_i}}Building on the button group styles and markup, we can easily create a split button. Split buttons feature a standard action on the left and a dropdown toggle on the right with contextual links.{{/i}}

    - {{! /example }} -
    -<div class="btn-group">
    -  <button class="btn">{{_i}}Action{{/i}}</button>
    -  <button class="btn dropdown-toggle" data-toggle="dropdown">
    -    <span class="caret"></span>
    -  </button>
    -  <ul class="dropdown-menu">
    -    <!-- {{_i}}dropdown menu links{{/i}} -->
    -  </ul>
    -</div>
    -
    - -

    {{_i}}Sizes{{/i}}

    -

    {{_i}}Utilize the extra button classes .btn-mini, .btn-small, or .btn-large for sizing.{{/i}}

    - {{! /example }} -
    -<div class="btn-group">
    -  <button class="btn btn-mini">{{_i}}Action{{/i}}</button>
    -  <button class="btn btn-mini dropdown-toggle" data-toggle="dropdown">
    -    <span class="caret"></span>
    -  </button>
    -  <ul class="dropdown-menu">
    -    <!-- {{_i}}dropdown menu links{{/i}} -->
    -  </ul>
    -</div>
    -
    - -

    {{_i}}Dropup menus{{/i}}

    -

    {{_i}}Dropdown menus can also be toggled from the bottom up by adding a single class to the immediate parent of .dropdown-menu. It will flip the direction of the .caret and reposition the menu itself to move from the bottom up instead of top down.{{/i}}

    - {{! /example }} -
    -<div class="btn-group dropup">
    -  <button class="btn">{{_i}}Dropup{{/i}}</button>
    -  <button class="btn dropdown-toggle" data-toggle="dropdown">
    -    <span class="caret"></span>
    -  </button>
    -  <ul class="dropdown-menu">
    -    <!-- {{_i}}dropdown menu links{{/i}} -->
    -  </ul>
    -</div>
    -
    - -
    - - - - - - - - - - - - - - - - - - - -
    - - -

    {{_i}}Standard pagination{{/i}}

    -

    {{_i}}Simple pagination inspired by Rdio, great for apps and search results. The large block is hard to miss, easily scalable, and provides large click areas.{{/i}}

    -
    - -
    -
    -<div class="pagination">
    -  <ul>
    -    <li><a href="#">Prev</a></li>
    -    <li><a href="#">1</a></li>
    -    <li><a href="#">2</a></li>
    -    <li><a href="#">3</a></li>
    -    <li><a href="#">4</a></li>
    -    <li><a href="#">5</a></li>
    -    <li><a href="#">Next</a></li>
    -  </ul>
    -</div>
    -
    - - -
    - - -

    {{_i}}Options{{/i}}

    - -

    {{_i}}Disabled and active states{{/i}}

    -

    {{_i}}Links are customizable for different circumstances. Use .disabled for unclickable links and .active to indicate the current page.{{/i}}

    -
    - -
    -
    -<div class="pagination">
    -  <ul>
    -    <li class="disabled"><a href="#">&laquo;</a></li>
    -    <li class="active"><a href="#">1</a></li>
    -    ...
    -  </ul>
    -</div>
    -
    -

    {{_i}}You can optionally swap out active or disabled anchors for spans to remove click functionality while retaining intended styles.{{/i}}

    -
    -<div class="pagination">
    -  <ul>
    -    <li class="disabled"><span>&laquo;</span></li>
    -    <li class="active"><span>1</span></li>
    -    ...
    -  </ul>
    -</div>
    -
    - -

    {{_i}}Sizes{{/i}}

    -

    {{_i}}Fancy larger or smaller pagination? Add .pagination-large, .pagination-small, or .pagination-mini for additional sizes.{{/i}}

    -
    - - - - -
    -
    -<div class="pagination pagination-large">
    -  <ul>
    -    ...
    -  </ul>
    -</div>
    -<div class="pagination">
    -  <ul>
    -    ...
    -  </ul>
    -</div>
    -<div class="pagination pagination-small">
    -  <ul>
    -    ...
    -  </ul>
    -</div>
    -<div class="pagination pagination-mini">
    -  <ul>
    -    ...
    -  </ul>
    -</div>
    -
    - -

    {{_i}}Alignment{{/i}}

    -

    {{_i}}Add one of two optional classes to change the alignment of pagination links: .pagination-centered and .pagination-right.{{/i}}

    -
    - -
    -
    -<div class="pagination pagination-centered">
    -  ...
    -</div>
    -
    -
    - -
    -
    -<div class="pagination pagination-right">
    -  ...
    -</div>
    -
    - - -
    - - -

    {{_i}}Pager{{/i}}

    -

    {{_i}}Quick previous and next links for simple pagination implementations with light markup and styles. It's great for simple sites like blogs or magazines.{{/i}}

    - -

    {{_i}}Default example{{/i}}

    -

    {{_i}}By default, the pager centers links.{{/i}}

    - -
    -<ul class="pager">
    -  <li><a href="#">{{_i}}Previous{{/i}}</a></li>
    -  <li><a href="#">{{_i}}Next{{/i}}</a></li>
    -</ul>
    -
    - -

    {{_i}}Aligned links{{/i}}

    -

    {{_i}}Alternatively, you can align each link to the sides:{{/i}}

    - -
    -<ul class="pager">
    -  <li class="previous">
    -    <a href="#">{{_i}}&larr; Older{{/i}}</a>
    -  </li>
    -  <li class="next">
    -    <a href="#">{{_i}}Newer &rarr;{{/i}}</a>
    -  </li>
    -</ul>
    -
    - -

    {{_i}}Optional disabled state{{/i}}

    -

    {{_i}}Pager links also use the general .disabled utility class from the pagination.{{/i}}

    - -
    -<ul class="pager">
    -  <li class="previous disabled">
    -    <a href="#">{{_i}}&larr; Older{{/i}}</a>
    -  </li>
    -  ...
    -</ul>
    -
    - -
    - - - - -
    - -

    {{_i}}Labels{{/i}}

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{_i}}Labels{{/i}}{{_i}}Markup{{/i}}
    - {{_i}}Default{{/i}} - - <span class="label">{{_i}}Default{{/i}}</span> -
    - {{_i}}Success{{/i}} - - <span class="label label-success">{{_i}}Success{{/i}}</span> -
    - {{_i}}Warning{{/i}} - - <span class="label label-warning">{{_i}}Warning{{/i}}</span> -
    - {{_i}}Important{{/i}} - - <span class="label label-important">{{_i}}Important{{/i}}</span> -
    - {{_i}}Info{{/i}} - - <span class="label label-info">{{_i}}Info{{/i}}</span> -
    - {{_i}}Inverse{{/i}} - - <span class="label label-inverse">{{_i}}Inverse{{/i}}</span> -
    - -

    {{_i}}Badges{{/i}}

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{_i}}Name{{/i}}{{_i}}Example{{/i}}{{_i}}Markup{{/i}}
    - {{_i}}Default{{/i}} - - 1 - - <span class="badge">1</span> -
    - {{_i}}Success{{/i}} - - 2 - - <span class="badge badge-success">2</span> -
    - {{_i}}Warning{{/i}} - - 4 - - <span class="badge badge-warning">4</span> -
    - {{_i}}Important{{/i}} - - 6 - - <span class="badge badge-important">6</span> -
    - {{_i}}Info{{/i}} - - 8 - - <span class="badge badge-info">8</span> -
    - {{_i}}Inverse{{/i}} - - 10 - - <span class="badge badge-inverse">10</span> -
    - -

    {{_i}}Easily collapsible{{/i}}

    -

    {{_i}}For easy implementation, labels and badges will simply collapse (via CSS's :empty selector) when no content exists within.{{/i}}

    - -
    - - - - -
    - - -

    {{_i}}Hero unit{{/i}}

    -

    {{_i}}A lightweight, flexible component to showcase key content on your site. It works well on marketing and content-heavy sites.{{/i}}

    -
    -
    -

    {{_i}}Hello, world!{{/i}}

    -

    {{_i}}This is a simple hero unit, a simple jumbotron-style component for calling extra attention to featured content or information.{{/i}}

    -

    {{_i}}Learn more{{/i}}

    -
    -
    -
    -<div class="hero-unit">
    -  <h1>{{_i}}Heading{{/i}}</h1>
    -  <p>{{_i}}Tagline{{/i}}</p>
    -  <p>
    -    <a class="btn btn-primary btn-large">
    -      {{_i}}Learn more{{/i}}
    -    </a>
    -  </p>
    -</div>
    -
    - -

    {{_i}}Page header{{/i}}

    -

    {{_i}}A simple shell for an h1 to appropriately space out and segment sections of content on a page. It can utilize the h1's default small, element as well most other components (with additional styles).{{/i}}

    -
    - -
    -
    -<div class="page-header">
    -  <h1>{{_i}}Example page header{{/i}} <small>{{_i}}Subtext for header{{/i}}</small></h1>
    -</div>
    -
    - -
    - - - - -
    - - -

    {{_i}}Default thumbnails{{/i}}

    -

    {{_i}}By default, Bootstrap's thumbnails are designed to showcase linked images with minimal required markup.{{/i}}

    -
    - -
    - -

    {{_i}}Highly customizable{{/i}}

    -

    {{_i}}With a bit of extra markup, it's possible to add any kind of HTML content like headings, paragraphs, or buttons into thumbnails.{{/i}}

    -
    -
      -
    • -
      - -
      -

      {{_i}}Thumbnail label{{/i}}

      -

      Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

      -

      {{_i}}Action{{/i}} {{_i}}Action{{/i}}

      -
      -
      -
    • -
    • -
      - -
      -

      {{_i}}Thumbnail label{{/i}}

      -

      Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

      -

      {{_i}}Action{{/i}} {{_i}}Action{{/i}}

      -
      -
      -
    • -
    • -
      - -
      -

      {{_i}}Thumbnail label{{/i}}

      -

      Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

      -

      {{_i}}Action{{/i}} {{_i}}Action{{/i}}

      -
      -
      -
    • -
    -
    - -

    {{_i}}Why use thumbnails{{/i}}

    -

    {{_i}}Thumbnails (previously .media-grid up until v1.4) are great for grids of photos or videos, image search results, retail products, portfolios, and much more. They can be links or static content.{{/i}}

    - -

    {{_i}}Simple, flexible markup{{/i}}

    -

    {{_i}}Thumbnail markup is simple—a ul with any number of li elements is all that is required. It's also super flexible, allowing for any type of content with just a bit more markup to wrap your contents.{{/i}}

    - -

    {{_i}}Uses grid column sizes{{/i}}

    -

    {{_i}}Lastly, the thumbnails component uses existing grid system classes—like .span2 or .span3—for control of thumbnail dimensions.{{/i}}

    - -

    {{_i}}Markup{{/i}}

    -

    {{_i}}As mentioned previously, the required markup for thumbnails is light and straightforward. Here's a look at the default setup for linked images:{{/i}}

    -
    -<ul class="thumbnails">
    -  <li class="span4">
    -    <a href="#" class="thumbnail">
    -      <img data-src="holder.js/300x200" alt="">
    -    </a>
    -  </li>
    -  ...
    -</ul>
    -
    -

    {{_i}}For custom HTML content in thumbnails, the markup changes slightly. To allow block level content anywhere, we swap the <a> for a <div> like so:{{/i}}

    -
    -<ul class="thumbnails">
    -  <li class="span4">
    -    <div class="thumbnail">
    -      <img data-src="holder.js/300x200" alt="">
    -      <h3>{{_i}}Thumbnail label{{/i}}</h3>
    -      <p>{{_i}}Thumbnail caption...{{/i}}</p>
    -    </div>
    -  </li>
    -  ...
    -</ul>
    -
    - -

    {{_i}}More examples{{/i}}

    -

    {{_i}}Explore all your options with the various grid classes available to you. You can also mix and match different sizes.{{/i}}

    - - -
    - - - - - -
    - - -

    {{_i}}Default alert{{/i}}

    -

    {{_i}}Wrap any text and an optional dismiss button in .alert for a basic warning alert message.{{/i}}

    -
    -
    - - {{_i}}Warning!{{/i}} {{_i}}Best check yo self, you're not looking too good.{{/i}} -
    -
    -
    -<div class="alert">
    -  <button type="button" class="close" data-dismiss="alert">&times;</button>
    -  <strong>{{_i}}Warning!{{/i}}</strong> {{_i}}Best check yo self, you're not looking too good.{{/i}}
    -</div>
    -
    - -

    {{_i}}Dismiss buttons{{/i}}

    -

    {{_i}}Mobile Safari and Mobile Opera browsers, in addition to the data-dismiss="alert" attribute, require an href="#" for the dismissal of alerts when using an <a> tag.{{/i}}

    -
    <a href="#" class="close" data-dismiss="alert">&times;</a>
    -

    {{_i}}Alternatively, you may use a <button> element with the data attribute, which we have opted to do for our docs. When using <button>, you must include type="button" or your forms may not submit.{{/i}}

    -
    <button type="button" class="close" data-dismiss="alert">&times;</button>
    - -

    {{_i}}Dismiss alerts via JavaScript{{/i}}

    -

    {{_i}}Use the alerts jQuery plugin for quick and easy dismissal of alerts.{{/i}}

    - - -
    - - -

    {{_i}}Options{{/i}}

    -

    {{_i}}For longer messages, increase the padding on the top and bottom of the alert wrapper by adding .alert-block.{{/i}}

    -
    -
    - -

    {{_i}}Warning!{{/i}}

    -

    {{_i}}Best check yo self, you're not looking too good.{{/i}} Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

    -
    -
    -
    -<div class="alert alert-block">
    -  <button type="button" class="close" data-dismiss="alert">&times;</button>
    -  <h4>{{_i}}Warning!{{/i}}</h4>
    -  {{_i}}Best check yo self, you're not...{{/i}}
    -</div>
    -
    - - -
    - - -

    {{_i}}Contextual alternatives{{/i}}

    -

    {{_i}}Add optional classes to change an alert's connotation.{{/i}}

    - -

    {{_i}}Error or danger{{/i}}

    -
    -
    - - {{_i}}Oh snap!{{/i}} {{_i}}Change a few things up and try submitting again.{{/i}} -
    -
    -
    -<div class="alert alert-error">
    -  ...
    -</div>
    -
    - -

    {{_i}}Success{{/i}}

    -
    -
    - - {{_i}}Well done!{{/i}} {{_i}}You successfully read this important alert message.{{/i}} -
    -
    -
    -<div class="alert alert-success">
    -  ...
    -</div>
    -
    - -

    {{_i}}Information{{/i}}

    -
    -
    - - {{_i}}Heads up!{{/i}} {{_i}}This alert needs your attention, but it's not super important.{{/i}} -
    -
    -
    -<div class="alert alert-info">
    -  ...
    -</div>
    -
    - -
    - - - - - -
    - - -

    {{_i}}Examples and markup{{/i}}

    - -

    {{_i}}Basic{{/i}}

    -

    {{_i}}Default progress bar with a vertical gradient.{{/i}}

    -
    -
    -
    -
    -
    -
    -<div class="progress">
    -  <div class="bar" style="width: 60%;"></div>
    -</div>
    -
    - -

    {{_i}}Striped{{/i}}

    -

    {{_i}}Uses a gradient to create a striped effect. Not available in IE7-8.{{/i}}

    -
    -
    -
    -
    -
    -
    -<div class="progress progress-striped">
    -  <div class="bar" style="width: 20%;"></div>
    -</div>
    -
    - -

    {{_i}}Animated{{/i}}

    -

    {{_i}}Add .active to .progress-striped to animate the stripes right to left. Not available in all versions of IE.{{/i}}

    -
    -
    -
    -
    -
    -
    -<div class="progress progress-striped active">
    -  <div class="bar" style="width: 40%;"></div>
    -</div>
    -
    - -

    Stacked

    -

    Place multiple bars into the same .progress to stack them.

    -
    -
    -
    -
    -
    -
    -
    -
    -<div class="progress">
    -  <div class="bar bar-success" style="width: 35%;"></div>
    -  <div class="bar bar-warning" style="width: 20%;"></div>
    -  <div class="bar bar-danger" style="width: 10%;"></div>
    -</div>
    -
    - - -
    - - -

    {{_i}}Options{{/i}}

    - -

    {{_i}}Additional colors{{/i}}

    -

    {{_i}}Progress bars use some of the same button and alert classes for consistent styles.{{/i}}

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -<div class="progress progress-info">
    -  <div class="bar" style="width: 20%"></div>
    -</div>
    -<div class="progress progress-success">
    -  <div class="bar" style="width: 40%"></div>
    -</div>
    -<div class="progress progress-warning">
    -  <div class="bar" style="width: 60%"></div>
    -</div>
    -<div class="progress progress-danger">
    -  <div class="bar" style="width: 80%"></div>
    -</div>
    -
    - -

    {{_i}}Striped bars{{/i}}

    -

    {{_i}}Similar to the solid colors, we have varied striped progress bars.{{/i}}

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -<div class="progress progress-info progress-striped">
    -  <div class="bar" style="width: 20%"></div>
    -</div>
    -<div class="progress progress-success progress-striped">
    -  <div class="bar" style="width: 40%"></div>
    -</div>
    -<div class="progress progress-warning progress-striped">
    -  <div class="bar" style="width: 60%"></div>
    -</div>
    -<div class="progress progress-danger progress-striped">
    -  <div class="bar" style="width: 80%"></div>
    -</div>
    -
    - - -
    - - -

    {{_i}}Browser support{{/i}}

    -

    {{_i}}Progress bars use CSS3 gradients, transitions, and animations to achieve all their effects. These features are not supported in IE7-9 or older versions of Firefox.{{/i}}

    -

    {{_i}}Versions earlier than Internet Explorer 10 and Opera 12 do not support animations.{{/i}}

    - -
    - - - - - -
    - -

    {{_i}}Abstract object styles for building various types of components (like blog comments, Tweets, etc) that feature a left- or right-aligned image alongside textual content.{{/i}}

    - -

    {{_i}}Default example{{/i}}

    -

    {{_i}}The default media allow to float a media object (images, video, audio) to the left or right of a content block.{{/i}}

    -
    -
    - - - -
    -

    {{_i}}Media heading{{/i}}

    - Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. Fusce condimentum nunc ac nisi vulputate fringilla. Donec lacinia congue felis in faucibus. -
    -
    -
    - - - -
    -

    {{_i}}Media heading{{/i}}

    - Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. Fusce condimentum nunc ac nisi vulputate fringilla. Donec lacinia congue felis in faucibus. -
    - - - -
    -

    {{_i}}Media heading{{/i}}

    - Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. Fusce condimentum nunc ac nisi vulputate fringilla. Donec lacinia congue felis in faucibus. -
    -
    -
    -
    -
    {{! /.bs-docs-example }} -
    -<div class="media">
    -  <a class="pull-left" href="#">
    -    <img class="media-object" data-src="holder.js/64x64">
    -  </a>
    -  <div class="media-body">
    -    <h4 class="media-heading">{{_i}}Media heading{{/i}}</h4>
    -    ...
    -
    -    <!-- Nested media object -->
    -    <div class="media">
    -      ...
    -    </div>
    -  </div>
    -</div>
    -
    - - -
    - - -

    {{_i}}Media list{{/i}}

    -

    {{_i}}With a bit of extra markup, you can use media inside list (useful for comment threads or articles lists).{{/i}}

    -
    -
      -
    • - - - -
      -

      {{_i}}Media heading{{/i}}

      -

      Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis.

      - -
      - - - -
      -

      {{_i}}Nested media heading{{/i}}

      - Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. - -
      - - - -
      -

      {{_i}}Nested media heading{{/i}}

      - Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. -
      -
      -
      -
      - -
      - - - -
      -

      {{_i}}Nested media heading{{/i}}

      - Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. -
      -
      -
      -
    • -
    • - - - -
      -

      {{_i}}Media heading{{/i}}

      - Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. -
      -
    • -
    -
    -
    -<ul class="media-list">
    -  <li class="media">
    -    <a class="pull-left" href="#">
    -      <img class="media-object" data-src="holder.js/64x64">
    -    </a>
    -    <div class="media-body">
    -      <h4 class="media-heading">{{_i}}Media heading{{/i}}</h4>
    -      ...
    -
    -      <!-- Nested media object -->
    -      <div class="media">
    -        ...
    -     </div>
    -    </div>
    -  </li>
    -</ul>
    -
    - -
    - - - - - - -
    - - -

    {{_i}}Wells{{/i}}

    -

    {{_i}}Use the well as a simple effect on an element to give it an inset effect.{{/i}}

    -
    -
    - {{_i}}Look, I'm in a well!{{/i}} -
    -
    -
    -<div class="well">
    -  ...
    -</div>
    -
    -

    {{_i}}Optional classes{{/i}}

    -

    {{_i}}Control padding and rounded corners with two optional modifier classes.{{/i}}

    -
    -
    - {{_i}}Look, I'm in a well!{{/i}} -
    -
    -
    -<div class="well well-large">
    -  ...
    -</div>
    -
    -
    -
    - {{_i}}Look, I'm in a well!{{/i}} -
    -
    -
    -<div class="well well-small">
    -  ...
    -</div>
    -
    - -

    {{_i}}Close icon{{/i}}

    -

    {{_i}}Use the generic close icon for dismissing content like modals and alerts.{{/i}}

    -
    -

    -
    -
    <button class="close">&times;</button>
    -

    {{_i}}iOS devices require an href="#" for click events if you would rather use an anchor.{{/i}}

    -
    <a class="close" href="#">&times;</a>
    - -

    {{_i}}Helper classes{{/i}}

    -

    {{_i}}Simple, focused classes for small display or behavior tweaks.{{/i}}

    - -

    {{_i}}.pull-left{{/i}}

    -

    {{_i}}Float an element left{{/i}}

    -
    -class="pull-left"
    -
    -
    -.pull-left {
    -  float: left;
    -}
    -
    - -

    {{_i}}.pull-right{{/i}}

    -

    {{_i}}Float an element right{{/i}}

    -
    -class="pull-right"
    -
    -
    -.pull-right {
    -  float: right;
    -}
    -
    - -

    {{_i}}.muted{{/i}}

    -

    {{_i}}Change an element's color to #999{{/i}}

    -
    -class="muted"
    -
    -
    -.muted {
    -  color: #999;
    -}
    -
    - -

    {{_i}}.clearfix{{/i}}

    -

    {{_i}}Clear the float on any element{{/i}}

    -
    -class="clearfix"
    -
    -
    -.clearfix {
    -  *zoom: 1;
    -  &:before,
    -  &:after {
    -    display: table;
    -    content: "";
    -  }
    -  &:after {
    -    clear: both;
    -  }
    -}
    -
    - -
    - - - -
    {{! /span9 }} -
    {{! row}} - -
    {{! /.container }} diff --git a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/customize.mustache b/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/customize.mustache deleted file mode 100644 index 213b5dbc9..000000000 --- a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/customize.mustache +++ /dev/null @@ -1,393 +0,0 @@ - -
    -
    -

    {{_i}}Customize and download{{/i}}

    -

    {{_i}}Download Bootstrap or customize variables, components, JavaScript plugins, and more.{{/i}}

    -
    -
    - - -
    - - -
    - -
    - - - -
    -
    - -
    -
    -

    {{_i}}Scaffolding{{/i}}

    - - - - -

    {{_i}}Base CSS{{/i}}

    - - - - - - - -
    -
    -

    {{_i}}Components{{/i}}

    - - - - - - - - - - - -

    {{_i}}JS Components{{/i}}

    - - - - - - -
    -
    -

    {{_i}}Miscellaneous{{/i}}

    - - - - -

    {{_i}}Responsive{{/i}}

    - - - - - -
    -
    -
    - -
    - -
    -
    - - - - - - - -
    -
    - - - - - - -
    -
    -

    {{_i}}Heads up!{{/i}}

    -

    {{_i}}All checked plugins will be compiled into a single file, bootstrap.js. All plugins require the latest version of jQuery to be included.{{/i}}

    -
    -
    -
    - - -
    - -
    -
    -

    {{_i}}Scaffolding{{/i}}

    - - - - - -

    {{_i}}Links{{/i}}

    - - - - -

    {{_i}}Colors{{/i}}

    - - - - - - - - - - - - - - - -

    {{_i}}Sprites{{/i}}

    - - - - - -

    {{_i}}Grid system{{/i}}

    - - - - - - - - - - - - - - - -
    -
    - -

    {{_i}}Typography{{/i}}

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    {{_i}}Tables{{/i}}

    - - - - - - - - - -

    {{_i}}Forms{{/i}}

    - - - - - - - - - - - - - - - - - -
    -
    - -

    {{_i}}Form states & alerts{{/i}}

    - - - - - - - - - - - - - - - - - -

    {{_i}}Navbar{{/i}}

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    {{_i}}Dropdowns{{/i}}

    - - - - - - - - - - -
    -
    -
    - -
    - -
    - {{_i}}Customize and Download{{/i}} -

    {{_i}}What's included?{{/i}}

    -

    {{_i}}Downloads include compiled CSS, compiled and minified CSS, and compiled jQuery plugins, all nicely packed up into a zipball for your convenience.{{/i}}

    -
    -
    -
    - - - -
    {{! /span9 }} -
    {{! row}} - -
    {{! /.container }} diff --git a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/extend.mustache b/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/extend.mustache deleted file mode 100644 index 5f7dc8c5c..000000000 --- a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/extend.mustache +++ /dev/null @@ -1,161 +0,0 @@ - -
    -
    -

    {{_i}}Extending Bootstrap{{/i}}

    -

    {{_i}}Extend Bootstrap to take advantage of included styles and components, as well as LESS variables and mixins.{{/i}}

    -
    -
    - -
    - - -
    - -
    - - - - -
    - - - LESS CSS -

    {{_i}}Bootstrap is made with LESS at its core, a dynamic stylesheet language created by our good friend, Alexis Sellier. It makes developing systems-based CSS faster, easier, and more fun.{{/i}}

    - -

    {{_i}}Why LESS?{{/i}}

    -

    {{_i}}One of Bootstrap's creators wrote a quick blog post about this, summarized here:{{/i}}

    -
      -
    • {{_i}}Bootstrap compiles faster ~6x faster with Less compared to Sass{{/i}}
    • -
    • {{_i}}Less is written in JavaScript, making it easier to us to dive in and patch compared to Ruby with Sass.{{/i}}
    • -
    • {{_i}}Less is more; we want to feel like we're writing CSS and making Bootstrap approachable to all.{{/i}}
    • -
    - -

    {{_i}}What's included?{{/i}}

    -

    {{_i}}As an extension of CSS, LESS includes variables, mixins for reusable snippets of code, operations for simple math, nesting, and even color functions.{{/i}}

    - -

    {{_i}}Learn more{{/i}}

    -

    {{_i}}Visit the official website at http://lesscss.org to learn more.{{/i}}

    -
    - - - - -
    - - -

    {{_i}}Since our CSS is written with Less and utilizes variables and mixins, it needs to be compiled for final production implementation. Here's how.{{/i}}

    - -
    - {{_i}}Note: If you're submitting a pull request to GitHub with modified CSS, you must recompile the CSS via any of these methods.{{/i}} -
    - -

    {{_i}}Tools for compiling{{/i}}

    - -

    {{_i}}Command line{{/i}}

    -

    {{_i}}Follow the instructions in the project readme on GitHub for compiling via command line.{{/i}}

    - -

    {{_i}}JavaScript{{/i}}

    -

    {{_i}}Download the latest Less.js and include the path to it (and Bootstrap) in the <head>.{{/i}}

    -
    -<link rel="stylesheet/less" href="/path/to/bootstrap.less">
    -<script src="/path/to/less.js"></script>
    -
    -

    {{_i}}To recompile the .less files, just save them and reload your page. Less.js compiles them and stores them in local storage.{{/i}}

    - -

    {{_i}}Unofficial Mac app{{/i}}

    -

    {{_i}}The unofficial Mac app watches directories of .less files and compiles the code to local files after every save of a watched .less file. If you like, you can toggle preferences in the app for automatic minifying and which directory the compiled files end up in.{{/i}}

    - -

    {{_i}}More apps{{/i}}

    -

    Crunch

    -

    {{_i}}Crunch is a great looking LESS editor and compiler built on Adobe Air.{{/i}}

    -

    CodeKit

    -

    {{_i}}Created by the same guy as the unofficial Mac app, CodeKit is a Mac app that compiles LESS, SASS, Stylus, and CoffeeScript.{{/i}}

    -

    Simpless

    -

    {{_i}}Mac, Linux, and Windows app for drag and drop compiling of LESS files. Plus, the source code is on GitHub.{{/i}}

    - -
    - - - - -
    - -

    {{_i}}Quickly start any web project by dropping in the compiled or minified CSS and JS. Layer on custom styles separately for easy upgrades and maintenance moving forward.{{/i}}

    - -

    {{_i}}Setup file structure{{/i}}

    -

    {{_i}}Download the latest compiled Bootstrap and place into your project. For example, you might have something like this:{{/i}}

    -
    -   app/
    -       layouts/
    -       templates/
    -   public/
    -       css/
    -           bootstrap.min.css
    -       js/
    -           bootstrap.min.js
    -       img/
    -           glyphicons-halflings.png
    -           glyphicons-halflings-white.png
    -
    - -

    {{_i}}Utilize starter template{{/i}}

    -

    {{_i}}Copy the following base HTML to get started.{{/i}}

    -
    -<html>
    -  <head>
    -    <title>Bootstrap 101 Template</title>
    -    <!-- Bootstrap -->
    -    <link href="public/css/bootstrap.min.css" rel="stylesheet">
    -  </head>
    -  <body>
    -    <h1>Hello, world!</h1>
    -    <!-- Bootstrap -->
    -    <script src="public/js/bootstrap.min.js"></script>
    -  </body>
    -</html>
    -
    - -

    {{_i}}Layer on custom code{{/i}}

    -

    {{_i}}Work in your custom CSS, JS, and more as necessary to make Bootstrap your own with your own separate CSS and JS files.{{/i}}

    -
    -<html>
    -  <head>
    -    <title>Bootstrap 101 Template</title>
    -    <!-- Bootstrap -->
    -    <link href="public/css/bootstrap.min.css" rel="stylesheet">
    -    <!-- Project -->
    -    <link href="public/css/application.css" rel="stylesheet">
    -  </head>
    -  <body>
    -    <h1>Hello, world!</h1>
    -    <!-- Bootstrap -->
    -    <script src="public/js/bootstrap.min.js"></script>
    -    <!-- Project -->
    -    <script src="public/js/application.js"></script>
    -  </body>
    -</html>
    -
    - -
    - -
    {{! /span9 }} -
    {{! row}} - -
    {{! /.container }} diff --git a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/getting-started.mustache b/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/getting-started.mustache deleted file mode 100644 index 32d61f74a..000000000 --- a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/getting-started.mustache +++ /dev/null @@ -1,256 +0,0 @@ - -
    -
    -

    {{_i}}Getting started{{/i}}

    -

    {{_i}}Overview of the project, its contents, and how to get started with a simple template.{{/i}}

    -
    -
    - - -
    - - -
    - -
    - - - - -
    - -

    {{_i}}Before downloading, be sure to have a code editor (we recommend Sublime Text 2) and some working knowledge of HTML and CSS. We won't walk through the source files here, but they are available for download. We'll focus on getting started with the compiled Bootstrap files.{{/i}}

    - -
    -
    -

    {{_i}}Download compiled{{/i}}

    -

    {{_i}}Fastest way to get started: get the compiled and minified versions of our CSS, JS, and images. No docs or original source files.{{/i}}

    -

    {{_i}}Download Bootstrap{{/i}}

    -
    -
    -

    Download source

    -

    Get the original files for all CSS and JavaScript, along with a local copy of the docs by downloading the latest version directly from GitHub.

    -

    {{_i}}Download Bootstrap source{{/i}}

    -
    -
    -
    - - - - -
    - -

    {{_i}}Within the download you'll find the following file structure and contents, logically grouping common assets and providing both compiled and minified variations.{{/i}}

    -

    {{_i}}Once downloaded, unzip the compressed folder to see the structure of (the compiled) Bootstrap. You'll see something like this:{{/i}}

    -
    -  bootstrap/
    -  ├── css/
    -  │   ├── bootstrap.css
    -  │   ├── bootstrap.min.css
    -  ├── js/
    -  │   ├── bootstrap.js
    -  │   ├── bootstrap.min.js
    -  └── img/
    -      ├── glyphicons-halflings.png
    -      └── glyphicons-halflings-white.png
    -
    -

    {{_i}}This is the most basic form of Bootstrap: compiled files for quick drop-in usage in nearly any web project. We provide compiled CSS and JS (bootstrap.*), as well as compiled and minified CSS and JS (bootstrap.min.*). The image files are compressed using ImageOptim, a Mac app for compressing PNGs.{{/i}}

    -

    {{_i}}Please note that all JavaScript plugins require jQuery to be included.{{/i}}

    -
    - - - - -
    - -

    {{_i}}Bootstrap comes equipped with HTML, CSS, and JS for all sorts of things, but they can be summarized with a handful of categories visible at the top of the Bootstrap documentation.{{/i}}

    - -

    {{_i}}Docs sections{{/i}}

    -

    {{_i}}Scaffolding{{/i}}

    -

    {{_i}}Global styles for the body to reset type and background, link styles, grid system, and two simple layouts.{{/i}}

    -

    {{_i}}Base CSS{{/i}}

    -

    {{_i}}Styles for common HTML elements like typography, code, tables, forms, and buttons. Also includes Glyphicons, a great little icon set.{{/i}}

    -

    {{_i}}Components{{/i}}

    -

    {{_i}}Basic styles for common interface components like tabs and pills, navbar, alerts, page headers, and more.{{/i}}

    -

    {{_i}}JavaScript plugins{{/i}}

    -

    {{_i}}Similar to Components, these JavaScript plugins are interactive components for things like tooltips, popovers, modals, and more.{{/i}}

    - -

    {{_i}}List of components{{/i}}

    -

    {{_i}}Together, the Components and JavaScript plugins sections provide the following interface elements:{{/i}}

    -
      -
    • {{_i}}Button groups{{/i}}
    • -
    • {{_i}}Button dropdowns{{/i}}
    • -
    • {{_i}}Navigational tabs, pills, and lists{{/i}}
    • -
    • {{_i}}Navbar{{/i}}
    • -
    • {{_i}}Labels{{/i}}
    • -
    • {{_i}}Badges{{/i}}
    • -
    • {{_i}}Page headers and hero unit{{/i}}
    • -
    • {{_i}}Thumbnails{{/i}}
    • -
    • {{_i}}Alerts{{/i}}
    • -
    • {{_i}}Progress bars{{/i}}
    • -
    • {{_i}}Modals{{/i}}
    • -
    • {{_i}}Dropdowns{{/i}}
    • -
    • {{_i}}Tooltips{{/i}}
    • -
    • {{_i}}Popovers{{/i}}
    • -
    • {{_i}}Accordion{{/i}}
    • -
    • {{_i}}Carousel{{/i}}
    • -
    • {{_i}}Typeahead{{/i}}
    • -
    -

    {{_i}}In future guides, we may walk through these components individually in more detail. Until then, look for each of these in the documentation for information on how to utilize and customize them.{{/i}}

    -
    - - - - -
    - -

    {{_i}}With a brief intro into the contents out of the way, we can focus on putting Bootstrap to use. To do that, we'll utilize a basic HTML template that includes everything we mentioned in the File structure.{{/i}}

    -

    {{_i}}Now, here's a look at a typical HTML file:{{/i}}

    -
    -<!DOCTYPE html>
    -<html>
    -  <head>
    -    <title>Bootstrap 101 Template</title>
    -    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    -  </head>
    -  <body>
    -    <h1>Hello, world!</h1>
    -    <script src="http://code.jquery.com/jquery.js"></script>
    -  </body>
    -</html>
    -
    -

    {{_i}}To make this a Bootstrapped template, just include the appropriate CSS and JS files:{{/i}}

    -
    -<!DOCTYPE html>
    -<html>
    -  <head>
    -    <title>Bootstrap 101 Template</title>
    -    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    -    <!-- Bootstrap -->
    -    <link href="css/bootstrap.min.css" rel="stylesheet" media="screen">
    -  </head>
    -  <body>
    -    <h1>Hello, world!</h1>
    -    <script src="http://code.jquery.com/jquery.js"></script>
    -    <script src="js/bootstrap.min.js"></script>
    -  </body>
    -</html>
    -
    -

    {{_i}}And you're set! With those two files added, you can begin to develop any site or application with Bootstrap.{{/i}}

    -
    - - - - -
    - -

    {{_i}}Move beyond the base template with a few example layouts. We encourage folks to iterate on these examples and not simply use them as an end result.{{/i}}

    -
      -
    • - - - -

      {{_i}}Starter template{{/i}}

      -

      {{_i}}A barebones HTML document with all the Bootstrap CSS and JavaScript included.{{/i}}

      -
    • -
    • - - - -

      {{_i}}Basic marketing site{{/i}}

      -

      {{_i}}Featuring a hero unit for a primary message and three supporting elements.{{/i}}

      -
    • -
    • - - - -

      {{_i}}Fluid layout{{/i}}

      -

      {{_i}}Uses our new responsive, fluid grid system to create a seamless liquid layout.{{/i}}

      -
    • - -
    • - - - -

      {{_i}}Narrow marketing{{/i}}

      -

      {{_i}}Slim, lightweight marketing template for small projects or teams.{{/i}}

      -
    • -
    • - - - -

      {{_i}}Justified nav{{/i}}

      -

      {{_i}}Marketing page with equal-width navigation links in a modified navbar.{{/i}}

      -
    • -
    • - - - -

      {{_i}}Sign in{{/i}}

      -

      {{_i}}Barebones sign in form with custom, larger form controls and a flexible layout.{{/i}}

      -
    • - -
    • - - - -

      {{_i}}Sticky footer{{/i}}

      -

      {{_i}}Pin a fixed-height footer to the bottom of the user's viewport.{{/i}}

      -
    • -
    • - - - -

      {{_i}}Carousel jumbotron{{/i}}

      -

      {{_i}}A more interactive riff on the basic marketing site featuring a prominent carousel.{{/i}}

      -
    • -
    -
    - - - - - -
    - -

    {{_i}}Head to the docs for information, examples, and code snippets, or take the next leap and customize Bootstrap for any upcoming project.{{/i}}

    - {{_i}}Visit the Bootstrap docs{{/i}} - {{_i}}Customize Bootstrap{{/i}} -
    - - - - -
    {{! /span9 }} -
    {{! row}} - -
    {{! /.container }} diff --git a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/index.mustache b/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/index.mustache deleted file mode 100644 index 4fb7f1cb0..000000000 --- a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/index.mustache +++ /dev/null @@ -1,100 +0,0 @@ -
    -
    -

    {{_i}}Bootstrap{{/i}}

    -

    {{_i}}Sleek, intuitive, and powerful front-end framework for faster and easier web development.{{/i}}

    -

    - {{_i}}Download Bootstrap{{/i}} -

    - -
    -
    - -
    -
    - -
    -
    - -
    - -
    - -

    {{_i}}Introducing Bootstrap.{{/i}}

    - - -
    -
    - -

    {{_i}}By nerds, for nerds.{{/i}}

    -

    {{_i}}Built at Twitter by @mdo and @fat, Bootstrap utilizes LESS CSS, is compiled via Node, and is managed through GitHub to help nerds do awesome stuff on the web.{{/i}}

    -
    -
    - -

    {{_i}}Made for everyone.{{/i}}

    -

    {{_i}}Bootstrap was made to not only look and behave great in the latest desktop browsers (as well as IE7!), but in tablet and smartphone browsers via responsive CSS as well.{{/i}}

    -
    -
    - -

    {{_i}}Packed with features.{{/i}}

    -

    {{_i}}A 12-column responsive grid, dozens of components, JavaScript plugins, typography, form controls, and even a web-based Customizer to make Bootstrap your own.{{/i}}

    -
    -
    - -
    - -

    {{_i}}Built with Bootstrap.{{/i}}

    - -
    - -
    - -
    {{! /.marketing }} - -
    {{! /.container }} diff --git a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/javascript.mustache b/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/javascript.mustache deleted file mode 100644 index 2b16c9401..000000000 --- a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/javascript.mustache +++ /dev/null @@ -1,1660 +0,0 @@ - -
    -
    -

    {{_i}}JavaScript{{/i}}

    -

    {{_i}}Bring Bootstrap's components to life—now with 13 custom jQuery plugins.{{/i}} -

    -
    - -
    - - -
    - -
    - - - -
    - - -

    {{_i}}Individual or compiled{{/i}}

    -

    {{_i}}Plugins can be included individually (though some have required dependencies), or all at once. Both bootstrap.js and bootstrap.min.js contain all plugins in a single file.{{/i}}

    - -

    {{_i}}Data attributes{{/i}}

    -

    {{_i}}You can use all Bootstrap plugins purely through the markup API without writing a single line of JavaScript. This is Bootstrap's first class API and should be your first consideration when using a plugin.{{/i}}

    - -

    {{_i}}That said, in some situations it may be desirable to turn this functionality off. Therefore, we also provide the ability to disable the data attribute API by unbinding all events on the body namespaced with `'data-api'`. This looks like this:{{/i}} -

    $('body').off('.data-api')
    - -

    {{_i}}Alternatively, to target a specific plugin, just include the plugin's name as a namespace along with the data-api namespace like this:{{/i}}

    -
    $('body').off('.alert.data-api')
    - -

    {{_i}}Programmatic API{{/i}}

    -

    {{_i}}We also believe you should be able to use all Bootstrap plugins purely through the JavaScript API. All public APIs are single, chainable methods, and return the collection acted upon.{{/i}}

    -
    $(".btn.danger").button("toggle").addClass("fat")
    -

    {{_i}}All methods should accept an optional options object, a string which targets a particular method, or nothing (which initiates a plugin with default behavior):{{/i}}

    -
    -$("#myModal").modal()                       // initialized with defaults
    -$("#myModal").modal({ keyboard: false })   // initialized with no keyboard
    -$("#myModal").modal('show')                // initializes and invokes show immediately

    -
    -

    {{_i}}Each plugin also exposes its raw constructor on a `Constructor` property: $.fn.popover.Constructor. If you'd like to get a particular plugin instance, retrieve it directly from an element: $('[rel=popover]').data('popover').{{/i}}

    - -

    {{_i}}No Conflict{{/i}}

    -

    {{_i}}Sometimes it is necessary to use Bootstrap plugins with other UI frameworks. In these circumstances, namespace collisions can occasionally occur. If this happens, you may call .noConflict on the plugin you wish to revert the value of.{{/i}}

    - -
    -var bootstrapButton = $.fn.button.noConflict() // return $.fn.button to previously assigned value
    -$.fn.bootstrapBtn = bootstrapButton            // give $().bootstrapBtn the bootstrap functionality
    -
    - -

    {{_i}}Events{{/i}}

    -

    {{_i}}Bootstrap provides custom events for most plugin's unique actions. Generally, these come in an infinitive and past participle form - where the infinitive (ex. show) is triggered at the start of an event, and its past participle form (ex. shown) is trigger on the completion of an action.{{/i}}

    -

    {{_i}}All infinitive events provide preventDefault functionality. This provides the ability to stop the execution of an action before it starts.{{/i}}

    -
    -$('#myModal').on('show', function (e) {
    -    if (!data) return e.preventDefault() // stops modal from being shown
    -})
    -
    -
    - - - - -
    - -

    {{_i}}About transitions{{/i}}

    -

    {{_i}}For simple transition effects, include bootstrap-transition.js once alongside the other JS files. If you're using the compiled (or minified) bootstrap.js, there is no need to include this—it's already there.{{/i}}

    -

    {{_i}}Use cases{{/i}}

    -

    {{_i}}A few examples of the transition plugin:{{/i}}

    -
      -
    • {{_i}}Sliding or fading in modals{{/i}}
    • -
    • {{_i}}Fading out tabs{{/i}}
    • -
    • {{_i}}Fading out alerts{{/i}}
    • -
    • {{_i}}Sliding carousel panes{{/i}}
    • -
    - - {{! Ideas: include docs for .fade.in, .slide.in, etc }} -
    - - - - -
    - - - -

    {{_i}}Examples{{/i}}

    -

    {{_i}}Modals are streamlined, but flexible, dialog prompts with the minimum required functionality and smart defaults.{{/i}}

    - -

    {{_i}}Static example{{/i}}

    -

    {{_i}}A rendered modal with header, body, and set of actions in the footer.{{/i}}

    -
    - -
    {{! /example }} -
    -<div class="modal hide fade">
    -  <div class="modal-header">
    -    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
    -    <h3>{{_i}}Modal header{{/i}}</h3>
    -  </div>
    -  <div class="modal-body">
    -    <p>{{_i}}One fine body…{{/i}}</p>
    -  </div>
    -  <div class="modal-footer">
    -    <a href="#" class="btn">{{_i}}Close{{/i}}</a>
    -    <a href="#" class="btn btn-primary">{{_i}}Save changes{{/i}}</a>
    -  </div>
    -</div>
    -
    - -

    {{_i}}Live demo{{/i}}

    -

    {{_i}}Toggle a modal via JavaScript by clicking the button below. It will slide down and fade in from the top of the page.{{/i}}

    - - - {{! /example }} -
    -<!-- Button to trigger modal -->
    -<a href="#myModal" role="button" class="btn" data-toggle="modal">{{_i}}Launch demo modal{{/i}}</a>
    -
    -<!-- Modal -->
    -<div id="myModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    -  <div class="modal-header">
    -    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
    -    <h3 id="myModalLabel">Modal header</h3>
    -  </div>
    -  <div class="modal-body">
    -    <p>{{_i}}One fine body…{{/i}}</p>
    -  </div>
    -  <div class="modal-footer">
    -    <button class="btn" data-dismiss="modal" aria-hidden="true">{{_i}}Close{{/i}}</button>
    -    <button class="btn btn-primary">{{_i}}Save changes{{/i}}</button>
    -  </div>
    -</div>
    -
    - - -
    - - -

    {{_i}}Usage{{/i}}

    - -

    {{_i}}Via data attributes{{/i}}

    -

    {{_i}}Activate a modal without writing JavaScript. Set data-toggle="modal" on a controller element, like a button, along with a data-target="#foo" or href="#foo" to target a specific modal to toggle.{{/i}}

    -
    <button type="button" data-toggle="modal" data-target="#myModal">Launch modal</button>
    - -

    {{_i}}Via JavaScript{{/i}}

    -

    {{_i}}Call a modal with id myModal with a single line of JavaScript:{{/i}}

    -
    $('#myModal').modal(options)
    - -

    {{_i}}Options{{/i}}

    -

    {{_i}}Options can be passed via data attributes or JavaScript. For data attributes, append the option name to data-, as in data-backdrop="".{{/i}}

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{_i}}Name{{/i}}{{_i}}type{{/i}}{{_i}}default{{/i}}{{_i}}description{{/i}}
    {{_i}}backdrop{{/i}}{{_i}}boolean{{/i}}{{_i}}true{{/i}}{{_i}}Includes a modal-backdrop element. Alternatively, specify static for a backdrop which doesn't close the modal on click.{{/i}}
    {{_i}}keyboard{{/i}}{{_i}}boolean{{/i}}{{_i}}true{{/i}}{{_i}}Closes the modal when escape key is pressed{{/i}}
    {{_i}}show{{/i}}{{_i}}boolean{{/i}}{{_i}}true{{/i}}{{_i}}Shows the modal when initialized.{{/i}}
    {{_i}}remote{{/i}}{{_i}}path{{/i}}{{_i}}false{{/i}}

    {{_i}}If a remote url is provided, content will be loaded via jQuery's load method and injected into the .modal-body. If you're using the data api, you may alternatively use the href tag to specify the remote source. An example of this is shown below:{{/i}}

    -
    <a data-toggle="modal" href="remote.html" data-target="#modal">click me</a>
    - - Methods{{/i}} -

    .modal({{_i}}options{{/i}})

    -

    {{_i}}Activates your content as a modal. Accepts an optional options object.{{/i}}

    -
    -$('#myModal').modal({
    -  keyboard: false
    -})
    -
    -

    .modal('toggle')

    -

    {{_i}}Manually toggles a modal.{{/i}}

    -
    $('#myModal').modal('toggle')
    -

    .modal('show')

    -

    {{_i}}Manually opens a modal.{{/i}}

    -
    $('#myModal').modal('show')
    -

    .modal('hide')

    -

    {{_i}}Manually hides a modal.{{/i}}

    -
    $('#myModal').modal('hide')
    -

    {{_i}}Events{{/i}}

    -

    {{_i}}Bootstrap's modal class exposes a few events for hooking into modal functionality.{{/i}}

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{_i}}Event{{/i}}{{_i}}Description{{/i}}
    {{_i}}show{{/i}}{{_i}}This event fires immediately when the show instance method is called.{{/i}}
    {{_i}}shown{{/i}}{{_i}}This event is fired when the modal has been made visible to the user (will wait for css transitions to complete).{{/i}}
    {{_i}}hide{{/i}}{{_i}}This event is fired immediately when the hide instance method has been called.{{/i}}
    {{_i}}hidden{{/i}}{{_i}}This event is fired when the modal has finished being hidden from the user (will wait for css transitions to complete).{{/i}}
    -
    -$('#myModal').on('hidden', function () {
    -  // {{_i}}do something…{{/i}}
    -})
    -
    -
    - - - - - - - - - -
    - - - -

    {{_i}}Example in navbar{{/i}}

    -

    {{_i}}The ScrollSpy plugin is for automatically updating nav targets based on scroll position. Scroll the area below the navbar and watch the active class change. The dropdown sub items will be highlighted as well.{{/i}}

    -
    - -
    -

    @fat

    -

    Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.

    -

    @mdo

    -

    Veniam marfa mustache skateboard, adipisicing fugiat velit pitchfork beard. Freegan beard aliqua cupidatat mcsweeney's vero. Cupidatat four loko nisi, ea helvetica nulla carles. Tattooed cosby sweater food truck, mcsweeney's quis non freegan vinyl. Lo-fi wes anderson +1 sartorial. Carles non aesthetic exercitation quis gentrify. Brooklyn adipisicing craft beer vice keytar deserunt.

    -

    one

    -

    Occaecat commodo aliqua delectus. Fap craft beer deserunt skateboard ea. Lomo bicycle rights adipisicing banh mi, velit ea sunt next level locavore single-origin coffee in magna veniam. High life id vinyl, echo park consequat quis aliquip banh mi pitchfork. Vero VHS est adipisicing. Consectetur nisi DIY minim messenger bag. Cred ex in, sustainable delectus consectetur fanny pack iphone.

    -

    two

    -

    In incididunt echo park, officia deserunt mcsweeney's proident master cleanse thundercats sapiente veniam. Excepteur VHS elit, proident shoreditch +1 biodiesel laborum craft beer. Single-origin coffee wayfarers irure four loko, cupidatat terry richardson master cleanse. Assumenda you probably haven't heard of them art party fanny pack, tattooed nulla cardigan tempor ad. Proident wolf nesciunt sartorial keffiyeh eu banh mi sustainable. Elit wolf voluptate, lo-fi ea portland before they sold out four loko. Locavore enim nostrud mlkshk brooklyn nesciunt.

    -

    three

    -

    Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.

    -

    Keytar twee blog, culpa messenger bag marfa whatever delectus food truck. Sapiente synth id assumenda. Locavore sed helvetica cliche irony, thundercats you probably haven't heard of them consequat hoodie gluten-free lo-fi fap aliquip. Labore elit placeat before they sold out, terry richardson proident brunch nesciunt quis cosby sweater pariatur keffiyeh ut helvetica artisan. Cardigan craft beer seitan readymade velit. VHS chambray laboris tempor veniam. Anim mollit minim commodo ullamco thundercats. -

    -
    -
    {{! /example }} - - -
    - - -

    {{_i}}Usage{{/i}}

    - -

    {{_i}}Via data attributes{{/i}}

    -

    {{_i}}To easily add scrollspy behavior to your topbar navigation, just add data-spy="scroll" to the element you want to spy on (most typically this would be the body) and data-target=".navbar" to select which nav to use. You'll want to use scrollspy with a .nav component.{{/i}}

    -
    <body data-spy="scroll" data-target=".navbar">...</body>
    - -

    {{_i}}Via JavaScript{{/i}}

    -

    {{_i}}Call the scrollspy via JavaScript:{{/i}}

    -
    $('#navbar').scrollspy()
    - -
    - {{_i}}Heads up!{{/i}} - {{_i}}Navbar links must have resolvable id targets. For example, a <a href="#home">home</a> must correspond to something in the dom like <div id="home"></div>.{{/i}} -
    - -

    {{_i}}Methods{{/i}}

    -

    .scrollspy('refresh')

    -

    {{_i}}When using scrollspy in conjunction with adding or removing of elements from the DOM, you'll need to call the refresh method like so:{{/i}}

    -
    -$('[data-spy="scroll"]').each(function () {
    -  var $spy = $(this).scrollspy('refresh')
    -});
    -
    - -

    {{_i}}Options{{/i}}

    -

    {{_i}}Options can be passed via data attributes or JavaScript. For data attributes, append the option name to data-, as in data-offset="".{{/i}}

    - - - - - - - - - - - - - - - - - -
    {{_i}}Name{{/i}}{{_i}}type{{/i}}{{_i}}default{{/i}}{{_i}}description{{/i}}
    {{_i}}offset{{/i}}{{_i}}number{{/i}}{{_i}}10{{/i}}{{_i}}Pixels to offset from top when calculating position of scroll.{{/i}}
    - -

    {{_i}}Events{{/i}}

    - - - - - - - - - - - - - -
    {{_i}}Event{{/i}}{{_i}}Description{{/i}}
    {{_i}}activate{{/i}}{{_i}}This event fires whenever a new item becomes activated by the scrollspy.{{/i}}
    -
    - - - - -
    - - - -

    {{_i}}Example tabs{{/i}}

    -

    {{_i}}Add quick, dynamic tab functionality to transition through panes of local content, even via dropdown menus.{{/i}}

    -
    - -
    -
    -

    Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.

    -
    -
    -

    Food truck fixie locavore, accusamus mcsweeney's marfa nulla single-origin coffee squid. Exercitation +1 labore velit, blog sartorial PBR leggings next level wes anderson artisan four loko farm-to-table craft beer twee. Qui photo booth letterpress, commodo enim craft beer mlkshk aliquip jean shorts ullamco ad vinyl cillum PBR. Homo nostrud organic, assumenda labore aesthetic magna delectus mollit. Keytar helvetica VHS salvia yr, vero magna velit sapiente labore stumptown. Vegan fanny pack odio cillum wes anderson 8-bit, sustainable jean shorts beard ut DIY ethical culpa terry richardson biodiesel. Art party scenester stumptown, tumblr butcher vero sint qui sapiente accusamus tattooed echo park.

    -
    - - -
    -
    {{! /example }} - - -
    - - -

    {{_i}}Usage{{/i}}

    -

    {{_i}}Enable tabbable tabs via JavaScript (each tab needs to be activated individually):{{/i}}

    -
    -$('#myTab a').click(function (e) {
    -  e.preventDefault();
    -  $(this).tab('show');
    -})
    -

    {{_i}}You can activate individual tabs in several ways:{{/i}}

    -
    -$('#myTab a[href="#profile"]').tab('show'); // Select tab by name
    -$('#myTab a:first').tab('show'); // Select first tab
    -$('#myTab a:last').tab('show'); // Select last tab
    -$('#myTab li:eq(2) a').tab('show'); // Select third tab (0-indexed)
    -
    - -

    {{_i}}Markup{{/i}}

    -

    {{_i}}You can activate a tab or pill navigation without writing any JavaScript by simply specifying data-toggle="tab" or data-toggle="pill" on an element. Adding the nav and nav-tabs classes to the tab ul will apply the Bootstrap tab styling.{{/i}}

    -
    -<ul class="nav nav-tabs">
    -  <li><a href="#home" data-toggle="tab">{{_i}}Home{{/i}}</a></li>
    -  <li><a href="#profile" data-toggle="tab">{{_i}}Profile{{/i}}</a></li>
    -  <li><a href="#messages" data-toggle="tab">{{_i}}Messages{{/i}}</a></li>
    -  <li><a href="#settings" data-toggle="tab">{{_i}}Settings{{/i}}</a></li>
    -</ul>
    - -

    {{_i}}Methods{{/i}}

    -

    $().tab

    -

    - {{_i}}Activates a tab element and content container. Tab should have either a data-target or an href targeting a container node in the DOM.{{/i}} -

    -
    -<ul class="nav nav-tabs" id="myTab">
    -  <li class="active"><a href="#home">{{_i}}Home{{/i}}</a></li>
    -  <li><a href="#profile">{{_i}}Profile{{/i}}</a></li>
    -  <li><a href="#messages">{{_i}}Messages{{/i}}</a></li>
    -  <li><a href="#settings">{{_i}}Settings{{/i}}</a></li>
    -</ul>
    -
    -<div class="tab-content">
    -  <div class="tab-pane active" id="home">...</div>
    -  <div class="tab-pane" id="profile">...</div>
    -  <div class="tab-pane" id="messages">...</div>
    -  <div class="tab-pane" id="settings">...</div>
    -</div>
    -
    -<script>
    -  $(function () {
    -    $('#myTab a:last').tab('show');
    -  })
    -</script>
    -
    - -

    {{_i}}Events{{/i}}

    - - - - - - - - - - - - - - - - - -
    {{_i}}Event{{/i}}{{_i}}Description{{/i}}
    {{_i}}show{{/i}}{{_i}}This event fires on tab show, but before the new tab has been shown. Use event.target and event.relatedTarget to target the active tab and the previous active tab (if available) respectively.{{/i}}
    {{_i}}shown{{/i}}{{_i}}This event fires on tab show after a tab has been shown. Use event.target and event.relatedTarget to target the active tab and the previous active tab (if available) respectively.{{/i}}
    -
    -$('a[data-toggle="tab"]').on('shown', function (e) {
    -  e.target // activated tab
    -  e.relatedTarget // previous tab
    -})
    -
    -
    - - - -
    - - - -

    {{_i}}Examples{{/i}}

    -

    {{_i}}Inspired by the excellent jQuery.tipsy plugin written by Jason Frame; Tooltips are an updated version, which don't rely on images, use CSS3 for animations, and data-attributes for local title storage.{{/i}}

    -

    {{_i}}For performance reasons, the tooltip and popover data-apis are opt in, meaning you must initialize them yourself.{{/i}}

    -

    {{_i}}Hover over the links below to see tooltips:{{/i}}

    -
    -

    {{_i}}Tight pants next level keffiyeh you probably haven't heard of them. Photo booth beard raw denim letterpress vegan messenger bag stumptown. Farm-to-table seitan, mcsweeney's fixie sustainable quinoa 8-bit american apparel have a terry richardson vinyl chambray. Beard stumptown, cardigans banh mi lomo thundercats. Tofu biodiesel williamsburg marfa, four loko mcsweeney's cleanse vegan chambray. A really ironic artisan whatever keytar, scenester farm-to-table banksy Austin twitter handle freegan cred raw denim single-origin coffee viral.{{/i}} -

    -
    {{! /example }} - -

    {{_i}}Four directions{{/i}}

    - {{! /example }} - - -

    {{_i}}Tooltips in input groups{{/i}}

    -

    {{_i}}When using tooltips and popovers with the Bootstrap input groups, you'll have to set the container (documented below) option to avoid unwanted side effects.{{/i}}

    - -
    - - -

    {{_i}}Usage{{/i}}

    -

    {{_i}}Trigger the tooltip via JavaScript:{{/i}}

    -
    $('#example').tooltip({{_i}}options{{/i}})
    - -

    {{_i}}Options{{/i}}

    -

    {{_i}}Options can be passed via data attributes or JavaScript. For data attributes, append the option name to data-, as in data-animation="".{{/i}}

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{_i}}Name{{/i}}{{_i}}type{{/i}}{{_i}}default{{/i}}{{_i}}description{{/i}}
    {{_i}}animation{{/i}}{{_i}}boolean{{/i}}true{{_i}}apply a css fade transition to the tooltip{{/i}}
    {{_i}}html{{/i}}{{_i}}boolean{{/i}}false{{_i}}Insert html into the tooltip. If false, jquery's text method will be used to insert content into the dom. Use text if you're worried about XSS attacks.{{/i}}
    {{_i}}placement{{/i}}{{_i}}string | function{{/i}}'top'{{_i}}how to position the tooltip{{/i}} - top | bottom | left | right
    {{_i}}selector{{/i}}{{_i}}string{{/i}}false{{_i}}If a selector is provided, tooltip objects will be delegated to the specified targets.{{/i}}
    {{_i}}title{{/i}}{{_i}}string | function{{/i}}''{{_i}}default title value if `title` tag isn't present{{/i}}
    {{_i}}trigger{{/i}}{{_i}}string{{/i}}'hover focus'{{_i}}how tooltip is triggered{{/i}} - click | hover | focus | manual. {{_i}}Note you case pass trigger mutliple, space seperated, trigger types.{{/i}}
    {{_i}}delay{{/i}}{{_i}}number | object{{/i}}0 -

    {{_i}}delay showing and hiding the tooltip (ms) - does not apply to manual trigger type{{/i}}

    -

    {{_i}}If a number is supplied, delay is applied to both hide/show{{/i}}

    -

    {{_i}}Object structure is: delay: { show: 500, hide: 100 }{{/i}}

    -
    {{_i}}container{{/i}}{{_i}}string | false{{/i}}{{_i}}false{{/i}} -

    {{_i}}Appends the tooltip to a specific element container: 'body'{{/i}}

    -
    -
    - {{_i}}Heads up!{{/i}} - {{_i}}Options for individual tooltips can alternatively be specified through the use of data attributes.{{/i}} -
    - -

    {{_i}}Markup{{/i}}

    -
    <a href="#" data-toggle="tooltip" title="{{_i}}first tooltip{{/i}}">{{_i}}hover over me{{/i}}</a>
    - -

    {{_i}}Methods{{/i}}

    -

    $().tooltip({{_i}}options{{/i}})

    -

    {{_i}}Attaches a tooltip handler to an element collection.{{/i}}

    -

    .tooltip('show')

    -

    {{_i}}Reveals an element's tooltip.{{/i}}

    -
    $('#element').tooltip('show')
    -

    .tooltip('hide')

    -

    {{_i}}Hides an element's tooltip.{{/i}}

    -
    $('#element').tooltip('hide')
    -

    .tooltip('toggle')

    -

    {{_i}}Toggles an element's tooltip.{{/i}}

    -
    $('#element').tooltip('toggle')
    -

    .tooltip('destroy')

    -

    {{_i}}Hides and destroys an element's tooltip.{{/i}}

    -
    $('#element').tooltip('destroy')
    -
    - - - - -
    - - -

    {{_i}}Examples{{/i}}

    -

    {{_i}}Add small overlays of content, like those on the iPad, to any element for housing secondary information. Hover over the button to trigger the popover. Requires Tooltip to be included.{{/i}}

    - -

    {{_i}}Static popover{{/i}}

    -

    {{_i}}Four options are available: top, right, bottom, and left aligned.{{/i}}

    -
    -
    -
    -

    Popover top

    -
    -

    Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

    -
    -
    - -
    -
    -

    Popover right

    -
    -

    Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

    -
    -
    - -
    -
    -

    Popover bottom

    -
    -

    Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

    -
    -
    - -
    -
    -

    Popover left

    -
    -

    Sed posuere consectetur est at lobortis. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

    -
    -
    - -
    -
    -

    {{_i}}No markup shown as popovers are generated from JavaScript and content within a data attribute.{{/i}}

    - -

    Live demo

    - - -

    {{_i}}Four directions{{/i}}

    - {{! /example }} - - -
    - - -

    {{_i}}Usage{{/i}}

    -

    {{_i}}Enable popovers via JavaScript:{{/i}}

    -
    $('#example').popover({{_i}}options{{/i}})
    - -

    {{_i}}Options{{/i}}

    -

    {{_i}}Options can be passed via data attributes or JavaScript. For data attributes, append the option name to data-, as in data-animation="".{{/i}}

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{_i}}Name{{/i}}{{_i}}type{{/i}}{{_i}}default{{/i}}{{_i}}description{{/i}}
    {{_i}}animation{{/i}}{{_i}}boolean{{/i}}true{{_i}}apply a css fade transition to the tooltip{{/i}}
    {{_i}}html{{/i}}{{_i}}boolean{{/i}}false{{_i}}Insert html into the popover. If false, jquery's text method will be used to insert content into the dom. Use text if you're worried about XSS attacks.{{/i}}
    {{_i}}placement{{/i}}{{_i}}string | function{{/i}}'right'{{_i}}how to position the popover{{/i}} - top | bottom | left | right
    {{_i}}selector{{/i}}{{_i}}string{{/i}}false{{_i}}if a selector is provided, tooltip objects will be delegated to the specified targets{{/i}}
    {{_i}}trigger{{/i}}{{_i}}string{{/i}}'click'{{_i}}how popover is triggered{{/i}} - click | hover | focus | manual
    {{_i}}title{{/i}}{{_i}}string | function{{/i}}''{{_i}}default title value if `title` attribute isn't present{{/i}}
    {{_i}}content{{/i}}{{_i}}string | function{{/i}}''{{_i}}default content value if `data-content` attribute isn't present{{/i}}
    {{_i}}delay{{/i}}{{_i}}number | object{{/i}}0 -

    {{_i}}delay showing and hiding the popover (ms) - does not apply to manual trigger type{{/i}}

    -

    {{_i}}If a number is supplied, delay is applied to both hide/show{{/i}}

    -

    {{_i}}Object structure is: delay: { show: 500, hide: 100 }{{/i}}

    -
    {{_i}}container{{/i}}{{_i}}string | false{{/i}}{{_i}}false{{/i}} -

    {{_i}}Appends the popover to a specific element container: 'body'{{/i}}

    -
    -
    - {{_i}}Heads up!{{/i}} - {{_i}}Options for individual popovers can alternatively be specified through the use of data attributes.{{/i}} -
    - -

    {{_i}}Markup{{/i}}

    -

    {{_i}}For performance reasons, the Tooltip and Popover data-apis are opt in. If you would like to use them just specify a selector option.{{/i}}

    - -

    {{_i}}Methods{{/i}}

    -

    $().popover({{_i}}options{{/i}})

    -

    {{_i}}Initializes popovers for an element collection.{{/i}}

    -

    .popover('show')

    -

    {{_i}}Reveals an elements popover.{{/i}}

    -
    $('#element').popover('show')
    -

    .popover('hide')

    -

    {{_i}}Hides an elements popover.{{/i}}

    -
    $('#element').popover('hide')
    -

    .popover('toggle')

    -

    {{_i}}Toggles an elements popover.{{/i}}

    -
    $('#element').popover('toggle')
    -

    .popover('destroy')

    -

    {{_i}}Hides and destroys an element's popover.{{/i}}

    -
    $('#element').popover('destroy')
    -
    - - - - -
    - - - -

    {{_i}}Example alerts{{/i}}

    -

    {{_i}}Add dismiss functionality to all alert messages with this plugin.{{/i}}

    -
    -
    - - {{_i}}Holy guacamole!{{/i}} {{_i}}Best check yo self, you're not looking too good.{{/i}} -
    -
    {{! /example }} - -
    -
    - -

    {{_i}}Oh snap! You got an error!{{/i}}

    -

    {{_i}}Change this and that and try again. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cras mattis consectetur purus sit amet fermentum.{{/i}}

    -

    - {{_i}}Take this action{{/i}} {{_i}}Or do this{{/i}} -

    -
    -
    {{! /example }} - - -
    - - -

    {{_i}}Usage{{/i}}

    -

    {{_i}}Enable dismissal of an alert via JavaScript:{{/i}}

    -
    $(".alert").alert()
    - -

    {{_i}}Markup{{/i}}

    -

    {{_i}}Just add data-dismiss="alert" to your close button to automatically give an alert close functionality.{{/i}}

    -
    <a class="close" data-dismiss="alert" href="#">&times;</a>
    - -

    {{_i}}Methods{{/i}}

    -

    $().alert()

    -

    {{_i}}Wraps all alerts with close functionality. To have your alerts animate out when closed, make sure they have the .fade and .in class already applied to them.{{/i}}

    -

    .alert('close')

    -

    {{_i}}Closes an alert.{{/i}}

    -
    $(".alert").alert('close')
    - - -

    {{_i}}Events{{/i}}

    -

    {{_i}}Bootstrap's alert class exposes a few events for hooking into alert functionality.{{/i}}

    - - - - - - - - - - - - - - - - - -
    {{_i}}Event{{/i}}{{_i}}Description{{/i}}
    {{_i}}close{{/i}}{{_i}}This event fires immediately when the close instance method is called.{{/i}}
    {{_i}}closed{{/i}}{{_i}}This event is fired when the alert has been closed (will wait for css transitions to complete).{{/i}}
    -
    -$('#my-alert').bind('closed', function () {
    -  // {{_i}}do something…{{/i}}
    -})
    -
    -
    - - - - -
    - - -

    {{_i}}Example uses{{/i}}

    -

    {{_i}}Do more with buttons. Control button states or create groups of buttons for more components like toolbars.{{/i}}

    - -

    {{_i}}Stateful{{/i}}

    -

    {{_i}}Add data-loading-text="Loading..." to use a loading state on a button.{{/i}}

    -
    - -
    {{! /example }} -
    <button type="button" class="btn btn-primary" data-loading-text="Loading...">Loading state</button>
    - -

    {{_i}}Single toggle{{/i}}

    -

    {{_i}}Add data-toggle="button" to activate toggling on a single button.{{/i}}

    -
    - -
    {{! /example }} -
    <button type="button" class="btn btn-primary" data-toggle="button">Single Toggle</button>
    - -

    {{_i}}Checkbox{{/i}}

    -

    {{_i}}Add data-toggle="buttons-checkbox" for checkbox style toggling on btn-group.{{/i}}

    -
    -
    - - - -
    -
    {{! /example }} -
    -<div class="btn-group" data-toggle="buttons-checkbox">
    -  <button type="button" class="btn btn-primary">Left</button>
    -  <button type="button" class="btn btn-primary">Middle</button>
    -  <button type="button" class="btn btn-primary">Right</button>
    -</div>
    -
    - -

    {{_i}}Radio{{/i}}

    -

    {{_i}}Add data-toggle="buttons-radio" for radio style toggling on btn-group.{{/i}}

    -
    -
    - - - -
    -
    {{! /example }} -
    -<div class="btn-group" data-toggle="buttons-radio">
    -  <button type="button" class="btn btn-primary">Left</button>
    -  <button type="button" class="btn btn-primary">Middle</button>
    -  <button type="button" class="btn btn-primary">Right</button>
    -</div>
    -
    - - -
    - - -

    {{_i}}Usage{{/i}}

    -

    {{_i}}Enable buttons via JavaScript:{{/i}}

    -
    $('.nav-tabs').button()
    - -

    {{_i}}Markup{{/i}}

    -

    {{_i}}Data attributes are integral to the button plugin. Check out the example code below for the various markup types.{{/i}}

    - -

    {{_i}}Options{{/i}}

    -

    {{_i}}None{{/i}}

    - -

    {{_i}}Methods{{/i}}

    -

    $().button('toggle')

    -

    {{_i}}Toggles push state. Gives the button the appearance that it has been activated.{{/i}}

    -
    - {{_i}}Heads up!{{/i}} - {{_i}}You can enable auto toggling of a button by using the data-toggle attribute.{{/i}} -
    -
    <button type="button" class="btn" data-toggle="button" >…</button>
    -

    $().button('loading')

    -

    {{_i}}Sets button state to loading - disables button and swaps text to loading text. Loading text should be defined on the button element using the data attribute data-loading-text.{{/i}} -

    -
    <button type="button" class="btn" data-loading-text="loading stuff..." >...</button>
    -
    - {{_i}}Heads up!{{/i}} - {{_i}}Firefox persists the disabled state across page loads. A workaround for this is to use autocomplete="off".{{/i}} -
    -

    $().button('reset')

    -

    {{_i}}Resets button state - swaps text to original text.{{/i}}

    -

    $().button(string)

    -

    {{_i}}Resets button state - swaps text to any data defined text state.{{/i}}

    -
    <button type="button" class="btn" data-complete-text="finished!" >...</button>
    -<script>
    -  $('.btn').button('complete')
    -</script>
    -
    -
    - - - - -
    - - -

    {{_i}}About{{/i}}

    -

    {{_i}}Get base styles and flexible support for collapsible components like accordions and navigation.{{/i}}

    -

    * {{_i}}Requires the Transitions plugin to be included.{{/i}}

    - -

    {{_i}}Example accordion{{/i}}

    -

    {{_i}}Using the collapse plugin, we built a simple accordion style widget:{{/i}}

    - -
    -
    -
    - -
    -
    - Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. -
    -
    -
    -
    - -
    -
    - Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. -
    -
    -
    -
    - -
    -
    - Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. -
    -
    -
    -
    -
    {{! /example }} -
    -<div class="accordion" id="accordion2">
    -  <div class="accordion-group">
    -    <div class="accordion-heading">
    -      <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion2" href="#collapseOne">
    -        {{_i}}Collapsible Group Item #1{{/i}}
    -      </a>
    -    </div>
    -    <div id="collapseOne" class="accordion-body collapse in">
    -      <div class="accordion-inner">
    -        Anim pariatur cliche...
    -      </div>
    -    </div>
    -  </div>
    -  <div class="accordion-group">
    -    <div class="accordion-heading">
    -      <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion2" href="#collapseTwo">
    -        {{_i}}Collapsible Group Item #2{{/i}}
    -      </a>
    -    </div>
    -    <div id="collapseTwo" class="accordion-body collapse">
    -      <div class="accordion-inner">
    -        Anim pariatur cliche...
    -      </div>
    -    </div>
    -  </div>
    -</div>
    -...
    -
    -

    {{_i}}You can also use the plugin without the accordion markup. Make a button toggle the expanding and collapsing of another element.{{/i}}

    -
    -<button type="button" class="btn btn-danger" data-toggle="collapse" data-target="#demo">
    -  {{_i}}simple collapsible{{/i}}
    -</button>
    -
    -<div id="demo" class="collapse in"> … </div>
    -
    - - -
    - - -

    {{_i}}Usage{{/i}}

    - -

    {{_i}}Via data attributes{{/i}}

    -

    {{_i}}Just add data-toggle="collapse" and a data-target to element to automatically assign control of a collapsible element. The data-target attribute accepts a css selector to apply the collapse to. Be sure to add the class collapse to the collapsible element. If you'd like it to default open, add the additional class in.{{/i}}

    -

    {{_i}}To add accordion-like group management to a collapsible control, add the data attribute data-parent="#selector". Refer to the demo to see this in action.{{/i}}

    - -

    {{_i}}Via JavaScript{{/i}}

    -

    {{_i}}Enable manually with:{{/i}}

    -
    $(".collapse").collapse()
    - -

    {{_i}}Options{{/i}}

    -

    {{_i}}Options can be passed via data attributes or JavaScript. For data attributes, append the option name to data-, as in data-parent="".{{/i}}

    - - - - - - - - - - - - - - - - - - - - - - - -
    {{_i}}Name{{/i}}{{_i}}type{{/i}}{{_i}}default{{/i}}{{_i}}description{{/i}}
    {{_i}}parent{{/i}}{{_i}}selector{{/i}}false{{_i}}If selector then all collapsible elements under the specified parent will be closed when this collapsible item is shown. (similar to traditional accordion behavior){{/i}}
    {{_i}}toggle{{/i}}{{_i}}boolean{{/i}}true{{_i}}Toggles the collapsible element on invocation{{/i}}
    - - -

    {{_i}}Methods{{/i}}

    -

    .collapse({{_i}}options{{/i}})

    -

    {{_i}}Activates your content as a collapsible element. Accepts an optional options object.{{/i}} -

    -$('#myCollapsible').collapse({
    -  toggle: false
    -})
    -
    -

    .collapse('toggle')

    -

    {{_i}}Toggles a collapsible element to shown or hidden.{{/i}}

    -

    .collapse('show')

    -

    {{_i}}Shows a collapsible element.{{/i}}

    -

    .collapse('hide')

    -

    {{_i}}Hides a collapsible element.{{/i}}

    - -

    {{_i}}Events{{/i}}

    -

    {{_i}}Bootstrap's collapse class exposes a few events for hooking into collapse functionality.{{/i}}

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{_i}}Event{{/i}}{{_i}}Description{{/i}}
    {{_i}}show{{/i}}{{_i}}This event fires immediately when the show instance method is called.{{/i}}
    {{_i}}shown{{/i}}{{_i}}This event is fired when a collapse element has been made visible to the user (will wait for css transitions to complete).{{/i}}
    {{_i}}hide{{/i}} - {{_i}}This event is fired immediately when the hide method has been called.{{/i}} -
    {{_i}}hidden{{/i}}{{_i}}This event is fired when a collapse element has been hidden from the user (will wait for css transitions to complete).{{/i}}
    -
    -$('#myCollapsible').on('hidden', function () {
    -  // {{_i}}do something…{{/i}}
    -})
    -
    - - - - - - - - - -
    - - - -

    {{_i}}Example{{/i}}

    -

    {{_i}}A basic, easily extended plugin for quickly creating elegant typeaheads with any form text input.{{/i}}

    -
    - -
    {{! /example }} -
    <input type="text" data-provide="typeahead">
    -

    You'll want to set autocomplete="off" to prevent default browser menus from appearing over the Bootstrap typeahead dropdown.

    - -
    - - -

    {{_i}}Usage{{/i}}

    - -

    {{_i}}Via data attributes{{/i}}

    -

    {{_i}}Add data attributes to register an element with typeahead functionality as shown in the example above.{{/i}}

    - -

    {{_i}}Via JavaScript{{/i}}

    -

    {{_i}}Call the typeahead manually with:{{/i}}

    -
    $('.typeahead').typeahead()
    - -

    {{_i}}Options{{/i}}

    -

    {{_i}}Options can be passed via data attributes or JavaScript. For data attributes, append the option name to data-, as in data-source="".{{/i}}

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{_i}}Name{{/i}}{{_i}}type{{/i}}{{_i}}default{{/i}}{{_i}}description{{/i}}
    {{_i}}source{{/i}}{{_i}}array, function{{/i}}[ ]{{_i}}The data source to query against. May be an array of strings or a function. The function is passed two arguments, the query value in the input field and the process callback. The function may be used synchronously by returning the data source directly or asynchronously via the process callback's single argument.{{/i}}
    {{_i}}items{{/i}}{{_i}}number{{/i}}8{{_i}}The max number of items to display in the dropdown.{{/i}}
    {{_i}}minLength{{/i}}{{_i}}number{{/i}}{{_i}}1{{/i}}{{_i}}The minimum character length needed before triggering autocomplete suggestions{{/i}}
    {{_i}}matcher{{/i}}{{_i}}function{{/i}}{{_i}}case insensitive{{/i}}{{_i}}The method used to determine if a query matches an item. Accepts a single argument, the item against which to test the query. Access the current query with this.query. Return a boolean true if query is a match.{{/i}}
    {{_i}}sorter{{/i}}{{_i}}function{{/i}}{{_i}}exact match,
    case sensitive,
    case insensitive{{/i}}
    {{_i}}Method used to sort autocomplete results. Accepts a single argument items and has the scope of the typeahead instance. Reference the current query with this.query.{{/i}}
    {{_i}}updater{{/i}}{{_i}}function{{/i}}{{_i}}returns selected item{{/i}}{{_i}}The method used to return selected item. Accepts a single argument, the item and has the scope of the typeahead instance.{{/i}}
    {{_i}}highlighter{{/i}}{{_i}}function{{/i}}{{_i}}highlights all default matches{{/i}}{{_i}}Method used to highlight autocomplete results. Accepts a single argument item and has the scope of the typeahead instance. Should return html.{{/i}}
    - -

    {{_i}}Methods{{/i}}

    -

    .typeahead({{_i}}options{{/i}})

    -

    {{_i}}Initializes an input with a typeahead.{{/i}}

    -
    - - - - -
    - - -

    {{_i}}Example{{/i}}

    -

    {{_i}}The subnavigation on the left is a live demo of the affix plugin.{{/i}}

    - -
    - -

    {{_i}}Usage{{/i}}

    - -

    {{_i}}Via data attributes{{/i}}

    -

    {{_i}}To easily add affix behavior to any element, just add data-spy="affix" to the element you want to spy on. Then use offsets to define when to toggle the pinning of an element on and off.{{/i}}

    - -
    <div data-spy="affix" data-offset-top="200">...</div>
    - -
    - {{_i}}Heads up!{{/i}} - {{_i}}You must manage the position of a pinned element and the behavior of its immediate parent. Position is controlled by affix, affix-top, and affix-bottom. Remember to check for a potentially collapsed parent when the affix kicks in as it's removing content from the normal flow of the page.{{/i}} -
    - -

    {{_i}}Via JavaScript{{/i}}

    -

    {{_i}}Call the affix plugin via JavaScript:{{/i}}

    -
    $('#navbar').affix()
    - -

    {{_i}}Options{{/i}}

    -

    {{_i}}Options can be passed via data attributes or JavaScript. For data attributes, append the option name to data-, as in data-offset-top="200".{{/i}}

    - - - - - - - - - - - - - - - - - -
    {{_i}}Name{{/i}}{{_i}}type{{/i}}{{_i}}default{{/i}}{{_i}}description{{/i}}
    {{_i}}offset{{/i}}{{_i}}number | function | object{{/i}}{{_i}}10{{/i}}{{_i}}Pixels to offset from screen when calculating position of scroll. If a single number is provided, the offset will be applied in both top and left directions. To listen for a single direction, or multiple unique offsets, just provide an object offset: { x: 10 }. Use a function when you need to dynamically provide an offset (useful for some responsive designs).{{/i}}
    -
    - - - -
    {{! /span9 }} -
    {{! row}} - -
    {{! /.container }} diff --git a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/scaffolding.mustache b/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/scaffolding.mustache deleted file mode 100644 index a6f2f9dac..000000000 --- a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/docs/templates/pages/scaffolding.mustache +++ /dev/null @@ -1,485 +0,0 @@ - -
    -
    -

    {{_i}}Scaffolding{{/i}}

    -

    {{_i}}Bootstrap is built on responsive 12-column grids, layouts, and components.{{/i}}

    -
    -
    - -
    - - -
    - -
    - - - - -
    - - -

    {{_i}}Requires HTML5 doctype{{/i}}

    -

    {{_i}}Bootstrap makes use of certain HTML elements and CSS properties that require the use of the HTML5 doctype. Include it at the beginning of all your projects.{{/i}}

    -
    -<!DOCTYPE html>
    -<html lang="en">
    -  ...
    -</html>
    -
    - -

    {{_i}}Typography and links{{/i}}

    -

    {{_i}}Bootstrap sets basic global display, typography, and link styles. Specifically, we:{{/i}}

    -
      -
    • {{_i}}Remove margin on the body{{/i}}
    • -
    • {{_i}}Set background-color: white; on the body{{/i}}
    • -
    • {{_i}}Use the @baseFontFamily, @baseFontSize, and @baseLineHeight attributes as our typographic base{{/i}}
    • -
    • {{_i}}Set the global link color via @linkColor and apply link underlines only on :hover{{/i}}
    • -
    -

    {{_i}}These styles can be found within scaffolding.less.{{/i}}

    - -

    {{_i}}Reset via Normalize{{/i}}

    -

    {{_i}}With Bootstrap 2, the old reset block has been dropped in favor of Normalize.css, a project by Nicolas Gallagher and Jonathan Neal that also powers the HTML5 Boilerplate. While we use much of Normalize within our reset.less, we have removed some elements specifically for Bootstrap.{{/i}}

    - -
    - - - - - -
    - - -

    {{_i}}Live grid example{{/i}}

    -

    {{_i}}The default Bootstrap grid system utilizes 12 columns, making for a 940px wide container without responsive features enabled. With the responsive CSS file added, the grid adapts to be 724px and 1170px wide depending on your viewport. Below 767px viewports, the columns become fluid and stack vertically.{{/i}}

    -
    -
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    -
    -
    2
    -
    3
    -
    4
    -
    -
    -
    4
    -
    5
    -
    -
    -
    9
    -
    -
    - -

    {{_i}}Basic grid HTML{{/i}}

    -

    {{_i}}For a simple two column layout, create a .row and add the appropriate number of .span* columns. As this is a 12-column grid, each .span* spans a number of those 12 columns, and should always add up to 12 for each row (or the number of columns in the parent).{{/i}}

    -
    -<div class="row">
    -  <div class="span4">...</div>
    -  <div class="span8">...</div>
    -</div>
    -
    -

    {{_i}}Given this example, we have .span4 and .span8, making for 12 total columns and a complete row.{{/i}}

    - -

    {{_i}}Offsetting columns{{/i}}

    -

    {{_i}}Move columns to the right using .offset* classes. Each class increases the left margin of a column by a whole column. For example, .offset4 moves .span4 over four columns.{{/i}}

    -
    -
    -
    4
    -
    3 offset 2
    -
    -
    -
    3 offset 1
    -
    3 offset 2
    -
    -
    -
    6 offset 3
    -
    -
    -
    -<div class="row">
    -  <div class="span4">...</div>
    -  <div class="span3 offset2">...</div>
    -</div>
    -
    - -

    {{_i}}Nesting columns{{/i}}

    -

    {{_i}}To nest your content with the default grid, add a new .row and set of .span* columns within an existing .span* column. Nested rows should include a set of columns that add up to the number of columns of its parent.{{/i}}

    -
    -
    - {{_i}}Level 1 column{{/i}} -
    -
    - {{_i}}Level 2{{/i}} -
    -
    - {{_i}}Level 2{{/i}} -
    -
    -
    -
    -
    -<div class="row">
    -  <div class="span9">
    -    {{_i}}Level 1 column{{/i}}
    -    <div class="row">
    -      <div class="span6">{{_i}}Level 2{{/i}}</div>
    -      <div class="span3">{{_i}}Level 2{{/i}}</div>
    -    </div>
    -  </div>
    -</div>
    -
    -
    - - - - -
    - - -

    {{_i}}Live fluid grid example{{/i}}

    -

    {{_i}}The fluid grid system uses percents instead of pixels for column widths. It has the same responsive capabilities as our fixed grid system, ensuring proper proportions for key screen resolutions and devices.{{/i}}

    -
    -
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    -
    -
    4
    -
    4
    -
    4
    -
    -
    -
    4
    -
    8
    -
    -
    -
    6
    -
    6
    -
    -
    -
    12
    -
    -
    - -

    {{_i}}Basic fluid grid HTML{{/i}}

    -

    {{_i}}Make any row "fluid" by changing .row to .row-fluid. The column classes stay the exact same, making it easy to flip between fixed and fluid grids.{{/i}}

    -
    -<div class="row-fluid">
    -  <div class="span4">...</div>
    -  <div class="span8">...</div>
    -</div>
    -
    - -

    {{_i}}Fluid offsetting{{/i}}

    -

    {{_i}}Operates the same way as the fixed grid system offsetting: add .offset* to any column to offset by that many columns.{{/i}}

    -
    -
    -
    4
    -
    4 offset 4
    -
    -
    -
    3 offset 3
    -
    3 offset 3
    -
    -
    -
    6 offset 6
    -
    -
    -
    -<div class="row-fluid">
    -  <div class="span4">...</div>
    -  <div class="span4 offset2">...</div>
    -</div>
    -
    - -

    {{_i}}Fluid nesting{{/i}}

    -

    {{_i}}Fluid grids utilize nesting differently: each nested level of columns should add up to 12 columns. This is because the fluid grid uses percentages, not pixels, for setting widths.{{/i}}

    -
    -
    - {{_i}}Fluid 12{{/i}} -
    -
    - {{_i}}Fluid 6{{/i}} -
    -
    - {{_i}}Fluid 6{{/i}} -
    -
    - {{_i}}Fluid 6{{/i}} -
    -
    -
    -
    - {{_i}}Fluid 6{{/i}} -
    -
    -
    -
    -
    -<div class="row-fluid">
    -  <div class="span12">
    -    {{_i}}Fluid 12{{/i}}
    -    <div class="row-fluid">
    -      <div class="span6">
    -        {{_i}}Fluid 6{{/i}}
    -        <div class="row-fluid">
    -          <div class="span6">{{_i}}Fluid 6{{/i}}</div>
    -          <div class="span6">{{_i}}Fluid 6{{/i}}</div>
    -        </div>
    -      </div>
    -      <div class="span6">{{_i}}Fluid 6{{/i}}</div>
    -    </div>
    -  </div>
    -</div>
    -
    - -
    - - - - - -
    - - -

    {{_i}}Fixed layout{{/i}}

    -

    {{_i}}Provides a common fixed-width (and optionally responsive) layout with only <div class="container"> required.{{/i}}

    -
    -
    -
    -
    -<body>
    -  <div class="container">
    -    ...
    -  </div>
    -</body>
    -
    - -

    {{_i}}Fluid layout{{/i}}

    -

    {{_i}}Create a fluid, two-column page with <div class="container-fluid">—great for applications and docs.{{/i}}

    -
    -
    -
    -
    -
    -<div class="container-fluid">
    -  <div class="row-fluid">
    -    <div class="span2">
    -      <!--{{_i}}Sidebar content{{/i}}-->
    -    </div>
    -    <div class="span10">
    -      <!--{{_i}}Body content{{/i}}-->
    -    </div>
    -  </div>
    -</div>
    -
    -
    - - - - - -
    - - - {{! Enabling }} -

    {{_i}}Enabling responsive features{{/i}}

    -

    {{_i}}Turn on responsive CSS in your project by including the proper meta tag and additional stylesheet within the <head> of your document. If you've compiled Bootstrap from the Customize page, you need only include the meta tag.{{/i}}

    -
    -<meta name="viewport" content="width=device-width, initial-scale=1.0">
    -<link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
    -
    -

    {{_i}}Heads up!{{/i}} {{_i}} Bootstrap doesn't include responsive features by default at this time as not everything needs to be responsive. Instead of encouraging developers to remove this feature, we figure it best to enable it as needed.{{/i}}

    - - {{! About }} -

    {{_i}}About responsive Bootstrap{{/i}}

    - Responsive devices -

    {{_i}}Media queries allow for custom CSS based on a number of conditions—ratios, widths, display type, etc—but usually focuses around min-width and max-width.{{/i}}

    -
      -
    • {{_i}}Modify the width of column in our grid{{/i}}
    • -
    • {{_i}}Stack elements instead of float wherever necessary{{/i}}
    • -
    • {{_i}}Resize headings and text to be more appropriate for devices{{/i}}
    • -
    -

    {{_i}}Use media queries responsibly and only as a start to your mobile audiences. For larger projects, do consider dedicated code bases and not layers of media queries.{{/i}}

    - - {{! Supported }} -

    {{_i}}Supported devices{{/i}}

    -

    {{_i}}Bootstrap supports a handful of media queries in a single file to help make your projects more appropriate on different devices and screen resolutions. Here's what's included:{{/i}}

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{_i}}Label{{/i}}{{_i}}Layout width{{/i}}{{_i}}Column width{{/i}}{{_i}}Gutter width{{/i}}
    {{_i}}Large display{{/i}}1200px and up70px30px
    {{_i}}Default{{/i}}980px and up60px20px
    {{_i}}Portrait tablets{{/i}}768px and above42px20px
    {{_i}}Phones to tablets{{/i}}767px and below{{_i}}Fluid columns, no fixed widths{{/i}}
    {{_i}}Phones{{/i}}480px and below{{_i}}Fluid columns, no fixed widths{{/i}}
    -
    -/* {{_i}}Large desktop{{/i}} */
    -@media (min-width: 1200px) { ... }
    -
    -/* {{_i}}Portrait tablet to landscape and desktop{{/i}} */
    -@media (min-width: 768px) and (max-width: 979px) { ... }
    -
    -/* {{_i}}Landscape phone to portrait tablet{{/i}} */
    -@media (max-width: 767px) { ... }
    -
    -/* {{_i}}Landscape phones and down{{/i}} */
    -@media (max-width: 480px) { ... }
    -
    - - - {{! Responsive utility classes }} -

    {{_i}}Responsive utility classes{{/i}}

    -

    {{_i}}For faster mobile-friendly development, use these utility classes for showing and hiding content by device. Below is a table of the available classes and their effect on a given media query layout (labeled by device). They can be found in responsive.less.{{/i}}

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{_i}}Class{{/i}}{{_i}}Phones 767px and below{{/i}}{{_i}}Tablets 979px to 768px{{/i}}{{_i}}Desktops Default{{/i}}
    .visible-phone{{_i}}Visible{{/i}}
    .visible-tablet{{_i}}Visible{{/i}}
    .visible-desktop{{_i}}Visible{{/i}}
    .hidden-phone{{_i}}Visible{{/i}}{{_i}}Visible{{/i}}
    .hidden-tablet{{_i}}Visible{{/i}}{{_i}}Visible{{/i}}
    .hidden-desktop{{_i}}Visible{{/i}}{{_i}}Visible{{/i}}
    - -

    {{_i}}When to use{{/i}}

    -

    {{_i}}Use on a limited basis and avoid creating entirely different versions of the same site. Instead, use them to complement each device's presentation. Responsive utilities should not be used with tables, and as such are not supported.{{/i}}

    - -

    {{_i}}Responsive utilities test case{{/i}}

    -

    {{_i}}Resize your browser or load on different devices to test the above classes.{{/i}}

    -

    {{_i}}Visible on...{{/i}}

    -

    {{_i}}Green checkmarks indicate that class is visible in your current viewport.{{/i}}

    -
      -
    • {{_i}}Phone{{/i}}✔ {{_i}}Phone{{/i}}
    • -
    • {{_i}}Tablet{{/i}}✔ {{_i}}Tablet{{/i}}
    • -
    • {{_i}}Desktop{{/i}}✔ {{_i}}Desktop{{/i}}
    • -
    -

    {{_i}}Hidden on...{{/i}}

    -

    {{_i}}Here, green checkmarks indicate that class is hidden in your current viewport.{{/i}}

    -
      -
    • {{_i}}Phone{{/i}}✔ {{_i}}Phone{{/i}}
    • -
    • {{_i}}Tablet{{/i}}✔ {{_i}}Tablet{{/i}}
    • -
    • {{_i}}Desktop{{/i}}✔ {{_i}}Desktop{{/i}}
    • -
    - -
    - - - -
    {{! /span9 }} -
    {{! row}} - -
    {{! /.container }} diff --git a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/img/glyphicons-halflings-white.png b/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/img/glyphicons-halflings-white.png deleted file mode 100644 index 3bf6484a2..000000000 Binary files a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/img/glyphicons-halflings-white.png and /dev/null differ diff --git a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/img/glyphicons-halflings.png b/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/img/glyphicons-halflings.png deleted file mode 100644 index a99699932..000000000 Binary files a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/img/glyphicons-halflings.png and /dev/null differ diff --git a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/js/.jshintrc b/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/js/.jshintrc deleted file mode 100644 index e0722690b..000000000 --- a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/js/.jshintrc +++ /dev/null @@ -1,12 +0,0 @@ -{ - "validthis": true, - "laxcomma" : true, - "laxbreak" : true, - "browser" : true, - "eqnull" : true, - "debug" : true, - "devel" : true, - "boss" : true, - "expr" : true, - "asi" : true -} \ No newline at end of file diff --git a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/js/bootstrap-affix.js b/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/js/bootstrap-affix.js deleted file mode 100644 index c1059a83e..000000000 --- a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/js/bootstrap-affix.js +++ /dev/null @@ -1,117 +0,0 @@ -/* ========================================================== - * bootstrap-affix.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#affix - * ========================================================== - * Copyright 2013 Twitter, Inc. - * - * 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. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* AFFIX CLASS DEFINITION - * ====================== */ - - var Affix = function (element, options) { - this.options = $.extend({}, $.fn.affix.defaults, options) - this.$window = $(window) - .on('scroll.affix.data-api', $.proxy(this.checkPosition, this)) - .on('click.affix.data-api', $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this)) - this.$element = $(element) - this.checkPosition() - } - - Affix.prototype.checkPosition = function () { - if (!this.$element.is(':visible')) return - - var scrollHeight = $(document).height() - , scrollTop = this.$window.scrollTop() - , position = this.$element.offset() - , offset = this.options.offset - , offsetBottom = offset.bottom - , offsetTop = offset.top - , reset = 'affix affix-top affix-bottom' - , affix - - if (typeof offset != 'object') offsetBottom = offsetTop = offset - if (typeof offsetTop == 'function') offsetTop = offset.top() - if (typeof offsetBottom == 'function') offsetBottom = offset.bottom() - - affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? - false : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? - 'bottom' : offsetTop != null && scrollTop <= offsetTop ? - 'top' : false - - if (this.affixed === affix) return - - this.affixed = affix - this.unpin = affix == 'bottom' ? position.top - scrollTop : null - - this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : '')) - } - - - /* AFFIX PLUGIN DEFINITION - * ======================= */ - - var old = $.fn.affix - - $.fn.affix = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('affix') - , options = typeof option == 'object' && option - if (!data) $this.data('affix', (data = new Affix(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.affix.Constructor = Affix - - $.fn.affix.defaults = { - offset: 0 - } - - - /* AFFIX NO CONFLICT - * ================= */ - - $.fn.affix.noConflict = function () { - $.fn.affix = old - return this - } - - - /* AFFIX DATA-API - * ============== */ - - $(window).on('load', function () { - $('[data-spy="affix"]').each(function () { - var $spy = $(this) - , data = $spy.data() - - data.offset = data.offset || {} - - data.offsetBottom && (data.offset.bottom = data.offsetBottom) - data.offsetTop && (data.offset.top = data.offsetTop) - - $spy.affix(data) - }) - }) - - -}(window.jQuery); \ No newline at end of file diff --git a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/js/bootstrap-alert.js b/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/js/bootstrap-alert.js deleted file mode 100644 index 9577e62de..000000000 --- a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/js/bootstrap-alert.js +++ /dev/null @@ -1,99 +0,0 @@ -/* ========================================================== - * bootstrap-alert.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#alerts - * ========================================================== - * Copyright 2013 Twitter, Inc. - * - * 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. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* ALERT CLASS DEFINITION - * ====================== */ - - var dismiss = '[data-dismiss="alert"]' - , Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.prototype.close = function (e) { - var $this = $(this) - , selector = $this.attr('data-target') - , $parent - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - - e && e.preventDefault() - - $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) - - $parent.trigger(e = $.Event('close')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - $parent - .trigger('closed') - .remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent.on($.support.transition.end, removeElement) : - removeElement() - } - - - /* ALERT PLUGIN DEFINITION - * ======================= */ - - var old = $.fn.alert - - $.fn.alert = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('alert') - if (!data) $this.data('alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.alert.Constructor = Alert - - - /* ALERT NO CONFLICT - * ================= */ - - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } - - - /* ALERT DATA-API - * ============== */ - - $(document).on('click.alert.data-api', dismiss, Alert.prototype.close) - -}(window.jQuery); \ No newline at end of file diff --git a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/js/bootstrap-button.js b/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/js/bootstrap-button.js deleted file mode 100644 index 4b2a90ab8..000000000 --- a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/js/bootstrap-button.js +++ /dev/null @@ -1,105 +0,0 @@ -/* ============================================================ - * bootstrap-button.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#buttons - * ============================================================ - * Copyright 2013 Twitter, Inc. - * - * 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. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* BUTTON PUBLIC CLASS DEFINITION - * ============================== */ - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.button.defaults, options) - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - , $el = this.$element - , data = $el.data() - , val = $el.is('input') ? 'val' : 'html' - - state = state + 'Text' - data.resetText || $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout(function () { - state == 'loadingText' ? - $el.addClass(d).attr(d, d) : - $el.removeClass(d).removeAttr(d) - }, 0) - } - - Button.prototype.toggle = function () { - var $parent = this.$element.closest('[data-toggle="buttons-radio"]') - - $parent && $parent - .find('.active') - .removeClass('active') - - this.$element.toggleClass('active') - } - - - /* BUTTON PLUGIN DEFINITION - * ======================== */ - - var old = $.fn.button - - $.fn.button = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('button') - , options = typeof option == 'object' && option - if (!data) $this.data('button', (data = new Button(this, options))) - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.defaults = { - loadingText: 'loading...' - } - - $.fn.button.Constructor = Button - - - /* BUTTON NO CONFLICT - * ================== */ - - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } - - - /* BUTTON DATA-API - * =============== */ - - $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - $btn.button('toggle') - }) - -}(window.jQuery); \ No newline at end of file diff --git a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/js/bootstrap-carousel.js b/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/js/bootstrap-carousel.js deleted file mode 100644 index c1e8ade8b..000000000 --- a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/js/bootstrap-carousel.js +++ /dev/null @@ -1,207 +0,0 @@ -/* ========================================================== - * bootstrap-carousel.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#carousel - * ========================================================== - * Copyright 2013 Twitter, Inc. - * - * 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. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* CAROUSEL CLASS DEFINITION - * ========================= */ - - var Carousel = function (element, options) { - this.$element = $(element) - this.$indicators = this.$element.find('.carousel-indicators') - this.options = options - this.options.pause == 'hover' && this.$element - .on('mouseenter', $.proxy(this.pause, this)) - .on('mouseleave', $.proxy(this.cycle, this)) - } - - Carousel.prototype = { - - cycle: function (e) { - if (!e) this.paused = false - if (this.interval) clearInterval(this.interval); - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - return this - } - - , getActiveIndex: function () { - this.$active = this.$element.find('.item.active') - this.$items = this.$active.parent().children() - return this.$items.index(this.$active) - } - - , to: function (pos) { - var activeIndex = this.getActiveIndex() - , that = this - - if (pos > (this.$items.length - 1) || pos < 0) return - - if (this.sliding) { - return this.$element.one('slid', function () { - that.to(pos) - }) - } - - if (activeIndex == pos) { - return this.pause().cycle() - } - - return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) - } - - , pause: function (e) { - if (!e) this.paused = true - if (this.$element.find('.next, .prev').length && $.support.transition.end) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - clearInterval(this.interval) - this.interval = null - return this - } - - , next: function () { - if (this.sliding) return - return this.slide('next') - } - - , prev: function () { - if (this.sliding) return - return this.slide('prev') - } - - , slide: function (type, next) { - var $active = this.$element.find('.item.active') - , $next = next || $active[type]() - , isCycling = this.interval - , direction = type == 'next' ? 'left' : 'right' - , fallback = type == 'next' ? 'first' : 'last' - , that = this - , e - - this.sliding = true - - isCycling && this.pause() - - $next = $next.length ? $next : this.$element.find('.item')[fallback]() - - e = $.Event('slide', { - relatedTarget: $next[0] - , direction: direction - }) - - if ($next.hasClass('active')) return - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - this.$element.one('slid', function () { - var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) - $nextIndicator && $nextIndicator.addClass('active') - }) - } - - if ($.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - this.$element.one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid') }, 0) - }) - } else { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid') - } - - isCycling && this.cycle() - - return this - } - - } - - - /* CAROUSEL PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.carousel - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('carousel') - , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) - , action = typeof option == 'string' ? option : options.slide - if (!data) $this.data('carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - $.fn.carousel.defaults = { - interval: 5000 - , pause: 'hover' - } - - $.fn.carousel.Constructor = Carousel - - - /* CAROUSEL NO CONFLICT - * ==================== */ - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - /* CAROUSEL DATA-API - * ================= */ - - $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { - var $this = $(this), href - , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - , options = $.extend({}, $target.data(), $this.data()) - , slideIndex - - $target.carousel(options) - - if (slideIndex = $this.attr('data-slide-to')) { - $target.data('carousel').pause().to(slideIndex).cycle() - } - - e.preventDefault() - }) - -}(window.jQuery); \ No newline at end of file diff --git a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/js/bootstrap-collapse.js b/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/js/bootstrap-collapse.js deleted file mode 100644 index ae3e4c63f..000000000 --- a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/js/bootstrap-collapse.js +++ /dev/null @@ -1,167 +0,0 @@ -/* ============================================================= - * bootstrap-collapse.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#collapse - * ============================================================= - * Copyright 2013 Twitter, Inc. - * - * 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. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* COLLAPSE PUBLIC CLASS DEFINITION - * ================================ */ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.collapse.defaults, options) - - if (this.options.parent) { - this.$parent = $(this.options.parent) - } - - this.options.toggle && this.toggle() - } - - Collapse.prototype = { - - constructor: Collapse - - , dimension: function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - , show: function () { - var dimension - , scroll - , actives - , hasData - - if (this.transitioning || this.$element.hasClass('in')) return - - dimension = this.dimension() - scroll = $.camelCase(['scroll', dimension].join('-')) - actives = this.$parent && this.$parent.find('> .accordion-group > .in') - - if (actives && actives.length) { - hasData = actives.data('collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('collapse', null) - } - - this.$element[dimension](0) - this.transition('addClass', $.Event('show'), 'shown') - $.support.transition && this.$element[dimension](this.$element[0][scroll]) - } - - , hide: function () { - var dimension - if (this.transitioning || !this.$element.hasClass('in')) return - dimension = this.dimension() - this.reset(this.$element[dimension]()) - this.transition('removeClass', $.Event('hide'), 'hidden') - this.$element[dimension](0) - } - - , reset: function (size) { - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - [dimension](size || 'auto') - [0].offsetWidth - - this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') - - return this - } - - , transition: function (method, startEvent, completeEvent) { - var that = this - , complete = function () { - if (startEvent.type == 'show') that.reset() - that.transitioning = 0 - that.$element.trigger(completeEvent) - } - - this.$element.trigger(startEvent) - - if (startEvent.isDefaultPrevented()) return - - this.transitioning = 1 - - this.$element[method]('in') - - $.support.transition && this.$element.hasClass('collapse') ? - this.$element.one($.support.transition.end, complete) : - complete() - } - - , toggle: function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - } - - - /* COLLAPSE PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.collapse - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('collapse') - , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) - if (!data) $this.data('collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.defaults = { - toggle: true - } - - $.fn.collapse.Constructor = Collapse - - - /* COLLAPSE NO CONFLICT - * ==================== */ - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - /* COLLAPSE DATA-API - * ================= */ - - $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { - var $this = $(this), href - , target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - , option = $(target).data('collapse') ? 'toggle' : $this.data() - $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - $(target).collapse(option) - }) - -}(window.jQuery); \ No newline at end of file diff --git a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/js/bootstrap-dropdown.js b/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/js/bootstrap-dropdown.js deleted file mode 100644 index d04da5d7b..000000000 --- a/web/src/main/webapp/components/bootstrap-timepicker/spec/js/libs/bootstrap/js/bootstrap-dropdown.js +++ /dev/null @@ -1,169 +0,0 @@ -/* ============================================================ - * bootstrap-dropdown.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#dropdowns - * ============================================================ - * Copyright 2013 Twitter, Inc. - * - * 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. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* DROPDOWN CLASS DEFINITION - * ========================= */ - - var toggle = '[data-toggle=dropdown]' - , Dropdown = function (element) { - var $el = $(element).on('click.dropdown.data-api', this.toggle) - $('html').on('click.dropdown.data-api', function () { - $el.parent().removeClass('open') - }) - } - - Dropdown.prototype = { - - constructor: Dropdown - - , toggle: function (e) { - var $this = $(this) - , $parent - , isActive - - if ($this.is('.disabled, :disabled')) return - - $parent = getParent($this) - - isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement) { - // if mobile we we use a backdrop because click events don't delegate - $('